1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Các bài tập lập trình bằng ngôn ngữ assembler

303 163 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 303
Dung lượng 29,8 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

12 CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ASSEMBLERChương trình con hiện nội dung có trong thanh ghi AX ra màn hình dạnh cơ số 2 ; Đưa nội dung số cần hiện từ AX vào BX ; Số lần Ịặp là 16

Trang 2

TS ĐẶNG THÀNH PHU

CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ÂSSEMBLER

NHÀ XUẤT BẢN KHOA HỌC VÀ KỸ THUẬT

HÀ N Ô I - 2001

Trang 3

Chịu trúi h nhiệm xuất hàn : PGS TS TÔ ĐÀNG HẢI

Trang 4

LỜI NÓI ĐẦU

Ngôn ngữ A ssem bler là ngồn ngữ bậc thấp, rất gần với ngôn ngữ máy và tất nhiên râì gán với {Aần cứng của máy tính Với đặc điểm như vậy nên lập trình bằng ngôn ngữ Assem bler có những đặc thù riêng có phán khác với ngôn ngữ bậc cao Những ngưòi bưóc đẩu làm quen với

A ssem bler thường thấy lúng túng Cuốn sách “ Cúc hài tập lập trình băng

n^ôn n^ữ A ssem hỉer ” là nối tiếp cuốn sách Turbo Assemhler vá irng dụn^ “ của chúng tôi nhằm giúp người lập trình làm quen với cách lập

trình bằng ngồn ngữ Assembler thông qua các bài tập cụ thể Trong mỏi bài tẠp, chúng tôi tiến hành theo ba bước : nêu yêu cẩu của bài tập; nói (ịua ý tưởng giải (thuật toán) và sau đó thể hiện chiromg trình (có kèm giải thích) Để có thể dể dàng hiểu và giải được các bài tập trong cuốn sách

này đòi hòi người lập trình cắn nắm vồng:

• Phần lý thuyết vể lập trình bằng ngôn ngữ Assembler, các cơ chế liên kết giữa ngôn ngữ bậc cao (C hoặc P a s c a l) với ngôn ngữ Assembler

• Cấu tróc m áy tính nói chung và máy vi tính nói riêng

• Cơ chế ngắt và các ngắt hệ thống (các ngắt của BIOS và EX)S )

Cuốn sách này được dành cho những người chuyên tin và tất cả những ai có nhu cầu tìm hiểu, sử dụng ngôn ngữ Assembler, đặc biệt là

những người đi sâu vào các hệ thống gần với ỹhẳn cứng, những người hoạt

động trong các ĩĩnh vực đo lưồ^g, điều khiển và những nguời ứng dụng tin híK: vào các quá trình công nghê

Các bài tập trong quyển sách này được sắp xếp theo hai phần :

Phán ì Cái hài tập phần sô họi

Nội dung chính của f^ần I là giải mội sô' bài tập í^' học thường gặp

Phdn // Cáí hải ĩập lién quan đếrt hệ thống

Nôi dung chính của phần II là giải một số bài tập liẽn quan đến hệ thống thông qua các ngắt cua BIOS và DOS

Tác giả xin chân thành cảm ơn Viện Công nghệ Thông tin thuộc Trung tâm Khoa học Tự nhiên và Công nghệ Ọuốc Gia đã tạo điểu kiện cho việc nghiên cứu và hoàn thành cuốn sách này Tác giả xin chân thành cảm ơn: PGS,TS Nguyẻn Văn Tam, KS Ngô Trần Anh, TS Đặng Văn Đức,

Trang 5

TS Vũ Như Lân và TS Vũ Chấn Hưng đã đọc bản thảo, cổ vũ và đóng góp nhiểu ý kiến để cuốn sách được ra mắt.

Hy vọng cuốn sách sẽ đáp ứng phần nằo nhu cầu của bạn đọc trong học tập, nghiên cứu cũng như ứng dụng ngôn ngữ Asseiĩibler vào các còng việc của mình

Mặc dù chúng tôi đã cố gắng sao cho cuốn sách được hoàn chỉnh, song chắc chắn khòng tránh khỏi sai sót Chúng tôi rất mong và xin chân

thành cảm ơn mọi ý kiến đóng góp của bạn đọc.

Hù Nội, tháng 9 năm 2001

TÁ C G IẢ

Trang 6

Phầnl

Trang 7

CHƯƠNG 1

TrưcK khi đi vào lập trình cụ thể cho các ví dụ, chúng ta hãy nhắc lại một

sô' phần cơ bản liên quan đến lập trình thuẩn túy Assem bler

1.1 CÁC BƯỚC TIẾN HÀNH MỘT CHƯƠNG TRÌNH ASSEMBLER

TRÊN MÁY TÍNH PC

Thường gồm bốn bước theo thứ tự sau:

1 Dùng một chương trình soạn thảo bất kỳ (ờ ch ế độ soạn thảo chưcmg trình - programming mode) để soạn thảo chương trình vì bản thân chương trình dịch Assem bler (TASM-Turbo Assem bler của Borland cũng như MASM của M icrosoít) không có môi trường soạn thảo như

TC hoặc TP Cán phải hết sức lưu ý ià tệp của chương trình khi cât giữ vào dĩa phải có đuởi ASM Ngôn ngữ A ssem bler thuần túy m ậc định không prfiân biệt chữ hoa và chữ thường,

2 Dịch chương trình Assembler, ví dụ như với chương trình dịch TASM (Turbo Assembler) thì theo cú pháp sau :

TASM í/option] SOURCEfile [.ASM] (có đuôi ASM) (, OBJfile (có

đuối OBJ)][, L s r n ie (có đuôi LST)]( XRFfi!e (có đuôi XRF)]

Chú ỷ: Khi dịch có sai vể cú pháp thì không tạo ra các tệp đuôi OBJ,

.LST và -XRF Cách báo của chương trình dịch khi dịch có l ỗ i :

**ERROR** lên_tệp.asm (số dòng lệnh có lỗi) : dang lỗi

V i dụ :

**E R R O R **vd.asm (19): Undefined Symbol : slcs

(có nghĩa là : dòng 19 của tệp vd.asm bị sai và lồi đó có thế là biến sỉcs chưa được xác lập- Ịchai báo)

3 Liên kết theo cú pháp sau :

TLINK l/option] OBJfile [,EXEfile (có đuôi EXE)! [, MAÍ>file (có

đuôi -MAP))I LlBHle (có đuôi LIB)1

Chú ỷ : Nếu khi liên kếl có lỗi thì không tạo ra các tệp đuôi EXE,

.M A P v à L lB

Trang 8

4 Chạy rhử chương trình và nếu có sai thì sửa Khi đã tạo được tệp OBJ

và EXE có nghĩa là vể cú pháp là đúng Song khi chạy chươtig trình có thể không cho kết quả như m ong muốn Điều đó có nghĩa là chương trình có thế bị sai vể thuật toán và chương trình dịch Turbo Assem bler

sẽ không phát hiện ra điểu này Loại sai này khó phát hiện hơn nhiều

so với loại sai vể cú pháp Người lập trình có thể dùng các chức nảng của Turbo DEBUG (TD) của Turbo A ssem bler hoặc DEBUG của DOS cùng với suy luận của thuật toán cũng như kinh nghiệm của người lập trình để tìm lỗi

Một vài ( hú V khi soạn ĩhảo và dịch chương trình :

1 Mỗi lệnh A ssem bler chiếm một dòng vói cú pháp tổng quát có dạng như sau ;

ỉdbelỊ [directive/instruction) [operandsỊ [; comment

2 Mặc định thì ngôn ngữ A ssem bler không phân biệl chữ hoa và chữ Ihưòmg Tất cả các chCr đéu hiểu như chữ hoa Muốn có sự [rfiân biệt chữ hoa và chữ thường trong các nhãn thì phải sử dụng tùy chọn khi dịch chương trình, đó là ;

TASM /ml cho íất cả mọi ký hiệu (symbol),

TASM /m x , cho các nhân âxiợc khai báo PUBLIC, EXTRN

hoặc GLOBAL-V Chương trình dịch TASM tìm các tệp INCLUDE như thế nào ?

• Nếu theo sau directìve (lệnh điẻu khiển khi dịch chương trình)

IN Q U D E có chi rõ tên ổ dĩa, đường dẫn, tên tệp thì lất nhèn chương trình dịch sẽ lìm theo sự xác định trên,

• Còn nếu iheo sau directive INCLUDE chỉ xấc định có tên tệp thôi thì chương Irình dịch sẽ tìm fệp đó ở thư mục hiện hành, nếu không thấy ĩhì sẽ tìm tên tệp ờ ổ đĩa, thư mục được xác lập bời tùy chọn-/ khi dịch chưcmg trình :

TASM -i tên_ổ_đĩa\tên_thư_mục chứồ tệp INCLUDE

1.2 CẨU TRÚC THƯỜNG THÂY CỦA MỘT CHƯƠNG TRÌNH THUẦN TÚY ASSEMBLER

V ề tổng thể cấu trúc của một chương trình thuần túy Assem bler thưỀBìg

c ó dạng sau :

Trang 9

8 CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ASSEMBLER

[ Phần khai báo MACRO, STRUC, RECORD và UNION 1 (nếu có)

Chú ý phần này có thể đặt chỗ khác song phải trước khi được sử dụng

Phần khai báo segm ent

kiểu độ ỉớn dup(? hoặc một giá trị)

tên sta ck seg m en t ends tên d a ta seg m en t segment

Khai báo biến

tên_data_segm ent ends tên c o d e se g m e n t segment

assume tên_thanh_ghi segment:

tẽn^segment (cách nhau bởi dấu,)

Nhãn:

mov AX,DATA mov DS,AX

thân chương trinh

2 Phẩn các chưcmg trình con có thể đặt ngay đầu phẩn code segment (trưóc Nhãn của chưomg trình) thay vì sau phần chương trình chính

Trang 10

Chương 1 Chương trinh thuẩn túy Assembler

Dùng chức nâng hiện một xâu ký tự kết thúc bằng dấu $ ra màn hình

Chức năng thứ 9 của hàm ngắt int 2 ìh của DOS cho phép chúng ta hiện

một xâu ký tự kết thúc bằng $ ra màn hình nếu DS:DX chứa địa chỉ SEG:OFFSET của biến xâu Do vậy chưcmg trình sc như sau (dùng khai báo segm ent dạng đơn giản) :

mov DX, Oh hSET Message DX chíồà phần đỊô chỉ Ohl-SET biến xâu

ỏ đày chúng ta đùng lệnh làm việc với xâu ký tự Q ìúng ta lần lượt đưa

từng ký tự của xâu vào thanh ghi AL và so sánh liệu ký tự đó có ỊÀìãi là 0

tuyệt đôi (ký tự kết thúc xâu) hay chưa? Nếu ký tự đúng ỉà giá trị 0 tuyệt đối thì kết thúc chương trình, còn không thì hiện ký tự đó ra màn hình-

Trang 11

10 CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ASSEMBLER

Chúng la dùng chức năng Oeh của hàm ngắ! inỉ ÌOh của BIOS để hiện

một ký tự nẳm trong thanh ghi AL (dạng A S Q l) ra m àn hình lại vị trí con trỏ đang đứng

Chương trình sẽ có dạng sau (dùng khai báo segm eni dạng chuẩn) :

_STACK segment stack ‘stack’

mov SI,OFFSET Message DS;Si trỏ đến ứiành phần đầu tiên củd xâu

Ll:

and AL.AL Dựhg cờ ZF để kiểm tra liệu đã là 0 chưa

mov AH,Oeh Chứt năng Oeh của hàm ngắt in í JOh của

Stop ;

Trang 12

Chutm g 1 Chương trình thuẩn túy Assem bler 11

1 M ACRO hiện một xâu ký tự kết thúc bằng $ ra màn hình có dạng sau:HienString MACRO xau

Bảo vệ nội dung hai thanh ghi vào ngăn xếp

Chức năng đưă xâu ký tự kết thúc bằng ký

tự $ ra màn hinh của hàm ngắt int 21 h

của DOSHồi phục nội dung hai thanh ghi

2 M ACRO hiện ĩTiột xâu ký tự kết thúc bằng \0 tuyệt đối (giống cấu trúc xâu trong ngôn ngữ C) ra màn hình sẽ như sau :

HienStringO MACRO xau

push AX SI

mov Sl.OhhSh I Message ; DS:SI trỏ đến thành phần đầu tiên ả ia xâu

L l:

and AL,AL ; Dựhg cờ Zero để kiểm tra liệu là 0 chxia ?

mov AH,Oeh ; Chức nấng Oeh của hàm ngắt iní lOh của

Stop;

pop SI AX

ENDM

Chúng ta có thể cất MACRO H ie n ^ rin g hoặc HìenStringO vào m ột tệp ví

dụ là LIBl ASM và dặt tại thư mục C:\1NCLUDE Khi cần chèn khối lệnh nằm trong tệp LIBl.ASM vào chỗ nào trong chương trình thì dùng lệnh điều khiển khi dịch chuơng trình (directive) INCLƯDE-

Thuật to á n :

Thanfi ghi AX chứa 16 bit dạng cơ sổ nhị phân (BINARY) Phải tiến hành hiên lần lượt giá trị từ bil cao đến bit thấp Do vậy chúng ta tiến hành quay trái 16 lần Môi lần quay thì bit cao nhất sẽ được đưa vào bit cờ

G íiry (CF) và tiến hành hiên giá trị bir đó lên màn hình bằng cách đưa giá trị bit cờ Carry (CF) vào thanh ghi AL nhò lệnh cộng có nhớ ADC và hiệu

chỉnh ra dạng A S Q I (cộng với ĨOh).

Trang 13

12 CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ASSEMBLER

Chương trình con hiện nội dung có trong

thanh ghi AX ra màn hình dạnh cơ số 2

; Đưa nội dung số cần hiện từ AX vào BX

; Số lần Ịặp là 16 được đưa vào CL

AL«0Đưa bit cao nhất vào cờ CF (Carry)Cộng nội dung AL với nội dụng bit cờ CF,

Trang 14

Chương 1 Chuơng trình thuẩn túy Assem bler 13

sau đó hiệu chỉnh ra dạng ASCII để hiện ra màn hình

hiện 4 bit thấp Chữ số HEXA sẽ từ 0 đến F (15), Trorig bảng mã ASCII

các ký tự 0 đến 9 được xếp liên tục nhau (mã A S Ơ l từ 30h đến 39h) Song đến ký tự A (41 h) ihì phải nhảy cóc bảy giá trị so với ký tự 9 (39h)

Do vậy trước khi hiện một ký tự HEXA, phải kiểm tra xem liệu giá trị của

4 bíi có nhò hơn hay bằiìg 10 hoặc lón hơn 10 Nếu nhò hcm 10 thì cộng với 30h đẻ biến thành giá trị ASCII cùa chữ số, còn bằng hoậc iớn hơn 10 thì công với 37h để được mã A S Q I của các ký tự chữ sô' dạng HEXA từ

shr AL,CL ; Chuyển 4 bit cao của AL về vị trí 4 bit thấp

C âll HỈENl ; Hiện ký tự HEXA thể hiện giá trị 4 bit cao

pop AX ; Hồi phục nội duTìQ AX (AL) đã cất vào ngăn xếp

and AL.OPh ; Tách giá trị 4 bít thấp của AL

c a li HIENl , Hiện ký tự HEXA thể hiện giá trị 4 bit thấp

pop cx AX

ret

HiEN_HEX ENDP

Trang 15

14 CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ASSEMBLER

HIENl PROC ; Chương trình con hiện một ký tự HEXA M màn hinhcmp AL,10 ; So sánh với 10

jb 1 FSS 10 ; Nếu giá trị của 4 bit < 10 thì nhảy

ddd AL,7 ; Còn lớn hơn hoặc bằng 10 thì cộng AL với 7

1 FSS 10:

ãdd AL,30h ; Hiệu chỉnh sang mã ASCII

mov AH,Oeh ; Chửt năng của BIOS hiện một ký tự dạng mã ASCIIint lOh ; nằm ờ AL ra màn hỉnh tại vị tn' con trỏ đang đứng

• Câì giá ĩrị AX vào ngàn xếp,

• Chuyển giá trị AH vào AL

• Gọi chương trình con HIEN_HEX (hiện hai số HEXA của AH),

• Hồi phục giá trị AX từ ngán xếp,

• Gọi chưcmg trình con HIEN_HEX (hiện hai sỏ HEXA của AL)

Phần sau sẽ trình bày cách khác hiện nội dung thanh ghi AX ra dạng cơ sô' 16 (xcm bài tập 1.5)

Bài tập Ỉ.4

Hãy viết chương trình con hiện nội dung cùa thanh ghi AX chứa giá trị một sô' nguyên (trong giórt hạn từ -32768 đến +32767) ra màn hình dạng

cơ số 10

Vấn để (láìi của sô nguyên :

Chúng ta biết rất nhiểu lệnh trong lập lênh A ssem bler có hố trợ vể dấu với bit cao nhất của toán hạng thể hiện dấu Nếu là số âm thì máy tính (CPU

của Intel) sẽ chứa giá trị bù hai của sô đó Ví dụ, sô -1 sẽ được thể hiện bằng bù 2 của 1 (có nghĩa là FFFFh) Đo vậy để hiện một số nguyên nằm

trong một toán hạng (trong trưòng hợp của chúiig ta là thanh ghi AX), trước tiên chúng ta phải kiểm tra liệu số đó lầ số âm hay dương bầng cách xác lập bit cờ dấu SF Nếu bii cờ dấu SF = 0 (số dương) thì hiện giá tri đó

ra màn hinh, ngược lại bit cờ dấu SF - 1 (số âm) thì tiến hành các bước'

sau trước khi hiện giá tn tuyệt đối của sô' hạng đó ra màn hình :

Trang 16

Chương 1 Chương trinh thuấn túy Assem bler 15

• Hiện dấu Irừ,

• Bù hai toán hạng đó để được giá trị tuyệt đối của số nằm trong toán hạng đó

Sò bị chia dạng 32 bit được đạt Irong DX:AX (trong trường hợp ở đây thì

DX luôn bằng 0) và số chia là 10 được đặt trong một thanh ghi đa năng,

ví du BX Kết quả của lệnh chia 32 bit cho 16 bii !à ; thanh ghi DX chứa phần dư và AX chứa thương Hiệu chỉnh phần dư ra dạng ASCII (cộng thém giá trị 30h) và tạm cất vào ngản xếp Thanh ghi c x sẽ chứa số lần

đă cất vào ngăn xếp (để sau này làm chỉ sô' của vòng lặp lòi các giá trị đã cấi trong ngăn xếp lẩn lượt hiện ra mằn hình) Sau mỏi lần chia, kiểm tra Ịiệu ihươiig (nẳm ờ thanh ghi AX) đã bằng 0 hay chưa Nếu thương chưa bằng 0 thì quay lại tiếp tục lấy thương chia cho 10, ngược lại nếu thương báng 0 thì đừng việc chia và thiết lập vòng lặp để lấy các giá trị đã cấi trong ngăn xếp (dạng A S Q I) lần lượt hiện ra màn hình Chương trình con

sẽ có dang như sau :

HỈEN_SO_N PRCX:

push AX BX c x

mov BX.10 ; SỐ hạng chia là 10 điícte đuồ vào BX

xor cx.cx ; cx«0 chứà số lần đxtồ vào ngăn xếp : ban đẳu ỉà 0

and AX.AX Dựhg cờ dấu (Sign-bit cao nhất cỉfâ toán hạng)

ịns HSNl ; Nếu ià số dương (bit cở 0) thi nhảy đến HSN1push AX ; Cất giá trị số nằm ở AX tạm thời vào ngăn xếp

mov AL, - : Hiện dắu trừ ra màn hình

pop AX ; Lấy lại giá trị số từ ngần xếp đưa vào thanh ghi AX

neg AX : Giá trị tuyệt đối của sô cần hiện - Bù 2

HSNl

xor DX.DX : D X - 0

div BX ; Chia giá trị DX.AX (trong đó DX«0) cho 10 (BX)

add DX.30H ; Hiệu chỉnh phần dư ra dạng A ^ I l

push DX ; Cất tạm vào ngốn xếp

Trang 17

16 CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ASSEMBLER

DX c x BX AX

Số lần cất vào ngăn xếp được táng ỉên 1 Dựhg cờ ZF (xét liêu thưcfng có bằng 0 hay chitei?) Nếu thương chưa bằng 0 thi tiếp tục chia

Vòng lặp hiện các ký tự đâ cất trong ngăn xếp Lấy từ ngăn xếp ký tự dạng ASCII và đưa vào AX Hiện ký tự ra màn hình

Cách 2 :

Phần kiểm tra dấu và hiện dấu giống như cách I

Chúng ta biết rằng thanh ghi AX có khả nảng chứa một số lón nhất có năm chữ số trừ phần dấu (từ -32768 đến +32767) Do vậy, sau khi kiểm tra và hiện phẩn dấu như cách 1, chúng fa lần lượt kiểm tra xem số nằm trong AX gấp bao nhiêu lần 10000, 1000, l o o / i o và 1 (thanh ghi DL chứa số lần) Và sau khi thiết lập số lần cho từng trường hợp thì lần lượt

biến đổi sang dạng ASCII và hiện ra (dùng chức năng 2 của hàm int 21 h

của DOS) Dùng thanh ghi BX để làm con trò phần địa chỉ OFFSET của bảng

Chương trình sẽ như sau :

; Nếu ỉà số dương (bit Sign bằng 0) thi nhảy

; Cất giá tri số ở AX tạm thời vào ngăn xếp

; Hiện dấu trừ (-) ra màn hình

Trang 18

Chương 1 ChUdng trình thuẩn túy Assem bler 17

DL.DL

c x ,5

BX,OFFSET Bang

AX,WORD PTR IBXl HSN3

AX.WORD PTR IBXDL

HSN2

AXDL.30hAH.221hAXDL.DLBXBXHSN2

Lấy iại giá trị AX đã cất vào ngăn xếp

Dl = 0Trỏ đến giá trị tiếp theo của Bang

Kiếm tra dấu và hiện dấu giỗng như hai cách trên Sau đó đưa số nằm trong AX sang cx và chuyển số nầm trong cx ra dạng sáu chữ sỏ' dạng B(’D (Binary CcKỈe Decimal) Irong đó mỗi thanh ghi 1 byle chứa hai chữ

sô ; AL chứa hai chữ số ờ vị trí cao, DH chứa hai chữ số ờ vị trí giữa và

1)L chứa hai chữ sô ihấp Síiu đó lán lưcrì biến đổi và hiện ram àn hình (chưofiig trình con HIEN2)

HiEN^SO_N PROC

push AXBXCXDX

and AX,AX ; Dựng cờ dẫu SF

ins HSN1 ; Nếu là sỏ dưf:fíig (SF

# - — ^

ĩ fj* ‘ ■ ■ 'T GìA HA HOI

ir.TỈ}" tÍư VIIN

Trang 19

18 CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ASSEMBLER

CX.AXDX.DXBX.lOOOhAL.BL

c x lAL.DLAL.AL

DL.ALAL,DHAL.AL

Cất giá trị số nằm ở AX tạm thời vào ngăn xếp

Hiện dấu trừ ra màn hinh

Lấy ỉại giá trị số từ ngăn xếp đifâ vào AX

Bù 2 - Giá trị tuyệt đối củd số cần hiện

Chuyển sô cần hiện nằm ớ AX sang cx

D X ^

BH - 16 (số lần lặp tối đa có thể) BL = 0

AL = 0

Qudy trái thì bit cao nhất được đưa vào bit cờ CF

Hiệu chỉnh giá trị trong AL ra dạng BCD

DL chífâ mã BCD phần thấp nhất củd số cần hiện

DH.AL AL.BL AL,AL BL.AL

BH HSN2 HIEN2 AL.DH HIEN2 AL,DL HIEN2

; Hiện hai chữ sô cao (dạng BCD) ở AL ra màn hinh

; Hiện hai chừ sô giĩítì (dạng BCD) ớ DH ra màn hinh

; Hiện hai chừ sô thấp (dạng BCD) ớ DL ĩd màn hinh

Chương trinh con biến đối và hiện một sỏ dạng BCD nằm

ở thanh ghi AL thành hai chữ số dạng cơ sỏ 10 ra màn hinh

Vào ; AL chừd sỗ rần hiện dạng BCD

Trang 20

Chương 1 Chương trinh thuẩn túy Assem bier 19

pop AX ; i ấy lai giá tri cũ của AL từ r^ăn xếp

and AL.OPh ; Tách bốn bit thấp của AL

ddd AL.30H ; Hiệu chỉnh sang dạng ASCII

mov AH,Oeh ; Hiện ra màn hình

• Không có pháii kiểm tra và hiện dấu,

• Chia giá trị 32 bít nằm ở đòi thanh ghi DX:AX (với DX = 0) cho 16 (ớ thanh ghi BX) thay vì chia cho 10,

• Trước khi hiệu chỉnh phần dư sau khi chia (ở thanh ghi DX) sang dạng

ASCII phải kiêm tra liệu giá Irị đó nhó hơĩì 10 hay băng hoặc lớn hơìì

10 Nếu nhò hơtì 10 (giá ĩrị sỏ' từ 0 đến 9) thì cộng ihêĩn 30h đẽ chuyến sang dạng ASCII, còn bàng hoặc lớn hơn 10 (giá trị số từ A đén F) thì cộng với 37h đê chuyển sang dạng ASCII

HỈEN HEXA PROC

push AXBXCXDX

mov BX,16 , Số chia lò được đưa vào BX

xor c x c x : c x = 0 chứei số lần đxM vào ngàn xêp:bdn đầu là 0

ỉiS N l

Trang 21

20 CÁC ĐÀI TẬP LẬP TRỈNH BẰNG NGÔN NGỮ ASSEMBLER

div BX Chia giá trị DX:AX (trong đó DX»0) cho 16

cmp DX,10 So sánh phần dư vcí 10

jb HSN2 Nếu phần dư < 10 thì nhảy

add DX,7 Phần dư sẽ có thể từ A-F Cộng vàì 1 trước

HSN2;

âdd DX,30h Hiệu chỉnh ra dạng ASCII

inc c x Số lần cất vào ngẫn xếp được tãng lẽn 1

and AXAX Thương đã là 0? Dựng cờ ZF

jnz HSNl Nếu thương chưa bằng 0 thì tiếp tục chia

HSN3: Vòng lặp hiện các ký tự đã cất trong ngán xếp

pop AX ỉ Ẩy từ ngân xếp ký tư dang ASCII và âơa vào AX

mov AH.Oeh Hiện ký tự năm ở thanh ghi AL ra màn hình

Hãy viết chương trình nhận một số dạng BINARY (kết thúc việc vào sô

bằng phím Enter- mã ũiỉh và sô' lượng chữ số vào tối đa là 16) và hiện sỏ

đã vào đó ra màii hình dạng cơ số 10 và dạng cơ sô' HEXA (giá thiết rằng hai chựcmg trình con HIEN_SO_N và HIEN_HEXA nẳm trong tệp C:\INCLUDE\LIB2.ASM)

Trang 22

Chương 1 Chưdng trình thuán túy Assem bler 21

Ký tự vừở vào có phải Enter ?

Nếu ỉà Enter thi kết thúc việc vào số Chuyển bit vừa vào vào bit cờ CF Dịch các bit của BX sang trái 1 vị trí và chuyển bit CF vào bit thấp nhất của BX Quay về chờ vào một ký tự tiếp

Phần hiện các số vừồ vào ra màn hình

Hiện số vìfâ vào ra dạng cơ số 10

Hiện số vừa vào ra dạng HEXA Chờ một ký tự từ bàn phím {giống getcho của n /n c )

Các bưóc sẽ tiến hành như sau :

• Dùng chức năng / của hàm ngắt tnỉ 2 Ih của DOS để nhận một ký tự

ASCII Cừ bàn phím vào thanh ghi AL Kiểm tra liệu ký tự vừa nhận có phải là Odh (Enter) - kết thúc viộc vào số hoậc dấu trừ (số âm) thì dựng

cờ dấu

Trang 23

VAO_SO_N PROC

push BX c x DX SI Bảo vệ các thanh ghi

mov BX.IO BX * 10 ìà một số hạng nhân

xor c x ,c x c x “ 0 - Chứa giá trị số đã vào (ìúc đầu bằng 0)

VSNl:

mov AH,1 Chờ nhận một ký tự từ bàn phim (dùng chứcint 21h năng 1 của hàm ngắt iní 21h của DOS )

cmp AL.Odh Ký tự vừa nhận có phải ỉà Enter ?

ie VSN3 Đúng thì nhảy (kết thúc việc vào một số)

cmp AL,'- Ký tự \ÁJa vào có phải là dấu ' hay không ?

jne VSN2 Kh^-ig phải là dấu - thì nhảy đến VSN2

inc SI ngược lại SI -1 (biểu hiện số là âm)

jmp VSNl Nhảy về tiếp tuc nhân các ký tư từ bàn phímVSN2:

sub AL.30h Chuyển ký tự vìfâ nhận dạng ASCII thành sốxchg AX,CX Cất số vìfâ vào (AL) vào thanh ghi CL và đư

giá trị số đã vào tniớc (CX) vào ử\anh ghi AX AX*10, có thể thay bằng C1 con N_AX_10âdd CX,AX Cộng giá trị số vừa vào V(^ giá trị vào trước

{ sau khi đã được nhân 10) đặt ở c x

Quay vể chờ một ký tự tiếp theo từ bàn phímVSN3:

and S1,S! Dựhg cờ để kiểm tra liệu vào số âm hay dưưiíg

neg cx NgiiỢc lại số âm thì bù 2 số vừa nhặn vào

Trang 24

Chương 1 Chương trinh thuán túy Assem bler 23

Tuy chương trình con N „A X _10 chứa nhiểu lệnh song việc thực hiện

sè nhanh hơĩì nhiều so với lệnh MUL vì các lộnh dịch chuyển và quay vòng Irong A ssem bler thực hiện rất nhanh

2 Chúng ta cũng có thê xác lập một MACRO thực hiện việc nhân giá trị

nằm trong thanh ghi AX với một giá trị nằm trong đốịfa( ìor với yêu

là mểm dẻo hơn cả Sờ đĩ như vậy là vì MACRO có đối và đặc biệt cht) phép sừ dụng các lệnh điều khiên lặp khi dịch chương trình (Repeat blocks : REPT, I P R , c á c lệnh điểu khiển điều kiện khi tiến hành dịch chươiig trình (Conditional Assembly Direclives: IF/IFE, IFB/IFNB,

Trang 25

lỉ DL-,MFNDEF IFIDN/IFDIF .) và các lệnh điều khiển khi dịch

LỈÌIUVÌ lĩUih kỉìác Có thể nói MACRO là một cơ chế cho phép người lập

tĩình Assc^^^HỊ^^.tạo lập một lệnh mới trên cơ sờ lập lệnh Assembler

Macro sau klii dtrợc xác lập (khai báo) thì tên cùa nó trở thành một lệnh

rnới và ĩigười lập trình có thế sử dụng bằng cách gọi tên chúng với tham

sỏ ihực ĩhay vi tham số hình thức (đối)

MACRO mà chung ta sẽ thiết lập sẽ nói lén phần nào nhữiig điều vừa

trình bày ờ Irên Đây là một MACRO thực hiện việc nhân giá trị cua

ihanh ghi AX với một giá trị nguyên bất kỳ nằm trong đối /íU tor (AX

nhán với lơ là trườĩig hợp cụ thể khi tham sỏ' thực ứng vói đối fiU tor là

10) I^ án đầu của MACRO là đoạn kiểm tra liệu giá trị c ủ a /í/í70/ có phải

là 2 lũy thừa hay khòng Nếu fa cto r là 2 lũy thừa thì biến cờ

IS_FA CTO R_O F_TW O =l, ngược lại sẽ là 0 - xuấl phát gán bầng 0)

Vòng lãp đầu sẽ tiến hành so sánh liệu fơ( ĩor có băng mộl trong các giá

irị Ì'-*, 2' (nằm ờ biên K )W ER_O F_TW O - lúc đầu là 2" ) hay

khòng Nếu bảng một giá trị nào đó thì thoát khòi vòng lập Phán liếp

theo sẽ liến hành dịch đoạn chưofiìg trình thực hiên phép nhân theo giá trị

biến cờ IS_POW ER_OF_TW O

Cụ thê M ACRO sẽ như sau :

MULTIPLY MACRO íactor

IS_POWER_OF„TWO = 0 ; Biến cờ cho biết factor có phải

Count - 15 ; !à 2 luỹ ihừã (1-phải; 0-không phải)

REPT 16 ; Vòng lặp kiểm tra liệu factor cỏ

IF POWER_OF_TWO EQ íactor ; phải là 2 luỹ thừa ? Nếu đúng tức

iS_POWER_OF_TWO = 1 ; là factor = và dựhg biến cờ

Count = Count - 1 ; còn không thì Couní giảm đi 1 và

POWER ,OF„l'WO«POWER_OF_ TWO SHR l ; POVVER _OF_TWO

-2 ^ và tiếp tục vòng lặp 16 lần

IF !S_POWER_OF_TWO ; IS.POWER_OF_TWO - 1, tửc là

Trang 26

shl AX,1 ; vòng Couní lần

rcl DX, 1

mov DX íactor ; thì ỷactor không phải ỉà 2 luỹ ìhiíò

MLU^TIPLY 10 (tham sô thực ứng với đối Ịactor không phải ỉà 2 ỉuỹ thíta)

ihỉ ] \SM sẽ dịch khôi lệnh sau :

> DX.IO

rnui DX

còil với

MLILTIPLY 8 (tham số thực ửĩìQ với đổi factor là

ihì TASM sẽ dịch khối lệnh sau:

3 Cìiương trình con VAO„SO_N vừa trình bày ò trên không cho Ịửìép

chúng ta đánh sai và sửa các chữ số trong khi vào Nếu đánh sai kết quả nhận được sẽ sai Đế có thể sửa trong khi vào số, chưcmg trình sẽ phức tạp hơn Có hai cách cho phép sửa khi vào số

Cách ỉ :

Vần dùng tư duy như phần trên, có nghĩa là dùng chức nàng / cúa hàm

ngãt int 2 Hì của DOS đê nhận từng ký tự vào từ bàn phím và xử lý.

Trang 27

26 CẤC BÁI TẠP LẬP TRÌNH BẰNG NGỒN NGỮ ASSEMBLER

Chucmg ì rinh sẽ thưc hiện được việc chỉ nhận các ký tự là dấu - (nêu là ký

tự văo đẩu tiên) và các chữ số từ 0 đến 9 Việc sứií một ký tự sẽ tiến hành bằng cách ấn phím Backspace đẻ di chuyến lùi con trò và sau đó xoá ký tự

đó bằng cách hiện dấu Irống (space) nhờ chức nãng Oah của ngắt///r ỈOh

của BIOS (xoá ký tự song vị trí con !rỏ không chuyến sang phài) Khl đánh một ký lự bẫt kỳ, thục chất ký tự đó đã hiện lên màn Hnh và chiÍ!ìg

ta cũng dùng cơ chê trên để quay lùi con trò và xoá (song vì nhanh quá chúng ta cứ iưởng như là khỏng cho ký lự đó vào) Khi sửa một ký lự só chúng ta phải nhớ chia giá trị đã nhận trước cho iO Chưcmg trình thể hiện thuật toán đó như sau :

VAO.SO.N PROC

push BX c x DX SI Bảo vê các thanh ghi

mov BX.IO BX « 10 là một số hạng nhân

xor c x ,c x c x chúà giá trị số vào flúc đầu bằnq 0)

mov Si, AX Sỉ chùã cờ dấu flúc đầu bằng 0 ' dấu dương)

VSNl:

mov A H l Chờ nhận một ký tự từ bàn phim (dùng chứcint 21h năng ỉ của hàm ngắt iní 21h của DOS )

cmp AL,Odh Ký tự vùồ nhận có phải là Enter ?

ie VSN7 Đúng thỉ nhảy (kết thúc việc vào một số)

cmp AL.8 Ký tự vừa vào có phải là Backspace (để xóa)

jne VSN4 Không phải là Backspace thi nhảy

and cx,cx Là Backspace thì kiểm tra liệu có phải là ký

jz VSN2 tự cần xóa ờ vị trí đầu tiên Nếu phải thì nhảymov AX.CX Còn không thì chia giá trị số đã nhận cho 10

push c x không thay đổi (không chuyển sang bên phải)mov AL,20h nhờ chức năng Oâh của ngắt BIOS in í ĩOh

mov c x l

int lOh

Trang 28

Chương 1 Chưdng trình thuẩn túy Assem bler 27

pop c x

cmp AL,'-‘ Có phải là dấu

-inc VSN5 Không phải là dấu - thi nhảy

and cx,cx Xét liệu dấu - đửhg ở vị trí đầu tiên

ịnz VSN6 Dấu - không phải ờ vị trí đầu tiên thì nhảy

mov Sl.l Dấu trừ ở vỊ trí đầu tiên thi cờ dấu lên 1 (Sl - 1)

ig VSN6 Lớn hưri ký tự 9 thi nhảy

xor AH,AH Còn không thì tiến hành xử lý : chuyến ký tựsub AL,30h vừa nhận ổư(X từ dạng ASCII ra số , sau đó

xchg AX.CX cộng số vừờ nhận được đó vởì số đã vào trước

add CX,AX Kết quả giá trị số đã vào nằm trong c x

mov AH,3 tự không phải là ký tự số và ký tự dấu - khôngint lOh đúhg ờ vị trí đẳu tiên) Lấy vị trí hiện hành của

dec DL con trỏ và giảm cột (nằm ở DL) đí 1

mov AH,2 Đặt vị trí con trỏ vể vỊ trí có toạ độ ờ DH và

int lOh DL (không chuyển con trỏ sang phải khi vào

VSN7: Ký tự vào là Enter (kết thúc việc vào một số)

dnd Sl.SI Xét liệu số vừa vào là dương hay âm ?

neg cx Ngược lại là số âm thi bù 2 giá trị vừcì vào

VSN8:

mov AX,CX , Đitó giá trị số đã vào vào thanh ghi AX

pop Sỉ DX c x BX Hồi phục các thanh ghi

ret

Trang 29

28 CÁC BÀI TẬP LẬP TRÌNH BẰNG NGỐN NGỮ ASSEMĐLER

Cách 2 :

Đây là cách tiện lợi nhất cho việc nhận một số nguyên từ bàn phím Thuật toán của cách này như sau :

• Dùng chức năng Oah của ngắt int 21 h của DOS đè nhận một chuỗi ký

tự từ bàn phím (trong khi nhặn được phép sửa) và đưa các ký tự đó vào một vùng nhớ đệm được trỏ bời DS:DX (SEG:OFFSET) Việc nhập xâu ký tự theo chức năng trên sẽ có thể kết thúc bằng một trong hai cách:

- Ảii phím Enter, hoặc

- Số lượng ký tự nhập vào bằng số lượng ký íự tối đa của chuỏi cán nhập vào (đã được xác lập trước ở byte đầu tiên cùa vùng đệm)

Sau khi gọi hàm này, vùng đệm có dạng sau :

0 Số lưựtig ký tự tối đa của chuỗi cần nhập vào

1 Sô lượng ký tự thật sự đã nhận được từ bàn phím (không

db ? ; Q iiểu dài thật sự của chuỗi ký tự đã nhập vào

; (sẽ được điển vào sau khi hàm được thực ! ỉ)

db 8 dup(?) ; Nơi chứa các ký tự nhập vào

• Sau khi kết thúc việc vào số, vào vùng nhớ đệm lấy các ký tự đã vào để

xử lý Việc xử lý xâu ký tự (ký tự các số) cũng được tiến hành Iheo thuật toán tương tự như đã để cập ờ cách 1 Chú ý là số lượng ký tự đà

nhập vào nằm ờ byte thứ 1 của bộ đệm (Buff).

Chương trình có dạng sau :

DATA

Buff db 7

Trang 30

Chưdng 1 Chưdng trình thuấn ỉúy Assem bler 29

c x c x Dl.cx

C L ,[Skl

S1.2

DL.ịSIỊ

DL - VSNl Dl.l

SI

c x

AX.AX BX,10

BXDH,DH DL,1SI)DL.SOh AX.DX

Bảo vệ các thanh ghi

Chức náng Oah củd ngắt int 21h cho phép

nhập 1 xàu ký tự vào vùng đệm được trỏ bớì DS:DX.Kếí thúc nhập báng phím Enter

SI trỏ đến byte đầu tiên của B uff

Xóa c x với mục đích cho CH“ 0

Dỉ biến cờ thể hiện dấu Oúc đầu-0-dương)

CL chứci số lượng ký tự thật sự đã nhập vào

SI trỏ đến ký tự đầu tiồn đã nhập Đutei ký tự đầu tiên vào DL

Ký tự đầu có phải [à dấu trừ (-)Không phải dấu ' (số àm) thi nhảy Nếu là dấu - thi dựng cờ dấu âm (Dỉ = 1)

Si trồ đẽn ký tự thứ 2Giảm chỉ số vòng lặp đí 1Vòng lặp đối chuỗi số thành một số nguvẻn

AX chửồ số nguyên đằ vào (lúc đầu là 0)

BX=10 ' một sô hạng nhân

Nhân phần sô đấ được đổi cho 10 DH=0

Lôi ký tự tiếp trong Buff vào DL

E>ối ký tự ASCII của số thành sốCộng số vừa đổi với giá trị đã vào trước saukhi đã nhàn với 10

Trỏ đến ký tự tiếp theo

Hỏi cờ dấu có phải !à số âmNếu số vào là dương thì nhảycòn không bù 2 (thể hiện số âm của Intel)

Dỉ SI DX c x BX Hồi phục các thanh ghi

ENDP

Trang 31

30 CÀC BẢI TẬP LẬP TRỈNH BẰNG NGÓN NGỮ ASSEMBLER

Bài tập 1.8

Hãy viết M ACRO xóa màn hình dạng vãn bản

Để thực hiện việc xóa màn Mnh, chúng la có thể dùng một số chức năng

cùa ngắl itư lOh của BIOS Có nhiều cách làm và ờ đây chúng ta nêu ra

hai cách:

Cách ỉ

Chúnẹ ta biết, với chế độ văn bàn thì số lượng ký tự lớiì nhất mà màn hình

có the hiện là 2Ơ00 (80 cột * 25 dòng) Do vậy chúng ta hãy đưa con trỏ

vể đầu màn hình (phía trên Irái), sau đó tiến hành hiện 2000 dấu cách với chế độ con trỏ không chuyển sang jAải Đế thực hiện yêu cầu trên, chủng

ta dùng hai chức nãng của ngăt inỊ ÌOh ò chế độ vàn bản là :

Đảt vi trí con trỏ : CN 2h của int lOh • •

\/ào AH = 2

BH = sô trang màn hình; DH = số dòng : D L= số cột

Viết các ký tư ra màn hình : CN OAh của INT lOh

(con trỏ không chuyến sang phải sau khi hiện một kỷ tự ra màn hình)

xor DX.DX ; Đặt vị trí con trỏ vể vị trí trái phid

mov AH.2 ; màn hinh (vị trí 0,0)

Trang 32

Chương 1 Chương trình thuẩn túy Assetnbler 31

Cách 2 :

Chúng la biêi rằng cơ chế của màn hình là khi tiến hành đặt màn hình với một c h ế độ nào đó thì màn hình sẽ bị xóa và con trò sè định vị ờ vị trí đầu cùa m àn hình (góc trên trái) Chúng ta tận dung cơ chế này đế xoá màn hình Tuy nhiên đế xóa màn hình mà không ánh hường đến chê độ màn hình hiện thời ihì nên lấy chẻ độ hiện hành của màn hình, sau đó đặt lại chế độ đó thì màn hlnh sẽ bị xóa

Lây chê độ hiện hành của màn hình CN OFh của ĨNT lOh

Váo ! AH -OFh

Ro AL chitđ chê độ hiện hành của màn hinh

Đât ch ế đô màn hình CN 0 của ỊNT lOh • •

Trang 33

CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỬ ASSEMBLER

-32768 đến 32767 Yêu cầu ư và n vào lừ bàn phím Già thiết rằng hai

MACRO HienString và CLRSCR nằm trong tệp C:\IN CLUDE>sLIB! ASM

và các chươiìg Irình con nhận một sô' nguyên từ bàn phím (VAO_SO_N)

và hiện một sô nguyên ra màn hình (HIEN„SO_N) được đặt trong tệp C:\INCLUDE\L1B2.ASM

Cách g i ả i :

Lũy thừa í / ‘ có nghĩa là giá Irị của í/được nhân ( n - l ) lần Do vậy chúng

la chi thiết lập vòng iập (//-/) lần việc nhân í/(số íi nằm trong AX và n

nầm trong c x - chi số của vòng lặp) Chú ý xét hai trường hợp đãc biệt iã

M3 db Oah.Odh/Gia tri a luy íhua n la : $

M4 db Oah,Odh.’Co tiep tuc (cA) ? : $'

HienString MI Hiện xâu ký tự M1

HienString M2 Hiện xâu ký tự M2

mov AX.BX Hồi phục cơ số a vào thanh ghĩ AX

mov AX.l Còn nếu sỗ mũ * 0 thi d luỹ thừã 0 bằng 1

Trang 34

Chương 1 Chương trình thuẩn túy Assem bler _ ^

Hiện xâu ký tự M3

Hiện kết quả của a lũy ửĩừà n

Hiện dòr^ nhắc M4Chờ một ký tự tử bàn phim(giống getchO của ngôn ngữ C)Liệu có tiếp tục ?

Vể DOS

Bài tậ p ỉ 10

Tính n! với yêu cáu sau ;

• Số n vào từ bàn phím sau câu nhắc ‘Hay vao so n ; ‘

• Hiện kết quả Fa màn hình sau câu nhắc 'Giai thua cùa n la

Cách g ừ ỉi:

Trước khi đi vào giải tổng Ihể bài toán này, chúng ta x e n ^ u a về chương

trình con tính n! (giá trị n nằm trong thanh ghi AX) Chỉmg ta khai báo

hai biến nhớ là ; và Fơ( dạng 2 bytc trong DATA segment Đầu tiên

phải kiểm tra hai trường hợp đặc biệt là giai thừa của số 0 và 1 Nếu lằ hai truờĩig hợp đó thì kết quả giai thừa sẽ là I Các trường hợp khác thì íiế ì hành tính giai thừa Kết quả đật trong biến FV^

Chú ỷ ;

CTiương irình này chỉ tính được giai thừa từ 0 đến 7 (nếu lớn hơn thì kế! quả cùa giai thừa sẻ là số nguyên viíỢt quá 2 byte và chương trình sè phức

tạp hơn) Chưcrtig trình con yêu cầu số n cán tính giai thừa sẽ đặt troMg

thanh ghi AX và giả thiết chươiig irình con này sẽ đặt Irong CMNCLƯDE\L1B3.ASM

Trang 35

34 CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ASSEMBLER

N_G_T PROC

push cx DX

mov FV.l ; Cho giá trị ban đầu FV- 1

mov Fac,2 ; Cho giá trị ban đầu Fac=2

mov CX,AX ; Giá trị n đưã vào c x

cmp AX.l ; Có phải n=0 hay 1 ?

GTl

pop DX cx

retN_G_T ENDP

Toàn bộ chương trình sẽ như sau:

Trang 36

Chương 1 Chương trình thuẩn túy Assem bler 35

call HIEN_SO _N Hiện giá trị giai thừầ ra màn hình

Bài tậ p 1.11

Hày viết chương trình tìm sỏ bé trong hai sô nguyên với yêu cấu sau :

• Hai sô nguyên vào từ bàn phím,

• Hiện số bé ra màn hình

CTiưcmg trình sẽ như sau;

ỈNCLUDE C:\ỈNCLUDE\LỈB1 ASM

Hdv vao so thu 1 : $’

Oah.Odh.' Hay vao so thu 2 : $ ’ Oah.Odh/ So be trong 2 so la : $‘

Odh.Odh,' Co tiep tuc (cAì ? : $ ’

assume CS:CODE, DS DATA SS: _STACK

Trang 37

36 CÁC BẢI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ASSEMBLER

xchg AX,BX Đổi chéo nội dung hai thanh ghi cho nhau

để lúc nào AX cũng chửà giá trị sô bé

1 M uốn hiộn số có giá trị lớn thì thay lệnh j l L I bằng lệnhý^ L ỉ.

2 N ếu bước nhảy của lệnh nhảy có điểu kiện je PS quá 128 byte thì phải

nhảy đến m ột nhãn trung gian, sau đó nhò lộnh jm p nhảy đến nhãn PS

(giống bài tập 1.9)

Bài tập 1.Ỉ2

Hãy viết chương trình tính trung bình cộng hai số nguyên với

sau:

• Hai số nguyên vào từ bàn phím,

• Tính trung bình cộng và hiện kết quả ra màn hình dạng cơ sô' 10

yêu cáu

Trang 38

• Nhận hai sô' nguyên từ bàn phím,

• Tính tổng,

• Xét dấu của tổng Nếu tổng là âm thì hiện dấu -(dấu trừ) ra m àn hình

và lấy giá trị tuyệt đối của tổng (bù 2),

• Dùng lệnh dịch phải SHR để chia giá trị của tổng cho 2 (hoặc giá trị tuyệt đối của tổng nếu là âm sau khi bù 2) Kết quả của lệnh này cho

ra phần nguyên của trung bình cộng (làm tròn dưới với số nguyên dương),

• Hiện phán nguyên của trung bình cộng ra m àn hình,

• Bit thấp nhất của toán hạng tống thể hiện giá irị tổng là số chẵn hay lẻ Nếu bit này là 0 thì tổng là chẵn, ngược lại tổng là số lẻ Sau khi chia giá trị tổng cho 2 bằng lệnh SHR thì bit này sẽ chuyển vào bit cờ CF (Carry) Chúng ta kiểm tra nếu bit cờ C F = 1 thì hiện thêm .5 sau phần nguyên cùa taing bình cộng đã hiện trưóc; ngược lại bit cờ CF = 0 thì ihôi

Chương trình sẽ như sau :

MI db ‘ Hay vao so thu 1 : $'

M2 db Oah,Odh,’ Hay vao so ứiu 2 : $ ’

M3 db Oah.Odh/ Trung binh co r^ cua hai so nguyên la : $ ’

Trang 39

38 CÁC BÀI TẬP LẬP TRÌNH BẰNG NGÔN NGỮ ASSEMBLER

Nhận số nguyên thứ haiHiện dòr^ nhắc M3Tổng hai số

Dựhg cờ dấu; giá trị của AX khòng đổi Nếu tổng là dương thì nhảy đến LI Còn tổng là âm thỉ hiện dấu - ra màn hình Lấy giá trị tuyệt đối của tổng âm

Chia đôi tổng và kết quả AX là phần nguyên Gàm tròn dưới) của taing bình cộng Cất giá trị bit cờ CF tạm vào ngăn xếp Hiện phần nguyên của trung bình cộng Hồi phục giá trị bit cờ CF

Nếu CF»0 (tổng là chẵn) thì nhảy đến L2 NgiiỢc lại hiện ữiêm 5

Trang 40

Chương 1 Chương trình thuắn túy Assem bler 39

Chương trình sẽ như sau ;

INCLUDE C:\INCLUDE\UB1 ASM

„ST ACK segment

db lOOh dupP)

STACK enđs

MI db Hay vao so giới hạn : $ ’

M2 db Oah.Odh,’ Cac so nguyen to tu 2 den $ ’

; Hiện M3 ( ' la : *)

; BX chứa số giói hạn

Ngày đăng: 20/12/2019, 00:00

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN