ướ ầ ớ ậ ử
ự ọ ậ T h c l p trình Assembly Bài 1: B c đ u v i l p trình Assembly trên vi x lý Intel 8086/8088
ƯỚ Ầ Ớ Ậ Ử B C Đ U V I L P TRÌNH ASSEMBLY TRÊN VI X LÝ 8088/8086
ớ ệ ề ợ 1. Gi ữ i thi u v H p ng :
ợ ữ ữ ậ ự ấ ấ ạ ộ ợ ủ ệ ạ ớ ấ H p ng (Assembly) là m t ngôn ng l p trình c p th p, nó th c ch t là d ng g i nh ữ (Mnemonic), hay d ng kí hi u, c a ngôn ng máy.
ế ệ ậ ộ ố ọ ữ ử ấ ớ ư ơ t k vi x lý đã đ a ra t p l nh h p ng g n v i ngôn ng t nhiên h n ầ ứ ữ ầ ữ ẫ ữ ự ớ ế ơ t, l nh ngôn ng máy là m t dãy các con s 0, 1 nên r t khó đ c và khó l p trình, ợ ợ ớ ậ ế ế ễ ậ ấ ữ ể ợ ờ ạ ộ ư Nh đã bi ế ậ ệ vì th các nhà thi ễ ọ ệ nên d đ c và d l p trình h n. Tuy v y, các l nh h p ng v n giao ti p v i ph n c ng máy ế ậ ặ ộ ẽ tính m t cách r t ch t ch , nh đó vi c ti p c n v i l p trình h p ng giúp chúng ta hi u rõ ủ ổ ứ ề ế ơ h n v ki n trúc và t ậ ệ ch c ho t đ ng c a máy tính.
ứ ấ ơ ợ ệ ữ ệ ổ ứ ệ ề ể ể ạ ộ ầ ậ ch c ho t đ ng bên trong máy tính và ố Ngoài ra nó còn giúp chúng ta th y rõ h n m i quan h gi a các thành ph n ch c năng bên ượ ạ ể hành. Có th nói ng trong máy tính và h đi i là, vi c tìm hi u và l p trình trên h p c l ề ế ơ ữ ng giúp chúng ta hi u rõ h n v ki n trúc máy tính, t ệ ề h đi u hành.
ớ ạ ủ ể ậ ệ ử ệ ỉ ợ ử ụ ữ ủ ọ ử ạ ậ ự ố ợ ớ ệ ề ọ Trong gi i h n c a tài li u này chúng ta ch tìm hi u t p l nh h p ng c a các vi x lý h ạ Intel 8088/8086, để l p trình ch y trên các máy IBMPC: S d ng h vi x lý này và ho t ộ đ ng trong s ph i h p v i h đi u hành MS_DOS.
ộ ủ ợ ể ặ ữ ố ộ ạ ươ ơ ươ ế ng trình vi t trên nó có kích th ế ớ t (ch ng trình nhanh h n so v i vi ỏ ơ ướ c nh h n ứ ng trình cùng ch c năng) ươ ậ ữ M t trong nh ng đ c đi m c a h p ng là ch ệ ự và t c đ n p/th c hi n ch ữ ậ trên các ngôn ng l p trình b c cao.
ầ ề ệ ế ữ ậ t (“nhúng”) mã ề ữ ậ ườ ậ ế ế ạ ố i l p trình khai thác t ợ ữ ấ ủ ầ ệ ạ ử ạ ữ ậ ệ ấ ế ế t k ng trình t ch ậ ợ ế ử ụ ụ ữ ệ ể ế i n u s d ng ngôn ng b c cao đ vi ộ ữ ượ ể ấ ữ ệ ẽ ượ ợ ấ ệ ố ệ ạ c giao cho các đo n mã l nh h p ng đ t b ,...) đ l y d li u s đ c nhúng trong ế ị ươ Ngoài ra, h u h t các ngôn ng l p trình b c cao hi n nay đ u cho phép vi ợ ệ i đa th m nh c a các ngôn l nh h p ng trong nó. Đi u này giúp ng ữ ậ ng l p trình, h p ng r t m nh trong các thao tác can thi p sâu vào các thành ph n bên trong ữ ậ ệ ố h th ng, trong khi đó ngôn ng b c cao m nh trong các thao tác x lý d li u và thi ươ ư ậ ẽ giao di n. Nh v y s là r t thu n l ớ ổ ệ ệ ố ử x lý thông tin h th ng, khi đó nhi m v truy xu t h th ng (thanh ghi, b nh , c ng vào/ra, thi ch ng trình này.
ữ ỗ ợ ệ ậ ạ ệ ươ ớ ị c biên d ch ch ự ế ừ ộ ng tác h th ng: (1) Nh p tr c ti p t ng l nh/đo n l nh vào b ướ ầ ng trình. ữ ộ ữ ồ ươ ữ ng trình h p ng , r i sau đó t ch ng trình g r i Debug (đi kèm h đi u hành MS_DOS: Debug.exe) là m t trong nh ng ng trình h tr ch đ này cho h p ng 16 bít; (2) Vi ươ ị ợ ạ ự ặ ế ng trình th c thi (d ng EXE ho c ỡ ố ỗ ợ ế ộ ươ ự ươ ệ ợ ế ộ ươ H p ng h tr 2 ch đ t ớ ồ ệ ự nh r i cho phép th c hi n ngay trên b nh mà không c n qua b ươ Ch ươ ch ử ụ s d ng các ch COM) và cho th c hi n ch ệ ố ộ ệ ề ợ ể ị ng trình biên d ch đ d ch nó sang ch ng trình này.
ệ ươ ể c s d ng đ biên d ch ch ữ ủ ị ọ ợ ng trình h p ng (t ị ữ ừ ậ ợ ị ự ươ ử ợ ượ ử ụ ạ Hi n nay có hai lo i trình biên d ch đ ệ l nh h p ng c a các vi x lý h Intel) sang ch t p ữ ng trình th c thi: Trình biên d ch h p ng 16
ươ ề c s d ng đ d ch thành các ch ạ ng trình ch y trên n n
ượ ử ụ ể ị ữ ạ ươ ự ế ể ề ợ ạ ệ ề ữ ng trình h p ng sang d ng ch c s d ng đ d ch thành các ch ươ ể , đ chuy n m t ch ả ự ỗ ợ ủ ủ ầ ặ ượ ử ụ ị ng trình ch y trên n n h đi u hành 32 bít ươ ộ ng trình ệ ng trình ti n ích c a ể ị bít, MASM (Macro Assembler), đ ợ ệ ề h đi u hành 16 bít MS_DOS; Trình biên d ch h p ng 32 bít, MASM32 (Macro Assembler 32 bít), đ MS_Windows. Trong th c t ự th c thi EXE 16 bít ho c COM 16 bít thì c n ph i có s h tr c a ch ệ ề h đi u hành MS_DOS: Link (Link.exe) và EXE2Bin (EXE2Bin.com). ươ
ợ ệ ố ử ụ ữ ề ắ ủ ử ụ ư ệ ậ ủ ữ ậ ợ ng trình h p ng 16 bít s d ng h th ng các ng t m m (Interrupt) c a BIOS và DOS ươ ng trình h p ng 32 bít s d ng t p hàm ư ệ ậ ủ ươ Ch ư nh là th vi n l p trình c a nó, trong khi đó ch API làm th vi n l p trình c a nó.
ế ươ ợ ằ 2. Bi n – H ng trong ch ng trình h p ng ữ:
ế ằ Bi n và h ng
ằ ươ ử ụ ụ ắ ị ươ ậ ợ ươ ng t ợ ế ằ ươ ng trình h p ng ch có các ki u d li u là: Byte, ể ự ặ ợ ể ấ ữ ng trình h p ng có tính ch t, m c đích s d ng, ki u ữ ằ ự ư ế nh bi n và h ng trong các ngôn ng ể ữ ệ ữ ỉ ố ữ ng trình h p ng có th là s , kí t ộ ho c m t xâu kí ằ ế Bi n và h ng (h ng có tên) trong ch ắ ặ ữ ệ d li u, quy t c đ t tên, quy t c gán giá tr ,... t ậ l p trình b c cao khác. Bi n trong ch Word, Doubleword,... và h ng trong ch .ự t
ị ợ ế ươ ỉ ủ ộ ớ ộ t ch ng trình h p ng chúng ta c n quan tâm đ n đ a ch c a bi n trong b nh . M t ữ ươ ẽ ượ ệ ố ỉ ầ ng trình s đ ớ ể ụ ể ộ c khai báo trong ch ng trình đ ị ạ ế ỉ ị ố ỉ trên xu ng d ế ớ ộ ộ ị c h th ng gán cho m t đ a ch trong b nh ượ ạ ỗ ạ ộ ươ ế c n p vào b nh đ ho t đ ng). C th : m i bi n trong ch ng trình ộ ế ượ ớ ộ ị c khai báo liên ti p i m t đ a ch xác đ nh trong b nh , và các bi n đ ẽ ượ ị ị ị ạ ướ ừ i các đ a ch liên ti p nhau c đ nh v t i) s đ ng trình (t ị ươ ế ờ ấ ng trình xác đ nh đ offset th p đ n offset cao). Nh đó, n u ch ỉ c đ a ch ượ ị ế ễ ế ộ ỉ ế ượ ị ủ c đ a ch và n i dung c a các bi n khác trong ế Khi vi ế ượ bi n đ ươ (khi ch ẽ ượ ị c đ nh v t s đ ươ nhau trong ch ớ ừ ộ trong b nh (t ủ ế ộ c a m t bi n nào đó thì nó d dàng có đ ươ ng trình. ch
ớ ế ươ ớ ể ư ữ ộ ng trình h p ng không đ ẽ ượ ứ ợ ằ ằ ị ng trình ch a trên h ng thì s đ ữ ứ ượ ấ c c p phát b nh đ l u tr , t c ị ủ c trình biên d ch thay b ng giá tr c a ơ ộ ằ Khác v i bi n, h ng trong ch ươ là, n i nào trong ch ự ế nó m t cách tr c ti p.
ấ ữ ử ả ể ị ị gi ữ ệ ử ằ ặ ở ố ể ằ ng trình. Trong khi đó, h ng có th khai báo cu i ch ị ở ầ đ u ho c ươ ể ử ụ ử ấ ể ị ươ ng trình, khi đó ta có th s d ng toán t đ đ nh nghĩa/khai báo d li u: DB (đ nh nghĩa byte), DW ế EQU đ khai báo h ng. Bi n có ở ấ ể b t d u “=” đ gán giá tr cho ợ H p ng cung c p các toán t ị (đ nh nghĩa word), DD (đ nh nghĩa doubleword),.... Và toán t ể ượ th đ c khai báo ỳ ơ k n i đâu trong ch h ng.ằ
ằ ế Khai báo bi n – h ng:
Cú pháp khai báo:
(cid:0)
(cid:0)
(cid:0) ở ạ
ở ạ
ở ạ ị
ị
ị a: (cid:0) ằ ố d: ườ ượ ử ụ ườ ế ể ợ
ng h p a đ c s d ng đ khai báo bi n ki u byte, tr ợ
ng h p b đ ượ ử ụ ể
ợ
ng h p c đ
ằ ể
ở ạ ể
ặ ị ề
ấ ự ể ỏ ự ằ ượ ử ụ
c s d ng
Tr
ế
ể
ể
ế
ườ
c s d ng đ khai báo bi n ki u doubleword,
đ khai báo bi n ki u word, tr
ị
ể ộ
ể
ượ ử ụ
ợ
ườ
ng h p d đ
c s d ng đ khai báo h ng. Ví d 1:ụ (cid:0) Spt DB 0
(cid:0) KiTu DB ‘a’ (cid:0) (cid:0) TieuDe DB ‘Tin hoc’
SoNguyen DW ? ụ ế ể c 1byte. ớ ướ ự ồ ế ỗ
c 7 byte), m i
ở ạ
ị
c gán giá tr kh i t o.
th p đ n cao) là:
t (t ế Spt và Kitu đ u là bi n ki u byte, kích th
ướ
ề
Trong ví d trên, hai bi n
ể
ế
ế
ồ
Bi nế TieuDe cũng là bi n ki u byte nh ng g m 7 byte ô nh liên ti p (kích th
ư
ư ượ
ế
ế SoNguyen là bi n ki u word, ch a đ
ể
ứ
ASCII. Bi n
byte ch a 1 kí t
Bi nế DaySo là bi n ki u doubleword, g m 4 ph n t
ị ầ ượ ừ ấ
ầ ử
ể
ế
có giá tr l n l
1020, 1345, 2389, 5763. Ví d 2:ụ (cid:0) (cid:0) (cid:0) LF EQU 0Ah
TB EQU ‘Cong nghe Thong tin’
TieuDe DB TB ộ ằ ở ạ ể ế ầ ấ ượ c ướ ị
Khai báo trên cho th y, có th kh i t o giá tr ban đ u cho bi n thông qua m t h ng đã đ
ị
đ nh nghĩa tr c. Ví d 3:ụ TenKhoa DB ‘Cong nghe Thong tin’, 0Ah, 0Dh, ‘$’ ả ố ế ể ấ ồ ộ ự ự ế ể ồ Khai báo bi nế TenKhoa cho th y, có th khai báo m t bi n mà trong đó bao g m c s , kí t
và xâu kí t , đây là bi n ki u byte, g m 22 byte. Ví d 4:ụ SoPT DW 2345h ộ ấ ủ ậ ng h p này byte th p c a nó nh n giá tr 45h, ườ
ế
trên là m t bi n word, trong tr
ị
ư ấ ị ị ạ ị ị ợ
ị ạ ị
i đ a ch ị
i đ a ỉ SoPT, byte cao đ nh v t ở
Bi nế SoPT
ậ
byte cao nh n giá tr 23h, nh ng byte th p đ nh v t
chỉ SoPT + 1. ộ ợ ữ ế ộ ả ả
ả ồ ể
ộ
ớ
ể ượ
trên có th đ
ượ
ể đ ụ ở
ả
trong m ng có th ộ
c xem là m t
ị
c xác đ nh thông ế ỉ ế
ầ ử
. Giá tr c a các ph n t
ụ ể
ng ng (đ a ch ). C th : Trong h p ng , m t dãy các byte hay word liên ti p nhau trong b nh có th xem là m t
ả
m ng (m ng byte hay m ng word). Bi n DaySo trong ví d 1
ầ ử
ị ủ
m ng word g m 4 ph n t
ị
ỉ ố ươ ứ
qua tên bi n và ch s t
DaySo[0] = 1020; DaySo[2] = 1345; DaySo[4] = 2389; DaySo[6] = 5763. ợ ữ ử ụ ả ồ ộ ầ ử ị ử
ở ạ ể
ạ ử ụ ế
ử ồ có cùng giá tr kh i t o. D ng s d ng toán t ạ
DUP đ khai báo m t bi n d ng m ng mà trong đó g m
DUP là ầ
m Dup (n): g m m ph n ở ạ H p ng cho phép s d ng toán t
nhi u ph n t
ử
t ề
ị
có cùng giá tr kh i t o là n. Ví d 5:ụ MangSN DW 23, 45, 50 Dup (0), 12 ượ c xem là m t m ng word g m 53 ph n t ầ ử ầ
ầ ử ố ầ ử ế ồ
ậ ộ
t là 23 và 45, 50 ph n t ả
ầ ử
, hai ph n t
ị
ti p theo nh n cùng giá tr 0 và ph n t đ u tiên
cu i cùng ị ầ ượ
ị ư ậ
ậ
ậ ế
Nh v y, bi n MangSN đ
nh n giá tr l n l
nh n giá tr 12. ẽ ượ ị ị ạ c đ nh v t c khai báo
ượ ị đây s đ
ỉ ỉ
ế
i các đ a ch liên ti p
ớ ữ ệ ị ạ ẽ ượ ị
ắ ầ ạ ở
ị ạ ị
c đ nh v t
ụ ể
i các offset sau đó. C th : Bi n KiTu b t đ u t
ị ị ạ ế ị
ạ
i đ a ch offset 100 trong đo n nh d li u thì
ắ ầ ạ
ế
i offset
ắ
ế
i offset 109, bi n DaySo b t i offset 102, bi n SoNguyen đ nh v t ế ượ
ụ ở
trên: Các bi n đ
Trong ví d 1
ế
ớ ế
ộ
nhau trong b nh . N u bi n Spt đ
ế
ế
các bi n ti p theo s đ
c đ nh v t
ế
101, bi n TieuDe b t đ u t
ầ ạ
i offset 111 (xem hình sau):
đ u t 100 101 102 103 104 105 106 107 108 109 111 113 115 117 0 a T i n _ H o c 1020 1345 2389 5763 ủ ế ị ỉ ướ ớ ứ ầ ử ị ủ i là các ô nh ch a giá tr c a các ph n t trong (dòng trên là đ a ch offset c a bi n, dòng d
bi n)ế ề ầ ầ ử ị ủ ể ế ộ trong bi n này thông ụ ộ ư ể ấ ế
ở
Đi u c n quan tâm
đây là, có th truy xu t đ n giá tr c a m t ph n t
ế
ủ
qua tên c a m t bi n khác. Ví d : Spt[0] = 0, TieuDe[0] = ‘T’, TieuDe[1] = ‘’i, DaySo[0] =
1020, DaySo[6] = 5763,... nh ng cũng có th
Spt[2] = KiTu[1] = ‘T’, KiTu[5] = ‘h’, DaySo[5] = ‘h’, TieuDe[11] = 1345,... ươ ạ ườ ị ng trình Assembly ch y trên môi tr ệ
ng h ự ọ ậ
ề T h c l p trình Assembly Bài 2: Biên d ch ch
đi u hành 16bit ứ Th Năm, 29/08/2013 18:47 ế ử ụ ướ ị t này h d ng các ch ươ
ể ị 16 bít: Microsoft
ữ .asm) ng trình biên d ch
ươ
ệ ề ạ ượ ươ ự ề ẫ
ng d n s
Bài vi
MacroAssembler và A86 MacroAssembler V4.05 đ d ch các ch
sang ch ợ
ng trình h p ng (*
c trên n n h đi u hành MS_DOS: ng trình th c thi (* .exe và *.com), ch y đ ậ ườ ượ ử ụ ng đ c s d ng ng trình
ươ A86 Macro Assembly (t p tin chính là:
ươ A86.com) th
ạ ữ ự ợ ươ
∙ Ch
ể ị
đ d ch ch ng trình h p ng sang ch ng trình th c thi d ng COM. ậ ươ ượ ử ụ ườ ng trình ng đ MASM.exe) th ữ ự ạ ng trình th c thi d ng EXE. Tuy nhiên, MASM ch có ố ượ ạ ậ ợ ng trình h p ng sang d ng t p tin đ i t ậ ự
ể ậ ự ạ ươ ủ ∙ Ch
ươ
ị
ng trình h p ng sang ch
d ch ch
ậ
ể ị
th d ch t p tin ch
ể ậ
chuy n t p tin Obj sang t p tin ch
ế ủ
k t c a MSDOS, đó là
ả ử ụ
ạ
d ng COM ta ph i s d ng thêm m t ch ể
c s d ng đ
Macro Assembly (t p tin chính là:
ỉ
ươ
ợ
ạ
ữ
ể
ươ
ng mã máy d ng Obj. Đ
ươ
ươ
ả ử ụ
ng trình liên
ng trình th c thi EXE ta ph i s d ng ch
ự
ậ
ể
Link.exe. Đ chuy n t p tin th c thi d ng EXE sang t p tin th c thi
ộ
ng trình khác c a MS_DOS, đó là EXE2Bin.com. ể ế ậ ể ử ụ
ậ ộ ươ ả ậ ể ấ Có th s d ng các t p tin TASM.Exe và TLINK.Exe đ thay th cho MASM.exe và
Link.exe. Các t p tin này, và c t p tin EXE2Bin.com, có th tìm th y trong b ch
ng trình
Turbo Pascal. ị ợ ủ ứ ữ ậ Ch c năng c a các t p tin biên d ch h p ng liên quan: (cid:0) ậ ỗ ợ ị ươ ữ ậ ợ ồ ng trình h p ng ngu n sang t p tin ươ ứ T p tin MASM.exe/TASM.exe: H tr d ch ch
ng ng. ạ
mã máy d ng Obj t (cid:0) ỗ ợ ế ậ ậ ạ ậ T p tin Link.exe/TLink.exe: H tr liên k t các t p tin mã máy, d ng t p tin đ i t ố ượ
ng ậ ự (cid:0) (*.Obj), thành t p tin th c thi d ng EXE.
ể ậ ậ ế ấ ạ t theo c u trúc d ng COM, ậ ạ ạ
ỗ ợ
T p tin EXE2Bin.exe: H tr chuy n các t p tin EXE, vi
ự
thành t p tin th c thi d ng COM. ậ ậ ậ ợ ố ượ ươ ng (*.Obj), ệ ng trình h p ng sang các t p tin: t p tin đ i t
ậ ữ
ả ể ị
MASM có th d ch t p tin ch
ậ
t p tin li t kê thông tin (*.Lst), t p tin tham kh o chéo (*.Crf). (cid:0) ậ ươ ủ ng T p tin đ i t
ồ ố ượ
ợ ị
ế ể ệ
ộ ậ ể ạ t đ có th t o nên m t t p tin th c thi. Đây ng (Object File): Ch a b ng d ch mã máy c a các l nh trong ch
ữ
ự
ể ạ ự ậ ứ ả
ầ
trình ngu n h p ng , và các thông tin c n thi
là t p tin chính đ t o nên t p tin th c thi. (cid:0) ệ ế ị ủ ỉ ậ
T p tin li t kê thông tin (List File): Là m t t p tin văn b n cho bi t đ a ch offset c a ậ
ệ ộ ậ
ệ ạ ủ ệ ng trình; danh sách các ả
ươ
ộ ố ậ ươ ỗ i và m t s thông tin khác. Đây là t p ươ ng trình; các thông báo l
ng trình. (cid:0) ệ ả ươ ừ
t ng l nh trong đo n Code; mã l nh c a các l nh trong ch
tên/nhãn dùng trong ch
ơ ở ỗ ợ ệ ỡ ố
tin c s h tr vi c g r i ch
ậ
T p tin tham kh o chéo (Cross Reference File): Li ử ụ
t kê các tên s d ng trong ch ng ệ ấ trình và dòng mà chúng xu t hi n. ế ạ ợ ầ
ươ ươ
ư ề
ấ ỳ ươ ị
ng trình. Nh ng, nó cho phép chúng ta s d ng b t k ch ể ế ươ ươ ư t ch ể ử ụ
ươ ử ạ ữ
ử ụ
ng trình. Chúng ta có th s d ng ch
ỉ
t và ch nh s a ch
ươ ả
ườ ở ộ ữ ặ ợ H u h t các ch
ả
th o ch
ả
th o nào đó, nh Turbo Pascal, C,…, đ vi
ể ế
trình so n th o Notepad trên Windows (Windows XP) đ vi
ậ
ng , trong tr ỗ ợ
ng trình biên d ch h p ng 16 bít đ u không h tr màn hình so n
ạ
ng trình/màn hình so n
ng
ợ
ng trình h p
ng trình là asm (*.asm). ầ
ng h p này ta nên đ t ph n m r ng cho t p tin ch ử ụ ể ị ươ ữ ợ ươ S d ng A86 đ d ch ch ng trình h p ng sang ch ạ
ng trình d ng COM: ướ ế ươ ấ ợ ươ c h t, các b n nên vi t ch ữ
ng trình h p ng theo c u trúc ch ạ
ng trình d ng COM ế
ở ộ ư ậ ớ ạ
Tr
ầ
và l u t p tin v i ph n tên m r ng là asm. ặ ậ ữ ầ ươ ư ụ ớ ậ cùng th m c v i t p tin ả ử Các b n nên đ t t p tin ch
ị
d ch a86.com. ạ
Ở
đây chúng tôi gi ợ
ng trình h p ng c n d ch
ượ ặ ở
c đ t ị ở
E:\ASSEM. s chúng đ ử ụ ể ị ươ S d ng A86 đ biên d ch ch ng trình: ườ ẫ ậ Cú pháp : A86 [đ ng d n] Ví d :ụ E:\>\ASSEM\A86 In_Ascii.asm ề ử ổ ệ ề ể ạ ả ng h đi u hành Windows các b n ph i chuy n v c a s MSDOS
ệ ể ự ị ườ
Trên môi tr
ệ
(Cmd) đ th c hi n vi c biên d ch này. ươ ỗ ư ẽ ệ ấ ế
N u ch ng trình không có l i thì màn hình s xu t hi n thông báo nh sau: ươ ươ ậ ị ng trình đã thành công. T p tin ch t vi c biên d ch ch
ậ
ượ ươ ữ ơ ị ợ
ng trình h p
ng trình In_Ascii.COM (chính xác h n là ệ
c d ch thành t p tin ch
ớ ậ ế
Thông báo này cho bi
ng In_Ascii.asm đã đ
hình thành thêm 2 t p tin m i In_Ascii.COM và In_Ascii.SYM). ươ ị ỗ ệ ẽ ấ ỗ ế
N u ch ng trình b l i thì A86 s xu t hi n thông báo l ư
i nh sau: ế ệ ị ể ị ứ ấ ỗ
t, trong quá trình biên d ch A86 đã phát hi n th y l
ươ
ư ươ ươ
ự ng trình In_Ascii.asm sang ch i trong ch
ng trình th c thi. C ng trình
ụ Thông báo này cho bi
In_Ascii.asm, t c là, ch a th d ch ch
th :ể ế ỗ ượ t thông báo l i đã đ c ươ ậ Thông báo “Error message inserted into In_Asscii.asm” cho bi
chèn vào ngay trong t p tin ch ng trình In_Asscii.asm. ế ậ ươ t t p tin ch ố
ng trình g c ượ ổ Thông báo “Original source renamed as In_Ascii.OLD” cho bi
đã đ c đ i tên thành In_Asscii.OLD. ả ể ở ợ ườ ng h p này chúng ta ph i quay v ch ng trình Notepad đ m (Open) l ề ươ
ỉ ử ỗ ậ ế
ng trình In_Ascii.asm và ti n hành tìm và ch nh s a l ạ ậ
i t p tin
ệ
ấ
i. T p tin In_Ascii.asm xu t hi n ỗ Trong tr
ươ
ch
các dòng thông báo l ư
i nh sau: ử ỗ ạ ế ụ ị ạ ươ ầ Sau khi s a l i và ghi l i chúng ta ti p t c d ch l i ch ư
ng trình nh ban đ u. ế ợ ả ể ị ậ ữ ế ươ ự ạ ạ Chúng ta có th s d ng k t h p c 3 t p tin Masm.exe, Link.exe và EXE2Bin.com đ d ch
ộ
m t ch ậ
t theo d ng COM thành t p tin th c thi d ng COM. ể ử ụ
ợ
ng trình h p ng vi ử ụ ể ị ươ ữ ợ ươ S d ng MASM đ d ch ch ng trình h p ng sang ch ạ
ng trình d ng EXE: ươ ế ữ ủ ấ ợ ươ ạ ng trình h p ng theo c u trúc c a ch ng trình d ng ướ ế
c h t, các b n nên vi
ư t ch
ở ộ ầ ạ
Tr
ớ
EXE và l u vào file v i ph n m r ng là asm. ị ươ ồ ướ Quá trình biên d ch ch ng trình g m 2 b c: ươ ậ ố ợ ữ
ng trình h p ng sang t p tin đ i c 1ướ : Dùng MASM ho c TASM đ d ch ch ặ
ơ ư ữ ả B
ượ
t ể ị
ng ngôn ng máy. Cú pháp đ n gi n nh sau: ườ ẫ MASM [đ ng d n] ườ ẫ TASM [đ ng d n] Ví d :ụ E:\>\ASSEM\Tasm In_Ascii.asm In_Ascii.obj ươ ỗ ư ẽ ấ ế
N u ch ng trình không có l ệ
i thì TASM s xu t hi n thông báo nh trên. ế ị ươ ậ ươ t quá trình biên d ch ch ng trình đã thành công. T p tin ch ng trình ữ ượ ị ố ượ ậ ữ Thông báo này cho bi
ợ
h p ng In_Ascii.asm đã đ c d ch sang t p tin đ i t ng ngôn ng máy In_Ascii.obj. ươ ị ỗ ệ ẽ ỗ ớ ố ứ ự ủ i, cùng v i s th t ng trình b l
ị ỗ ỗ ế ấ
i thì TASM s xu t hi n thông báo l
ộ
i và n i dung l i trên màn hình, thông báo sau đây cho bi c a dòng
ị
t In_Ascii.asm b ng trình b l
i dòng 10 và 11: ế
N u ch
ươ
ch
ỗ ạ
i t
l ườ ả ợ ể ở ạ ậ ng h p này chúng ta ph i quay v ch ng trình Notepad đ m (Open) l i t p tin ử ỗ ề ươ
ỉ ế
ng trình In_Ascii.asm và ti n hành tìm và ch nh s a l i. Trong tr
ươ
ch ể ả ậ ạ ị ủ ế ệ ậ ị Chú ý: Đ MASM/TASM t o ra các t p tin LST và CRF trong khi biên d ch thì ta ph i
vi t ra tên c a các t p tin này trong câu l nh biên d ch. Ví d :ụ E:\>\ASSEM\Tasm In_Ascii.asm, In_Ascii.obj, In_Ascii.lst, In_Ascii.crf ớ ệ ả ị ươ ể ế ỗ ẽ ồ
ờ ạ
V i câu l nh d ch này Tasm s đ ng th i t o ra c 3 t p tin In_Ascii.obj, In_Ascii.lst,
ệ
ấ
ậ
In_Ascii.crf, các t p tin này r t thi ậ
t cho vi c ki m tra l ỡ ố
i và g r i ch ng trình. ướ ề ế ặ ộ ố ượ ự ộ
ng thành m t file th c c 2: Dùng Link ho c Tlink đ liên k t m t ho c nhi u file đ i t
ấ ặ
ơ B
thi duy nh t. Cú pháp đ n gi n: ể
ả ườ ẫ LINK [đ ng d n] ườ ẫ TLINK [đ ng d n] Ví d :ụ E:\>\ASSEM\TLink In_Ascii.obj; ị ỗ ươ ả ố ơ ộ ỉ i (đ i v i các ch ng trình đ n gi n ch có m t file đ i ế
ườ ướ ố ớ
ỗ ệ ẽ ấ ệ
N u vi c liên k t không b l
ượ
c này th
t ế
ng thì b ng không gây ra l i) thì màn hình s xu t hi n thông báo: Microsoft (R) Overlay Linker Version 3.64 Copyright (c) Microsoft Corp 1981, 1988. All right reserved. ế ệ ố ượ t vi c liên k t các t p tin đ i t ươ ợ ậ
ượ ị ng ch
ậ ế
Thông báo này cho bi
ữ
ng trình h p ng In_Ascii.asm đã đ
ch ươ
c d ch thành t p tin ch ậ
ng trình đã thành công. T p tin
ươ
ng trình In_Ascii.exe. ị ươ ợ ữ ươ ặ ng trình th c thi EXE ho c COM ế ư ế ả ng trình h p ng thành ch
ử ươ
ổ ạ ộ ể ể
ươ ở ạ ệ ị ế
ng trình đ ki m tra, n u k t qu không đúng nh mong
i ự
ả
ự
ng trình và sau đó th c hi n biên d ch tr l i n i dung ch Sau khi biên d ch ch
ạ
chúng ta ti n hành cho ch y th ch
ố
mu n thì ph i xem và thay đ i l
ừ ầ
đ u.
t ộ ấ ế ủ ệ ề ự ọ ậ
ầ ề ự ỗ ợ ạ ộ ệ ề
ạ ng trình Assembly
ệ
t là các h đi u hành c a
ể ậ ạ ữ ậ
ấ ấ
ấ ạ ấ ể ươ ư
ng trình này, nh ng đi m khác bi ậ
ề
ạ
ệ ớ
t l n nh t là: Các ch ạ ệ ế ữ ệ ể
ng trình c u trúc d ng EXE
ạ ộ ộ ạ ệ ươ c n p vào 3 đo n (Segment) b nh tách bi
ượ ạ
ạ
c l ệ
i, nó ch có 1 đo n mã l nh, trong đó ch a ế ạ
ạ ộ ớ
ộ
t trên b nh ;
ỉ
ớ ể ớ
ng trình d ng COM thì ng
ế c n p vào b nh đ ho t đ ng nó ch đ ộ ướ ủ ạ ượ ạ
ộ
c c a m t ch ộ ạ ớ ớ i h n c a m t đo n b nh (v i Intel 8088/80286 và MSDOS, ỉ ượ ấ
ộ
ể ượ
ươ
ng trình d ng COM không th v
ớ
ớ ứ
c c p phát
t quá
ộ
1 Segment b nh = 64KB).
ộ ể ớ ơ ộ ươ
ng trình d ng EXE có th l n h n 3 Segment b nh . Do đó,
ớ ạ
ứ ươ ữ ế ớ ươ ả ng trình khác nhau thì ta ph i thi ng trình EXE và COM, m i d ng ạ
t k c hai d ng c u trúc ch ế ế
ươ
ợ
ớ ữ ỗ ợ
ộ ươ ộ ợ ế c vi ứ ạ
ng trình l n, v i ch c năng ph c t p, trong đó có liên k t gi a các
ấ
ạ
ế ế
ng trình d ng EXE.
t k theo c u trúc ch
ỗ ạ
ươ
ấ
ị
ữ
ạ
ệ ự ớ ươ ươ ợ ộ ợ
ng trình h p ng sang
ả ử ụ
t theo c u trúc d ng EXE ta còn c n ph i s d ng
ự
ng trình th c ầ
ố
v i vi c mu n có m t ch ố
ấ
ng t ạ ả ủ ồ ợ
ả ủ ươ
ự ấ ữ ạ
ươ
ườ ợ
ề ỉ ạ
ấ
ng trình h p ng d ng COM cho th y nó
ng minh) đ u n m đây. ữ ạ
ằ ở
ầ ệ ầ ầ ợ ỉ ệ ị ợ
ầ ướ
c biên d ch thành ngôn ng máy. Ph n h
ụ ữ ồ
ượ
ữ ữ
ớ ỉ ủ
ươ
T h c l p trình Assembly Bài 3: C u trúc c a m t ch
ặ
ệ
H u h t các h đi u hành máy tính hi n nay, đ c bi
Microsoft, đ u h tr hai d ng c u trúc t p tin th c thi có th ho t đ ng trên nó, đó là t p tin
ấ
c u trúc d ng COM và t p tin c u trúc d ng EXE. Có nhi u đi m khác nhau gi a hai c u trúc
ấ
ươ
ch
ạ
ồ
g m 3 đo n: Mã l nh (Code), d li u (Data) và Ngăn x p (Stack). Khi ho t đ ng, 3 đo n này
ẽ ượ ạ
s đ
Các ch
ệ
ả
c mã l nh và ngăn x p. Vì th , khi đ
ớ
ạ
ộ
m t đo n b nh . Rõ ràng kích th
ộ
ớ ạ ủ
gi
Trong khi đó m t ch
t k các ch
khi thi
modun ch
ế ế ả
H p ng h tr thi
ị
phù h p v i m t nhóm trình biên d ch nào đó. Mu n biên d ch m t ch
ả ượ
ệ
ạ
d ng EXE thì ngoài vi c nó ph i đ
ề
ị
ộ
m t trình biên d ch phù h p. Đi u này cũng t
thi d ng COM.
ộ
ng trình h p ng d ng EXE cũng cho th y rõ nó g m 3 đo n:
Văn b n c a m t ch
ươ
Code, Data và Stack. T
, văn b n c a ch
ng t
ạ
ả
ch có 1 đo n: Code, c Data và Stack (không t
ữ
ươ
ộ
M t ch
ng trình h p ng g m hai thành ph n chính: ph n l nh h p ng và ph n ch
ẫ
ỉ
ị
ẫ
ng d n biên
d n biên d ch. Ch có các l nh là đ
ị
ượ ị
ị
c d ch sang ngôn ng máy, nó ch có tác d ng v i các trình biên d ch. Thông
d ch không đ ớ ợ ẫ ng trình biên d ch có m t nhóm h ị ợ ả ộ
ơ ỗ
ng m i ch
ướ ị ợ ị
ớ ầ
ướ ng d n biên d ch phù h p v i nó, nh ng
ế
ẫ ợ
ng d n biên d ch phù h p ươ
ữ
ướ
ẫ
ng d n biên d ch c b n và đ n gi n thì nó phù h p v i h u h t các trình biên
ữ ệ
ị ớ ượ ướ ẫ ị c gi i thi u sau đây s d ng các h ng d n biên d ch ơ ạ ả ị ử ụ
ợ
ớ
ả ẽ
ả ạ
ạ ơ
ơ ủ ự ể ng
ượ
c ị
ứ ạ ươ ệ ử ụ
ớ
ễ ọ ơ
ế
ả
ừ ơ
đ n gi n đ n ph c t p. ng trình t
ươ ạ
ng trình d ng COM:
ế ộ ộ ớ ủ ụ ị
ườ
th
ơ ả
ớ
v i các h
ử ụ
ệ
ị
d ch h p ng hi n nay. Trong tài li u này chúng tôi s d ng các h
ớ
v i trình biên d ch Microsoft Macro Assembler (MASM).
ệ
ươ
ấ
ng trình đ
C u trúc ch
ả
ị
đ nh nghĩa đo n đ n gi n (.Model, .Code, .Stack, .Data) phù h p v i MASM, TASM (Turbo
ươ
Macro Assembler), A86. Vi c s d ng đ nh nghĩa đo n đ n gi n s làm cho văn b n ch
trình sáng s a và d đ c h n. V i các đ nh nghĩa đo n đ n gi n ta cũng có th xây d ng đ
các ch
ấ
C u trúc ch
.Model ặ ạ ủ ụ ữ ệ
PROC ủ ươ ặ ạ i đây> ng trình đ t t ủ ụ ủ ụ Endp
ặ ạ i đây> ừ ng trình trên các t khóa Model, Code, ORG, Proc, Endp, End là các ươ
ị ng d n biên d ch. ươ ấ ạ ộ ng trình h p ng d ng COM ch có 1 đo n, đó chính là ệ ể ặ ở ầ ặ ở ố ươ ạ ng trình d ng COM có th đ t ữ ạ
ồ
ầ
ả
đ u ho c
ữ ệ ạ ả ơ ư
ng trình. ớ ủ ụ ươ
cu i ch
ươ
ả ặ ở ầ
đ u ch
ở ạ ở
ẽ ượ ề ậ
c đ c p tr l ỉ ẫ ORG 100h và l nhệ JMP ệ
ươ ấ ạ
ng trình d ng EXE:
ế ộ ộ ớ ữ ệ ặ ạ ủ ụ PROC ủ ươ ặ ạ .Code
Endp
ặ ạ i đây> ừ ng trình trên các t khóa Model, Code, Data, Stack, Proc, Endp, End là các ộ ồ ng trình h p ng d ng g m 3 đo n: đo n Code, ch a toàn ươ
ạ ữ ạ
ầ ạ
ng trình. Đo n Data, ch a ph n khai báo d li u c a ch ủ ế ạ
ữ ệ ủ
ươ ươ
ượ ạ ng trình đ ứ
ng trình.
ộ
c n p vào b ng trình khi ch ủ
ơ
ạ ộ ươ đ u ch ng trình v i m c đích khai báo kích th ướ ng trình sau này. Kích th ớ
ng đ c th ướ ủ
c c a Stack dùng cho ụ ớ ọ
ng trình d ng COM và EXE v i m c đích ươ c ch n là 100h (256) byte.
ạ
ươ
ng trình s d ng. ươ ả ợ ự ạ ạ ng trình h p ng đ n gi n, d ng COM và d ng EXE, cùng th c ụ
ườ
ượ
ượ ặ ở ầ ả ấ
đ u c c u trúc ch
ử ụ
ữ ơ
ả ư ụ ệ ủ ụ
ệ
Nguyen Kim Le Tuan Nguyen Le Tram Thanh
Nguyen Le Tram Uyen
ụ ỉ ướ ẫ
ng d n biên ố ạ ọ
ấ ượ ướ
ng trình d
ạ i đây ch có tác d ng minh h a cho vi c s d ng các h
ơ ấ ạ ạ ạ ư ầ ữ
ậ ở ợ ắ ắ ữ ủ
c trình bày ngay sau đây. ạ ấ ế ng trình vi t theo c u trúc d ng COM: ệ ử ụ
ươ
Hai ch
ị
ể
ả
ị
d ch đ nh nghĩa đo n đ n gi n và giúp các b n th y đ
c nh ng đi m gi ng nhau, khác nhau
ươ
ữ
ng trình d ng COM và EXE, vì v y,
gi a hai d ng c u trúc ch
đây các b n ch a c n quan
ầ ệ
ệ
ế
tâm đ n ý nghĩa c a các l nh và các hàm/ng t trong nó. Ph n l nh h p ng và các hàm/ng t
ẽ ượ
s đ
ươ
Ch
.Model Small
.Code
ORG 100h
Start:
Jmp Main
MyChildren DB ‘Nguyen Kim Le Tuan’,0Ah,0Dh
DB ‘Nguyen Le Tram Thanh’,0Ah,0Dh
DB ‘Nguyen Le Tram Uyen’,’$’
Main PROC
; in ra mot xau voi ham 09/21h
Mov Ah, 09h
Lea Dx, MyChildren
Int 21h
; ket thuc chuong trinh
Int 20h ủ ụ ớ ươ ủ ụ ủ ọ
ủ ng trình này ch n ch đ b nh Small. Tên th t c chính là Main (tên th t c chính là
ng trình là Start (tên th t c chính là tùy ý), đó chính là nhãn c a ủ ụ
ế ế ộ ộ
ươ
ữ ệ ể ọ ắ ắ ươ ộ
ể ế ng trình. Có th g i ng t 20h ạ ấ ng trình vi ọ
ủ
ng trình này g i hàm 4Ch c a ng t 21h đ k t thúc ch
ạ
ươ
ng trình d ng COM.
t theo c u trúc d ng EXE: ở ạ ế ộ ộ ươ ớ ầ ng trình này ch n ch đ b nh Small. Khai báo kích th ữ ệ ượ ặ ế ở ọ
c đ t trong đo n Data, ướ
c Stack là 100h byte. Ph n
ộ
đây ch khai báo m t bi n, đó là MyChildren. ạ
ủ ụ ề ầ ủ ạ ạ ỏ ọ ng trình là tr thanh ghi đo n DS v đ u đo n Data, hay còn g i là ở ạ ạ ư ử ụ ng trình d ng EXE s d ng đ nh ộ ố ớ ấ
ế ươ
ạ ạ ả ạ
ả ọ ủ ấ ắ
c xem nh là b t bu c đ i v i c u trúc ch
ươ
ng trình vi ị
t theo c u trúc d ng EXE ph i g i hàm 4Ch c a ắ ươ ạ ươ ạ ỉ ể ấ
ầ ướ ầ ệ ng trình d ng COM và c u trúc ch
ế ầ ố Main Endp
End Start
Ch
tùy ý). Nhãn chính c a ch
ỉ
ầ
ệ
l nh Jmp. Ph n khai báo d li u ch khai báo m t bi n, đó là MyChildren.
ươ
Ch
ể ế
đ k t thúc các ch
ế
ươ
Ch
.Model Small
.Stack 100h
.Data
MyChildren DB ‘Nguyen Kim Le Tuan’,0Ah,0Dh
DB ‘Nguyen Le Tram Thanh’,0Ah,0Dh
DB ‘Nguyen Le Tram Uyen’,’$’
.Code
Main PROC
; kh i t o DS
Mov Ax, @Data
Mov DS, Ax
; in ra mot xau voi ham 09/21h
Mov Ah, 09h
Lea Dx, MyChildren
Int 21h
; ket thuc chuong trinh
Mov Ah, 4Ch
Int 21h
Main Endp
END Main
Ch
ỉ
khai báo d li u đ
ủ ụ
Tên th t c chính là Main (tên th t c chính là tùy ý).
ươ
ầ
Thao tác đ u tiên c a ch
kh i t o thanh ghi đo n DS:
Mov Ax, @Data
Mov DS, Ax
ượ
thao tác này đ
ơ
nghĩa đo n đ n gi n. Các ch
ể ế
ng t 21h đ k t thúc.
ấ
Có th th y, c u trúc ch
ị
ẫ
ph n h ấ
ng trình d ng EXE ch khác
ng d n biên d ch, ph n khai báo bi n và ph n l nh thao tác chính hoàn toàn gi ng ươ ng trình đ n gi n ị ủ ố
ộ ả ở
ể ở ế
ự bi n là MyChildren và các
ở
(xâu này chính là giá tr kh i ế ị ữ ươ ượ ị ở
c d ch b i ng trình đ ế ộ ộ ọ ử ụ ạ ộ
ệ ớ
ạ ữ ệ ạ ớ ạ ậ ủ ộ
ộ ộ ộ ế ầ
ề ộ
ế ộ ộ
ươ ề
ỉ
ể ứ
ng trình đ u ch có th ch a
ể ố
ỉ
ng trình ch có th t
i đa là hai
ữ
ợ
ươ
ng trình h p ng .
ớ
ạ ươ
ươ
ế
ơ
ng trình có th chi m nhi u h n m t đo n b nh . Trong khi ỉ ộ ạ ạ ớ ộ ộ ạ ề ế ơ
ng trình có th chi m nhi u h n m t đo n b nh . Trong khi ỉ ạ ạ ơ ạ ế ể ủ ộ
ươ ợ ộ ả ề
ữ ệ ộ
ạ
ng trình đ u có th chi m nhi u h n m t đo n b
ướ ớ
ể ị
c l n ộ
ề
ng h p này không th đ nh nghĩa m t m ng d li u có kích th ộ ợ ả ư ườ ươ ể ị ng t ữ
ng h p này có th đ nh nghĩa m t m ng d ơ ệ ượ ầ ự ư
nh Large, nh ng trong tr
ướ ớ
c l n h n 64 Kbyte.
ơ
ớ ọ ớ ả
ợ ấ
ữ ử ụ ơ ự
ế
ng trình l a ch n.
c h u h t các ch
ả
ng trình h p ng s d ng đ nh nghĩa đo n đ n gi n: Khi đ ượ ạ
c n p vào
ươ ươ ạ ớ ể
ụ ể ươ
ị
ạ
ỏ ề
đ ng tr v các đo n ch
ạ ứ ị ộ ng trình t
ạ
ạ ớ ứ
ủ ủ
ứ ị ỉ
ể ả ộ ỉ ủ ạ ộ ỉ ạ
ạ ươ ộ ớ
ng trình EXE vào b nh DOS luôn dành ra 256 byte
ể ứ
ươ
ng trình, đ ch a PSP (Program Segment
ầ ươ ủ ế ng trình. PSP ch a các thông tin c n thi t mà trình biên d ch chuy n đ n cho ạ
ạ
ươ
ớ
ứ ị
ng trình. Thanh ghi đo n SS ch a đ a ch segment c a đo n b nh
ươ
ng trình.
ạ
, khi n p ch
ấ
ứ
ự ị
ươ ệ ệ ệ ặ ế
ng trình này, đ c bi
ỉ t, ch
ủ ể ướ ươ ả c ượ
ỉ ệ
ủ ươ ủ ớ ứ
ng trình đ
ng trình mà ả ặ ệ ở ng trình chúng ta ph i đ t ngay hai l nh sau đây ươ ươ
i đo n Data ch
t theo c u trúc EXE: ủ ấ ả ệ ạ ớ ở ị ỉ trên, đ a ch segment c a t ế
t c các bi n khai báo
ử ề ượ ứ ế c ch a trong thanh ghi DS, do đó, trong các thao tác x lý bi n sau
ầ ạ
ươ ủ ị ỉ ướ ữ ợ ử ụ
ng trình s d ng các h
ế
ợ ị
ữ ệ ạ ầ ợ ị ơ
trên hoàn toàn gi ng nhau
nhau. Hai ch
ắ
ọ
ệ
l nh g i hàm 09h c a ng t 21h đ in ra màn hình m t xâu kí t
ạ ủ
t o c a bi n MyChildren).
ợ
Chú ý 1: Trình biên d ch h p ng (Macro Assembler) cho phép các ch
nóc h n s d ng m t trong các ch đ b nh sau:
ủ
Small: Đo n mã l nh (Code) và đo n d li u (Data) c a ch
ướ ủ
ớ ứ
c c a ch
trong m t đo n (segment) b nh . T c là, kích th
ớ
đo n b nh . Tuy v y ch đ b nh này đ dùng cho h u h t các ch
ể
ủ
ạ
Medium: Đo n Code c a ch
ớ
ế
ể
đó, đo n Data ch có th chi m 1 đo n b nh .
ể
ủ
ươ
ạ
Compact: Đo n Data c a ch
ớ
ế
ể
đó, đo n Code ch có th chi m 1 đo n b nh .
Large: Đo n Code và đoan Data c a ch
ườ
ư
ớ
nh . Nh ng trong tr
ơ
h n 64 Kbyte.
Huge: T
li u có kích th
ế ộ ộ
Ch đ b nh Small là đ n gi n nh t, đ
ươ
Chú ý 2: V i các ch
ạ ẽ ự ộ
ạ ộ
ộ
b nh đ ho t đ ng thì các thanh ghi đo n s t
ng
ứ
ủ
ng. C th : Thanh ghi đo n CS ch a đ a ch segment c a đo n b nh ch a đo n Code c a
ươ
ớ
ng trình. Thanh ghi đo n DS (và có th c ES) ch a đ a ch segment c a đo n b nh
ch
ủ
ạ
ứ
ch a đo n Data c a ch
ủ
ứ
ch a đo n Stack c a ch
ự ế
Tuy nhiên, trong th c t
ớ
ủ
ầ
đ u tiên c a vùng nh , mà DOS c p phát cho ch
ể
Prefix) c a ch
ươ
ể ỗ ợ
DOS đ h tr DOS trong vi c th c hi n ch
ng trình cũng có
ả ư ị
ớ
ấ
th truy xu t vùng nh PSP. Do đó, DOS ph i đ a đ a ch segment c a vùng nh ch a PSP
ươ
ượ
ứ
ự
c th c hi n. T c là, ngay khi ch
ng trình đ
c khi ch
vào c DS và ES tr
ạ
ạ
ứ ị
ả
ớ
ộ
n p vào b nh DS không ph i ch a đ a ch segment c a đo n Data c a ch
ủ
ỉ
ứ ị
ch a đ a ch segment c a PSP.
ạ
ề ạ
ể ỏ
ậ
Vì v y, đ tr DS v l
ấ
ế
ầ
đ u ch
ng trình vi
Mov Ax, @Data
Mov DS, Ax
ở ạ
V i vi c kh i t o thanh ghi đo n DS
trong đo n Data đ u đ
ữ
ế
ng trình không c n quan tâm đ n đ a ch segment c a nó n a.
này ch
ị
ẫ
ươ
Chú ý 3: H p ng còn cho phép các ch
ng d n biên d ch đ nh nghĩa
ị
ớ ầ
đo n toàn ph n, các đ nh nghĩa này phù h p v i h u h t các trình biên d ch h p ng hi n nay. ợ ạ ề t ch ứ ự ươ
ể ng trình h p ng tr nên m m d o và linh
ươ ộ ươ ươ ữ ở
ạ
các đo n ch
ớ ẻ
ế ợ
ng trình, k t h p
ậ
ng trình trong b nh ,... , ngay trong khi l p ị ẫ ủ ướ ử ụ ế ề ng d n biên d ch nói chung và các ụ
t v cách s d ng và m c đích s d ng c a các h ầ ạ ề Ở ệ ề ậ
ụ ướ ấ
c v nó thông qua ví d d ấ
ệ ơ ượ ề
i thi u s l ử ụ
ễ
ỉ ớ
đây chúng tôi ch gi ị ộ ẫ ạ ướ ử ụ ị
ng d n biên d ch đ nh nghĩa ạ ươ
ng trình d ng EXE s d ng các h
ớ ở ạ ủ ế ị ỉ ầ ệ ề ễ ế ấ ầ ầ ử ụ ươ ư ạ ả ơ ị ươ
ng trình s d ng đ nh nghĩa đo n đ n gi n (hai ch ng trình này
ươ
ng trình ậ
ố
trên). ử ụ ướ ạ ẫ ị ầ Segment ... ng trình này s d ng h
ể ị ươ ạ ạ t là: S_Seg (đo n stack), D_Seg (đo n ở ị
ng d n biên d ch đ nh nghĩa đo n toàn ph n
ầ ượ
c đ nh nghĩa ượ ử ụ ươ ị c s d ng đ báo cho trình biên d ch bi ạ
đây là tùy ý.
ế ch
t
ạ Assume đ
ủ ng trình
ỏ ạ
ị
ỉ ướ
ố ạ ị
ế
ệ
ầ
Đ nh nghĩa đo n toàn ph n giúp cho vi c vi
ể ề
ạ ơ
ườ ậ
ho t h n, nó giúp ng
i l p trình có th đi u khi n th t
ạ
ế
ạ
các đo n ch
ng trình, liên k t các đo n ch
trình.
Chi ti
ị
đ nh nghĩa đo n toàn ph n nói riêng d dàng tìm th y trong r t nhi u tài li u v l p trình
ữ
ợ
i đây.
h p ng [1], [2].
Ví d :ụ Sau đây là m t ch
ợ
ầ
đo n toàn ph n (phù h p v i Macro Assembler):
S_Seg Segment Stack
DB 100h DUP (?)
S_Seg Ends
D_Seg Segmet
MyChildren DB ‘Nguyen Kim Le Tuan’,0Ah,0Dh
DB ‘Nguyen Le Tram Thanh’,0Ah,0Dh
DB ‘Nguyen Le Tram Uyen’,’$’
D_Seg Ends
C_Seg Segment
ASSUME CS:C_Seg, SS:S_Seg, DS:D_Seg
Main PROC
; kh i t o DS
Mov Ax, D_Seg
Mov DS, Ax
Mov Ah, 09h
Lea Dx, MyChildren ; đ a ch offset c a bi n MyChildren
Int 21h
Mov Ah, 4Ch
Int 21h
Main Endp
C_Seg Ends
END Main
Đi u d nh n th y đ u tiên là ph n khai báo bi n và ph n l nh chính trong ch
hoàn toàn gi ng nh trong ch
ụ ở
ví d
ươ
Ch
ớ
ng trình v i tên l n l
Ends đ đ nh nghĩa 3 đo n ch
ạ ượ ị
ủ
Data), C_Seg (đo n Code). Tên c a các đo n đ
ể
ẫ
H ng d n biên d ch
ươ
ứ ị
ng trình trong các thanh ghi đo n nào (tr thanh
mu n ch a đ a ch segment c a các đo n ch ỉ ạ ạ ươ ng trình). C th ỉ ủ ạ
ạ ứ ị
ạ ạ ạ ứ ị
ủ ủ ạ ỉ ị ươ ả ạ ự ế ỉ
ự ộ
đ ng n p đ a ch segment c a D_Seg vào DS, do đó
ệ ằ ng trình ph i n p tr c ti p b ng các l nh: ụ ẫ ỉ ị không ươ ể ạ ị ạ
ng trình nào ng d n biên d ch
ế
ỉ ị ượ ạ ươ ế ộ ớ
c n p vào b nh ng trình đ t đo n đ ạ
ỏ ề ẽ ượ ạ ề
ụ ể ở
ghi đo n v đo n ch
đây là: Thanh ghi đo n CS ch a đ a ch segment
ạ
ủ
c a đo n Code (CS:C_Seg). Thanh ghi đo n SS ch a đ a ch segment c a đo n Stack
ứ ị
(SS:S_Seg). Thanh ghi đo n DS ch a đ a ch segment c a đo n Data (DS:C_Seg). Tuy nhiên,
trong th c tự ế Assume DS:D_Seg không t
ch
Mov Ax, D_Seg
Mov DS, Ax
ị
ớ ướ
Segment ... Ends ch có tác d ng đ nh nghĩa đo n, nó
Nên nh , h
ộ
ạ ượ ị
ạ
t đo n đ
th báo cho trình biên d ch bi
c đ nh nghĩa thu c lo i đo n ch
ị
(Code, Data, Stack, Extra). Ch có đ nh nghĩa
Segment Stack ... Ends là báo cho trình biên d ch
ờ
ạ ượ ị
c đ nh nghĩa là đo n Stack, nh đó, khi ch
bi
ạ
c tr v đo n này.
thanh ghi đo n SS s đ ự ọ ậ ủ ậ ệ
T h c l p trình Assembly Bài 4: T p l nh assembly c a Intel 8086/8088 (1) Ộ Ố Ệ Ơ Ở M T S L NH ASSEMBLY C S Cú pháp l nh:ệ ữ ầ ủ ồ ộ ệ ầ ố ợ M t l nh h p ng đ y đ g m b n thành ph n sau đây: ệ ờ ả [Nhãn l nh:] i thích] Trong đó: ự ứ ệ ấ c câu l nh (k t thúc b i d u hai ch m ( : Là m t dãy các kí t ướ
đ ng tr
ệ ở ấ
ẽ
ặ ế
ạ ệ ộ
ế ỉ ủ ị ị :)),
c ch đ nh thay th cho đ a ch c a câu l nh trong các đo n l nh l p, r nhánh,... Do đó, ầ ệ
[Nhãn l nh:]
ỉ
ượ
nó đ
ỉ ượ ử ụ
c s d ng khi c n.
nó ch đ ươ ủ ữ ể ợ
ủ ủ ụ ộ
ể ươ Trong m t ch
không th trùng v i tên c a các th t c trong ch ệ
ng trình h p ng không th có hai nhãn l nh trùng tên, tên c a các nhãn cũng
ớ
ng trình. ộ ậ ệ ữ ệ ợ ớ ợ : Là m t trong các l nh thu c t p l nh h p ng (l nh g i nh : Mnemonic) ệ
ệ ệ ự ệ ữ ệ ữ ỗ ợ
ng trình h p ng m i ữ ườ
ả ượ ặ ỗ ệ ợ
ỉ ữ
L nh h p ng không phân bi
t ch hoa hay ch th
ộ ệ
ể ứ
dòng ch có th ch a m t l nh và m i l nh ph i đ ươ
ng. Trong ch
ộ
c đ t trên m t dòng. ố ượ ệ ợ ộ : Là đ i t ữ ủ
ạ ạ ộ ế
ọ ứ ứ ạ ạ ạ ộ ệ
ng mà l nh tác đ ng vào. M t l nh h p ng c a Intel
ạ
ặ
ướ ọ
c g i là [Toán h ng đích], toán h ng đ ng sau g i là [Toán ạ
ộ ằ ể ạ ồ [Các toán h ng]ạ
ể
8088/8086 có th không có toán h ng, có m t toán h ng, ho c có hai toán h ng. N u có hai
toán h ng thì toán h ng đ ng tr
ố
ạ
h ng ngu n]. [Toán h ng đích] không th là m t h ng s . ế ể ạ ợ ườ ng ạ ỉ ữ ủ
ộ ố ệ
M t s l nh h p ng c a các Intel 80286/80386/... có th có đ n 3 toán h ng, trong tr
ộ
ợ
h p này cũng ch có m t [Toán h ng đích]. ườ ọ ụ ế ỉ : Ch có tác d ng v i ng i đ c ch t và ng i vi i thích] ươ
ả ứ ờ ị ượ ớ
ờ ả
[;L i gi
ớ
ý nghĩa v i trình biên d ch, t c là, không đ ườ
ượ ị
c d ch sang mã máy. L i gi ng trình, nó không có
ườ
c
i thích th ng đ ủ ệ ườ ế ấ ầ ờ ả ả ằ i vi t th y c n). L i gi i thích ph i n m ể
ử ụ
s d ng đ làm rõ ý nghĩa c a câu l nh (khi ng
ấ
ấ
sau d u ch m ph y ( ả ;). ệ Ví d 1:ụ Xét l nh sau đây: ị ặ
Lenh_VD: Mov AX,BX ; đ t giá tr thanh ghi BX vào thanh ghi AX Trong đó: (cid:0) ườ ợ ự ượ ử ụ ệ ng h p này dãy kí t Lenh_VD đ c s d ng làm nhãn l nh cho Lenh_VD: Trong tr ồ ườ ạ ợ ng h p này toán h ng là các ệ
l nh Mov.
(cid:0) Mov: Là tên l nh.ệ
(cid:0) AX và BX: Là các toán h ng (đích và ngu n). Trong tr
ạ
thanh ghi đa năng 16 bít. (cid:0) ờ ả ệ i gi i thích cho l nh này. Trong “đ t giá tr thanh ghi BX vào thanh ghi AX”: ườ ệ ặ
ự ế ờ
l th c t i gi ị
ả
i thích th ế
ng là ti ng Vi Là l
ấ
t không d u. ệ Ví d 2:ụ Xem các l nh sau đây: ệ ạ NOP ; đây là l nh không có toán h ng ệ ạ ạ Mov Ax, Bl ; l nh này có hai toán h ng, [Toán h ng đích] là thanh ạ ồ ; ghi 16 bít, [Toán h ng ngu n] là thanh ghi 8 bít ệ ạ ạ Add Cl, Spt ; l nh này có hai toán h ng, [Toán h ng đích] là thanh ế ạ ộ ồ ; ghi 8 bít, [Toán h ng ngu n] là m t bi n byte ệ ạ ạ Mov Ax, [SI] ; l nh này có hai toán h ng, [Toán h ng đích] là thanh ạ ộ ồ ớ ; ghi 16 bít, [Toán h ng ngu n] là m t ô nh ệ ạ ạ Sub Dl, ‘a’ – ‘A’ ; l nh này có hai toán h ng, [Toán h ng đích] là thanh ộ ằ ạ ồ ; ghi 8 bít, [Toán h ng ngu n] là m t h ng s ố ệ ạ ạ IMul Ax, Bx, 20 ; l nh này có ba toán h ng, [Toán h ng đích] là thanh ạ ồ ; ghi 16 bit (Ax), [Toán h ng ngu n] là thanh ghi 16 bít ộ ằ ố ; (Bx) và m t h ng s (20) ở ộ ệ ự ư ử ệ trên là m t l nh nhân m i c a vi x lý Intel 80286. L nh này th c hi n nh sau: ớ ủ
ồ ế ạ ớ ị ả ứ ở ỉ ấ ế ệ
ạ
ả ứ ở
[Toán h ng đích]
ể
ấ ủ
thanh ghi Ax (ch l y 16 bít th p c a tích đ L nhệ Imul
ộ
ấ
l y n i dung/giá tr hai [Toán h ng ngu n] nhân v i nhau, k t qu ch a
ệ
(trong l nh trên là: Bx*20, tích k t qu ch a
ư
đ a vào Ax)). ệ 1. L nh Mov (Mov e): ệ Cú pháp l nh: ạ Mov [Toán h ng đích ồ ]
ạ
], [Toán h ng ngu n Trong đó: ỉ ủ ể ạ ơ ớ ị ế ể ạ ằ ộ ớ ộ [Toán h ng đích]: Có th là thanh ghi (8 bít hay 16 bít), ô nh (chính xác h n là đ a ch c a
ố
m t ô nh ) hay m t bi n nào đó. [Toán h ng đích] không th là h ng s . ể ằ ạ ố ơ ớ ồ ị ộ ỉ ủ
ế
[Toán h ng ngu n]: Có th là h ng s , bi n, thanh ghi, ô nh (chính xác h n là đ a ch c a
ớ
m t ô nh ) nào đó. ạ ặ ộ ộ ồ ị ủ
ị ấ
ạ ổ Tác d ng:ụ L y n i dung (giá tr ) c a [Toán h ng ngu n] đ t vào [Toán h ng đích]. N i dung
ạ
ồ
ủ
c a [Toán h ng ngu n] không b thay đ i. Ví d 1:ụ ặ ị Mov Ax, 5 ; Ax ß 5: đ t giá tr 5 vào thành ghi Ax ặ ị Mov Ax, 5*2 ; Ax ß 5*2: đ t giá tr 10 vào thành ghi Ax Mov Bx, (80*(Dong 1) + (Cot 1))*2 ; Dong, Cot là các bi nế ủ ặ Mov Dl, ‘A’ ; Dl = 41h: đ t mã ASCII c a ‘A’ vào thanh ghi Dl ị ủ ế ặ Mov Cx, Var1 ; Cx = Var1: đ t giá tr c a bi n Var1 vào thanh ghi Cx ị ủ ặ Mov Ax, Bx ; Ax = Bx: đ t giá tr c a thanh ghi Bx vào Ax ị ủ ặ Mov Ax, Dl ; Ax = Dl: đ t giá tr c a Dl (8 bít) vào Ax (16 bít) ợ ệ Mov Bl, Dx ; Bl = Dx: không h p l , vì: Dx (16 bít) mà Bl (8 bít) ợ ệ ượ ớ ạ Mov Dl, 300 ; Dl = 300: không h p l , vì 300 v t gi i h n 1 byte ớ ạ ị ạ ớ ỉ ượ s DI = 100; Ô nh t i đ a ch offset 100 trong đo n nh Data (đ ỉ ở
c ch b i DS) ự ứ Ví d 2:ụ Gi
ch a kí t ả ử
B. Thì : ặ ị Mov Ax, DI ; (1) đ t giá tr thanh ghi DI vào thanh ghi Ax: Ax = 100 ớ ượ ủ ộ ỉ ở Mov Ax, [DI] ; (2) Ax = ặ ộ ứ ị ủ ứ ớ ủ
ỉ
; ch đ a ch offset c a ô nh )>. T c là, đ t n i dung c a ớ ượ ỉ ở ; ô nh đ c ch b i DI vào thanh ghi Ax: Ax = 41h ệ ự ế ộ ị ử ụ ữ ệ ệ ỉ t s khác nhau gi a hai l nh trên: L nh (1) s d ng ch đ đ a ch thanh ghi. ế ộ ị ử ụ ế ệ ỉ Hãy phân bi
L nh (2) s d ng ch đ đ a ch gián ti p thanh ghi. ế ộ ị ỉ ỉ ể
ư ậ ệ ươ ứ ứ ạ ỉ ng ớ ạ ằ
i r ng: Trong ch đ đ a ch gián ti p thanh ghi, các thanh ghi ch có th là BX, DI, SI
ạ
ỉ
ớ ệ ệ ế
Nh l
ị
(đ a ch đo n ch a trong DS) hay BP (đ a ch đo n ch a trong SS). Nh v y l nh (2) t
ươ
đ ị
ư
ng v i l nh (3) nh ng khác l nh (4): Mov Ax, DS:[DI] ; (3) Mov Ax, ES:[DI] ; (4) Ví d 3:ụ ặ ộ ớ ượ ỉ ở Mov Ax, [SI] ; đ t n i dung ô nh đ c ch b i SI vào thanh ghi Ax ị ủ ớ ượ ặ
Mov [DI], Bx ; đ t giá tr c a thanh ghi bx vào ô nh đ ỉ ở
c ch b i DI ợ ệ ệ ể ể Mov [DI], [SI] ; [DI] ß [SI] : l nh không h p l , vì: không th chuy n ự ế ớ ộ ộ ớ ộ ủ
; n i dung c a ô nh vào m t ô nh m t cách tr c ti p ế ặ ị Mov Var1, Ax ; Var1 ß Ax : đ t giá tr t/ghi Ax vào bi n word Var1 Chú ý: ệ ả ưở ế L nh Mov không làm nh h ờ
ng đ n các c . ợ ệ ệ ể ữ ệ ể Mov DS:[DI], ES:[SI] ; l nh không h p l , vì: không th chuy n d li u ự ế ớ ớ ữ ạ ộ ; tr c ti p gi a hai toán h ng b nh v i nhau ợ ệ ệ Mov DS, ES ; DS ß ES: l nh không h p l , ợ ệ ệ ể Mov ES, 0100 ; l nh không h p l , vì: ể
không th chuy n ự ế ộ ằ ạ ố ; tr c ti p m t h ng s vào thanh ghi đo n. ể ể ể ượ ị ủ ủ ạ ộ ớ ộ Đ chuy n giá tr c a hai thanh ghi đo n hay n i dung c a hai ô nh ta có th m n m t
thanh ghi đa năng làm trung gian: ủ ệ ể ạ ộ Mov Ax, ES ; hai l nh này chuy n n i dung c a thanh ghi đo n ES ạ Mov DS, Ax ; vào thanh ghi đo n DS thông qua thanh ghi Ax ị ủ ủ ổ ộ ớ ườ ể
ng, đ hoán đ i giá tr c a hai thanh ghi đo n hay n i dung c a hai ô
ử ụ Theo cách thông th
ườ
nh ng i ta th ạ
ườ
ng s d ng hai thanh ghi đa năng làm trung gian: ư ạ ớ ượ ộ ỉ ở Mov Ax, [DI] ; l u t m n i dung ô nh đ c ch b i DI và Ax ư ạ ớ ượ ộ ỉ ở Mov Bx, [SI] ; l u t m n i dung ô nh đ c ch b i SI và Bx ị ủ ớ ượ ể Mov [DI], Bx ; chuy n giá tr c a t/ghi Bx và ô nh đ ỉ ở
c ch b i DI ị ủ ớ ượ ể Mov [SI], Ax ; chuy n giá tr c a t/ghi Ax và ô nh đ ỉ ở
c ch b i SI ố ệ ổ ộ ủ ạ ớ ượ ỉ ở
c ch b i ụ
ứ ị ủ ớ ỉ B n l nh trên có tác d ng hoán đ i n i dung c a hai ô nh trong đo n Data (DS) đ
DI và SI (DI và SI ch a đ a ch Offset c a các ô nh ). ể ệ ạ ạ Không th dùng thanh ghi đo n CS làm [Toán h ng đích] trong l nh Mov. ệ 2. Các l nh Inc – Dec – Add và Sub Cú pháp l nh:ệ (cid:0) (cid:0) ạ
ạ
ạ
ạ Inc [Toán h ng đích
]
(cid:0) Add [Toán h ng đích
ồ ]
ạ
],[Toán h ng ngu n
(cid:0) Dec [Toán h ng đích
]
ồ ]
ạ
],[Toán h ng ngu n
Sub [Toán h ng đích ạ ạ ồ ươ ự ệ ng t l nh Mov. Trong đó: [Toán h ng đích], [Toán h ng ngu n]: t Tác d ng:ụ (cid:0) ạ ơ (cid:0) ị ủ ả ạ ố (cid:0) ấ ạ ồ ủ ế ạ ặ ạ L nhệ Inc (Increment): làm tăng giá tr c a [Toán h ng đích] lên 1 đ n v .
ị
ị ủ
ị
L nhệ Dec (Decrement): làm gi m giá tr c a [Toán h ng đích] xu ng 1 đ n v .
ơ
ị ộ
ủ
L nhệ Add (Addition): l y giá tr /n i dung c a [Toán h ng ngu n] c ng vào giá tr /n i
dung c a [Toán h ng đích], k t qu này đ t vào l ộ (cid:0) ị ộ ị ộ
ả
ị ộ L nhệ Sub (Subtract): l y giá tr /n i dung c a [Toán h ng đich] tr đi giá tr /n i dung
ủ
ạ ấ
ế ả ạ ặ ồ ạ
ạ
i [Toán h ng đích]. ủ
c a [Toán h ng ngu n], k t qu này đ t vào l ạ
i [Toán h ng đích].
ừ Ví d 1:ụ ặ ị Mov Ax, 121 ; đ t giá tr 121 vào thanh ghi Ax ặ ị Mov Bx, 223 ; đ t giá tr 232 vào thanh ghi Bx ơ ị Inc Ax ; Ax = Ax + 1: tăng Ax lên 1 đ n v (Ax = 122) ả ố ơ ị Dec Bx ; Bx = Bx + 1: gi m Bx xu ng 1 đ n v (Bx = 222) Sub Ax, Bx ; Ax = Ax – Bx : Ax = 100 Add Ax, 120 ; Ax = Ax + 120 : Ax = 20 Mov Cx, Ax ; Cx= Ax : Cx = 20 ị ố ủ ệ ặ Dãy l nh trên, đ t giá tr cu i cùng c a thanh ghi Ax vào thanh ghi Cx (Cx = 20). Ví d 2:ụ ị ế ơ ị
Inc Spt ; Spt = Spt + 1; tăng giá tr bi n Spt lên 1 đ n v ớ ượ ỉ ở ơ Inc DS:[SI] ; tăng ndung ô nh đ ị
c ch b i DS:SI lên 1 đ n v ị ế ộ Add Ax, Var1 ; Ax = Ax + Var1; c ng giá tr bi n Var1 vào Ax ế ế ạ Add Var2, Dx ; Var2 = Var2 + Dx. Bi n Var2 là bi n d ng word ớ ượ ộ ộ ỉ ở Add Dx, [SI] ; c ng thêm n i dung ô nh đ c ch b i SI vào Dx ợ ệ ệ ể Add [DI], [SI] ; [DI] = [DI] + [SI] : l nh không h p l , vì: không th ự ế ớ ớ ộ ộ
; c ng tr c ti p n i dung hai ô nh v i nhau. ầ ủ ệ ể ượ ; Yêu c u c a l nh trên có th đ c vi ế ạ
t l ư
i nh sau: ư ạ ớ ượ ộ ỉ ở Mov Ax, [SI] ; l u t m n i dung ô nh đ c ch b i SI và Ax ư ạ ớ ượ ộ ỉ ở Mov Bx, [DI] ; l u t m n i dung ô nh đ c ch b i DI và Bx ả ứ ở ế ộ Add Bx, Ax ; c ng Ax và Bx, k t qu ch a Bx ặ ế ả ộ ạ ớ ượ Mov [DI], Bx ; đ t k t qu phép c ng vào l i ô nh đ ỉ ở
c ch b i DI ị ủ ủ ộ ộ ớ ạ ị ỉ i đ a ch offset 0100 ạ Ví d 3:ụ C ng thêm giá tr c a thanh ghi Ax vào n i dung c a ô nh t
trong đo n DS: ề ỏ ớ Mov DI, 0100 ; tr DI v ô nh offset 0100 ư ạ ớ Mov Bx, DS:[DI] ; l u t m ndung ô nh DS:DI vào thanh ghi Bx ộ Add Bx, Ax ; c ng thêm Ax vào Bx ặ ế ả ạ ớ Mov DS:[DI], Bx ; đ t k t qu vào l i ô nh DS:DI (DS:0100) ườ ể ử ụ ợ Trong tr ng h p này ta có th s d ng l nh ệ Add DS:[DI],Ax. ữ ệ ộ ớ ộ i ô nh ộ
ứ
ớ 0B800:0100 trong b nh có ch a m t word d li u. Hãy tăng n i
ộ ơ ả ử ạ
s t
ớ ủ Ví d 4:ụ Gi
ị
dung c a ô nh này lên m t đ n v . ể ể ượ
Mov Ax, 0B800h ; m n thanh ghi Ax làm trung gian đ chuy n ạ ủ ớ ầ ấ ị ỉ Mov ES, Ax ; đ a ch đo n c a ô nh c n truy xu t vào ES ặ ị ớ ầ ủ ấ ỉ Mov DI, 01 ; đ t đ a ch offset c a ô nh c n truy xu t vào DI ớ ầ ề ấ ọ ọ ỏ ắ
;; (g i ng n g n: tr ES:DI v ô nh c n truy xu t) ể ạ ớ ầ ộ Mov Dx, ES:[DI] ; chuy n t m n i dung ô nh c n tăng vào Dx ơ ị ị
Inc Dx ; tăng giá tr thanh ghi Dx lên 1 đ n v ặ ị ạ Mov ES:[DI], Dx ; đ t giá tr Dx đã tăng vào l ớ ầ
i ô nh c n tăng ả ử ạ ị ữ ệ ể ộ ớ ộ s t ứ
ỉ 0A00:0100 trong b nh có ch a m t byte d li u. Hãy chuy n i đ a ch
ớ Ví d 5:ụ Gi
ủ
ộ
n i dung c a ô nh này vào thành ghi AL. ỏ ặ ệ Mov Ax, 0A00h ; (1); Các l nh (1), (2), (3) tr c p thanh ề ớ ị ỉ Mov ES, Ax ; (2); ghi ES:DI v ô nh có đ a ch 0A00:0100 ị ỉ Mov DI, 0100h ; (3); trong đó 0A00 là đ a ch Segment và ệ ể ị ỉ ộ
; ; 0100 là đ a ch Offset. L nh (4) chuy n n i ớ ượ ỉ ở Mov Al, ES:[DI] ; (4); dung ô nh đ c ch b i ES:DI vào Al. ả ử ạ ị ế ộ s t ứ
ỉ 0100:0100 trong b nh có ch a 2 word d li u liên ti p (hai ô
ồ ấ i đ a ch
ổ ữ ệ
ả ớ
ớ ế ớ ộ ớ ạ ị i đ a Ví d 6:ụ Gi
ế
nh liên ti p). Hãy tính t ng n i dung hai word nh này, r i l y k t qu ghi vào ô nh t
chỉ 0100:0120. Mov Ax, 0100 ề ầ ỏ ặ ớ Mov ES, Ax ; tr c p thanh ghi ES:SI v đ u vùng nh ầ ấ Mov SI, 0100 ; c n truy xu t. ớ ứ ế ỏ ặ ề ả Mov DI,0120 ; tr c p thanh ghi ES:DI v ô nh ch a k t qu ớ ở ộ ; ; các ô nh này trong cùng m t Segment ư ạ ớ ầ ộ Mov Ax, ES:[SI] ; l u t m n i dung ô nh đ u tiên vào Ax ớ ế ế ộ ộ Add Ax, ES:[SI+2] ; c ng n i dung ô nh k ti p vào Ax ế ả ớ Mov ES:[DI], Ax ; ghi k t qu vào ô nh 0100:0120 ử ụ ở ế ộ ị ụ ể ỉ ộ ế ớ ị trên s d ng ch đ đ nh đ a ch b nh gián ti p, c th là ử ụ ỉ ụ ỉ ụ ỉ ị L nhệ Add Ax, ES:[SI+2]
ị
đ nh đ a ch ch m c (s d ng thanh ghi ch m c SI). ể ấ ữ ệ ủ ộ ớ ể ứ ị ộ ặ ụ
ử ụ
ả ườ ủ ọ ọ ộ ử ụ ấ
ể ấ ặ ỏ ớ ộ
ắ ơ ả
Qua 3 ví d 4, 5, 6 ta có th rút ra nguyên t c c b n khi truy xu t d li u/n i dung c a m t ô
ợ
ỉ
nh là: S d ng m t c p thanh ghi thích h p (DS:DI, DS:SI, ES:DI, ES:SI,...) đ ch a đ a ch
ỏ ề
ớ ầ
ng g i là tr v
logic (g m c Segment và Offset) c a ô nh c n truy xu t. Thao tác này th
ớ
ủ
ô nh c n truy xu t. Sau đó s d ng c p thanh ghi này đ ghi/đ c n i dung c a ô nh đã
ượ
đ ồ
ớ ầ
c tr t i. ớ ầ ấ ả ộ ộ ộ i đó là m t Byte hay m t ấ ọ ế ế ớ ị
Ngoài ra, khi truy xu t ô nh c n ph i xác đ nh d li u/n i dung t
Word và n u là truy xu t đ c thì k t qu s đ ạ
ữ ệ
ả ẽ ượ ư
c l u vào đâu (thanh ghi hay ô nh ). Chú ý 1: ợ ạ ườ ể ộ ự ế ả ử ụ ng h p này ph i s d ng các (cid:0) ớ ộ ệ ớ ể ự
ả ả ử ụ ộ
i vào k t qu ) ph i s d ng l nh L nhệ Add th c hi n phép c ng không nh . Đ th c hi n phép c ng có nh (c ng
ệ ADC (ADD with
ế ươ v i l nh Sub và SBB [2 180]. ệ
ớ
ự ớ ệ
ng t
ộ ệ ố ị ộ AAA (Ascii Adjust for Addition) và DAA (Decimal Adjust for ự ớ ươ ừ ế ỉ , v i phép tr trên ng t ả ử ụ ố ả ố
ệ AAS và DAS [2 183]. Chú ý 2: (cid:0) ề ử ộ ạ ượ ể ứ Các thanh ghi c a vi x lý Intel 8086/8088 đ u là 16 bít, nên đ ch a m t đ i l ữ ả ệ ườ ượ ử ụ ứ ng d
ng là các thanh ghi đa năng (thanh ghi tích lũy):
ấ
c s d ng nh t, khi đó Ax ch a 16 bít ng đ ứ ấ ủ ạ ượ
ố ể ử ụ ườ ừ ể ộ
ả ự ư ừ ừ ệ ấ ộ
ả ế ộ
ấ ượ ừ ế ệ ề ấ ộ ủ
li u 32 bít nó ph i dùng 2 thanh ghi, th
ườ
ặ
Ax, Bx, Cx, Dx. C p thanh ghi Dx:Ax th
th p, Dx ch a 16 bít cao c a đ i l
ng 32 bít.
(cid:0) Đ c ng/tr trên các s 32 bít ta không th s d ng Add/Sub theo cách thông th
ng,
ế
mà ph i th c hi n nh sau: C ng/Tr 16 bít th p, sau đó C ng/Tr 16 bít cao. N u phép
ỉ
ớ
C ng/Tr trên 16 bít th p xu t hi n bít nh /bít m n thì ph i ti n hành đi u ch nh k t ể ế ừ ử ụ ờ ể ế ộ
t phép C ng/Tr có ớ ả ẻ
qu , n u không k t qu s sai. S d ng các phép ki m tra c đ bi
ượ
xu t hi n bít nh /bít m n hay không [1 477]. ủ ệ ả ứ ướ ệ c l nh l p Loop không quá 126 ệ ự ẽ ặ ạ ng trình s l p l ầ ệ
ơ ệ
ỗ ầ ặ ệ
ươ
i vi c th c hi n các l nh sau ặ ể ươ ớ ố ầ ặ ặ ẽ ừ
c s d ng đ cài đ t các đo n ch ự ữ ậ ặ
ươ ạ
ng trình l p v i s l n l p xác
ặ
các vòng l p For trong các ngôn ng l p ng t ườ
c cho tr ạ ệ ầ i 4 l n ệ ộ ủ ầ ế i vi c c ng 10 vào Ax đ 4 l n
ầ ặ ạ
ộ
ặ ạ
ầ ầ ụ ể L n 1: Ax = 6 + 10; L n 2: Ax = 16 + 10; L n 3: Ax ạ ệ
ầ ặ ạ ầ i 4 l n ộ ị ị ặ ạ ủ ệ ầ ệ
i các l nh sau nhãn l nh Lap_TT đ 4 l n ệ ặ ượ ằ
c thay b ng Bx = 7 ạ ệ ế ầ ầ L n 3: Ax = 13 + ầ ệ ệ ươ ẽ ế ạ ng trình s quay l ự
i (n u Cx <> 0) th c hi n l nhAdd
ự ủ ệ ả t nhiên khi đó nó cũng ph i th c hi n l ệ ạ ệ Inc
i l nh ệ ể ả ệ
ả ượ ặ ườ ủ ể ệ i ta th ư
c l p theo ki u nh ấ
ự
ặ
ế
ng vi
t nhãn c a các l nh ph i đ
ộ ệ
ạ ệ ả ế
ệ
ấ
ự ọ ậ
ậ ệ
T h c l p trình assembly Bài 4: T p l nh assembly c a Intel 8086/8088 (2)
ệ
3. L nh LOOP
Cú pháp:
Loop ầ ặ ạ i 5 l n ị ầ ệ ệ ủ ộ
ặ ạ i các l nh sau nhãn l nh TT đ 5 l n ế ạ ệ ầ ầ ế
ầ k t thúc) và Dx = 21
L n 3: Dx = Dx + Cx = 15 + ầ ệ ự ượ ớ ỉ i đ a ch offset 100 trong đo n nh Data (đ ỉ ở
ộ ọ
ơ ồ ớ ộ ị ữ ệ
ả t c các ô nh trong m ng này. ỏ ặ ề ớ ầ ấ ặ ầ ả ồ ớ ớ ỉ ở ư ị ớ
i ô nh DS:DI ặ
ỉ ế
ặ ạ ủ ớ ế ế
ầ ể ử ụ ợ ự ế
ụ ượ ữ ề t th ự ồ ế
ớ
ự này sang vùng nh b t đ u t ỏ ặ ề Mov Dx, 6
Mov Cx, 5 ; l p l
TT:
Add Dx, Cx ; c ng thêm giá tr thanh ghi Cx vào thanh ghi Dx
Loop TT ; l p l
;;
Mov Bx, Cx
ặ
K t thúc đo n l nh trên Bx = Cx = 0 (khi Cx = 0 thì vòng l pLoop TT
(L n 1: Dx = Dx + Cx = 6 + 5;L n 2: Dx = Dx + Cx = 11 + 4;
ầ
3; L n 4: Dx = Dx + Cx = 18 + 2;L n 5: Dx = Dx + Cx = 20 + 1 = 21).
Ví d 4:ụ Các l nh sau đây th c hi n phép gán:
ệ
Ax = 2 + 4 + ...+ 100
Mov Ax, 0
Mov Bx, 2
Mov Cx, 50
Lap_TT:
Add Ax, Bx
Add Bx, 2
Loop Lap_TT
ạ
Ví d 5:ụ Gi
ả ử ạ ị
s t
c ch b i thanh ghi đ an DS)
ả
ỗ
ộ
ứ
có ch a m t m ng d li u, g m 100 ô nh , m i ô là m t byte. Hãy c ng thêm 50 đ n v vào
ớ
ấ ả
t
Mov DI, 0100 ; tr c p thanh ghi DS:DI v
; vùng nh c n truy xu t (DS:0100)
;
Mov Cx, 100 ; l p 100 l n vì m ng g m 100 ô nh
Lap_TangThem:
ấ
Mov Dl, DS:[DI] ; l y nôi dung ô nh ch b i DS:DI l u vào DL
ộ
Add Dl, 50 ; c ng thêm 50 vào Dl
ạ
Mov DS:[DI], Dl ; đ t giá tr đã tăng thêm vào l
ớ
Inc DI ; ch đ n ô nh k ti p (vì ô nh byte nên tăng 1)
ủ
ớ
ệ
Loop Lap_TangThem ; l p l
i đ 100 l n (duy t qua đ 100 ô nh )
ộ
ệ Add DS:[DI], 50 đ tăng tr c ti p n i dung
ể
ườ
Trong tr
ng h p này ta có th s d ng l nh
ế
ủ
ư
ơ
ườ
ớ ợ
c áp d ng h n, vì tính
ng đ
c a ô nh , h p ng cho phép đi u này. Nh ng cách đã vi
ớ
ủ
ự ế
ộ
ạ
ổ
ủ
t ng quát c a nó. Nói chung, chúng ta nên h n ch tác đ ng tr c ti p lên nôi dung c a ô nh .
ả ử ạ ị
Ví d 6:ụ Gi
ự ứ
ộ
ứ
ộ
ỉ
(t c
g m 50 kí t
s t
i đ a ch 0100:0C00 trong b nh có ch a m t xâu kí t
ỉ
ớ ắ ầ ạ ị
ỗ
ớ
ồ
là, g m 50 ô nh , m i ô 1 byte). Hãy copy xâu kí t
i đ a ch
0200:0100.
Mov Ax, 0100
Mov DS, Ax ; tr c p thanh ghi DS:SI v ầ ớ ư ỏ ặ ế ề
ả ớ ứ ồ ầ ặ ự ể ớ ượ ể ườ c ô nh đ ỉ ở ng kí t
ớ ượ ự ừ
t
c ch b i ES:DI ế ự ế ượ
ỉ ở
ể ầ ể ủ ặ ạ ủ ụ i đ 50 l n (đ copy
ớ ớ ả ằ ở ự
đ 50 kí t )
ớ ứ ế
ồ
c n copy (vùng nh ngu n) và vùng nh ch a k t
ả ử ụ
hai đo n (segment) nh khác nhau, do đó, ta ph i s d ng ộ ể ể ụ ấ ữ ệ ắ ơ ả ớ ả ế ượ ế ư ệ
c xem nh l nh l p
ế ề ặ ự
ự ế ợ
ự ệ
ụ ể ệ ề ộ ặ
ệ
ặ
ệ
, h p ng còn có các l nh l p có đi u ki n, nó cho phép k t thúc
c khi Cx = 0 d a vào m t đi u ki n nào đó. C th : l nh LoopE (Loop while ươ ự ệ
ệ
ệ
i khi Cx <> 0 và c ZF = 1; l nh LoopZ (Loop while Zero): t LoopE; ờ
ỉ ặ ạ ờ
i khi Cx <> 0 và c ZF = 0;... [2 154]. ng t ̣ ́ ́ ̣ ̣ ̀ ̀
́ ́ ́ ́ ̀ ̣ ̣ ̣ ̉ ̉ ̣ ̉ ̣ ́ ̀ ệ ̣ ̉ ̣ ̉ ̉ ̣ ̣ ́ ́ ̣ ̣ ̉ ̣ ̉ ̉ ̣ ̀ ̀ ượ ử
ượ ử ươ ợ ̣ ̀
̀
ươ
ng đ
ng trinh. Thanh ghi đ ̀ ̉ ̣ ̣ ̀ ̀ ̉ ̣ ̉ ̀
̀ ́ ̉ ̣ ̉ ̉ ́ ̀ ̀ ươ ượ ̣ ̉ ̀
c goi la tro DI va đâu ̀
ng đ ́ ́ ượ ượ ̣ ̣ ̣ ̣ c nap vao bô nh đê hoat đông thi cac biên đ ́
c khai bao trong ch ́ ̀ ́
ơ ̉
́
ơ ́
ơ ̣ ̣ ̣ ̣ ̣ ̉ ̣ ̀
ng trinh đ
ượ
́ ́ ́ ̀ ̀ ̀ ̃
ư ̣ ươ ̉ ̉ ̉ ̣ ̣ ̀
ng trinh phai xac đinh đ
́ ̀
́
́
̀ ̀ ̉ ̉ ̣ ̉ ̉ ̣ ̉ ầ
Mov SI, 0C00 ; đ u vùng nh ch a xâu c n copy (0100:0C00)
Mov Ax, 0200
Mov ES, Ax ; tr c p thanh ghi ES:DI v
Mov DI, 0100 ; vùng nh ch a xâu k t qu copy 0200:0100
;
Mov Cx, 50 ; l p 50 l n vì xâu g m 50 kí t
Lap_Copy:
Mov Bl, DS:[SI] ; m n Bl đ chuy n t
Mov ES:[DI], Bl ; ch b i DS:SI sang ô nh đ
ti p theo
Inc SI ; chuy n đ n kí t
Inc DI
Loop Lap_Copy ; l p l
ự ầ
ớ ứ
Trong ví d này, vùng nh ch a xâu kí t
ạ
ớ
qu copy (vùng nh đích) n m
ạ ữ ệ
hai thanh ghi đo n d li u khác nhau: DS và ES.
Qua 2 ví d 5 và 6 ta có th rút ra nguyên t c c b n đ truy xu t d li u trên m t vùng
ớ
nh /m ng nh :
ệ
ặ
Chú ý: L nh Loop th c hi n vòng l p cho đ n khi Cx = 0, vì th nó đ
ữ
ề
không đi u ki n. Th c t
ướ
vòng l p tr
ỉ ặ ạ
Equal): Ch l p l
LoopNE (Loop while Not Equal): Ch l p l
4. Lênh LEA (LoadEffectiveAddress)
́
́
Cu phap:
́
LEA [Toan hang đich],[Toan hang nguôn]
̀
́
Trong đo:́ [Toan hang đich]: La cac thanh ghi 16 bit. [Toan hang nguôn]: La đia chi cua môt
̀
́
́
ơ
vung nh hay tên cua môt biên.
̀
́
́
ụ
L nh LEA có tác d ng chuyên đia chi offset cua [Toan hang nguôn] vao [Toan hang
Tac dung:
́
̃
́
ượ
c s dung đê lây đia chi offset cua môt biên đa đ
c khai bao trong
đich]. Lênh nay th
̀
̀
̀
ơ ở
ươ
ch
ng h p nay la thanh ghi c s (BX) va thanh
c s dung trong tr
ghi chi muc (SI va DI).
́
Vi du 1:
Lea Bx, DS:[0100] ; chuyên thanh phân đia chi offset (0100) vao Bx
Lea DI, XauKT ; chuyên đia chi offset cua biên XauKT vao DI
̀
; thao tac nay th
; biên XauKT
̀
ươ
Khi ch
̃
̀
trinh se đ
đê thao tac đên d liêu trên cac biên cua ch
̀
chi segment vao offset (hai thanh phân cua đia chi logic) cua biên. Lênh LEA ́
ươ
ng
̀
́
ư
c đinh vi (câp phat vung nh ) tai môt đia chi xac đinh trong vung nh Data. T đây,
́
ượ
ươ
c đia
ng trinh thi ch
́
ở
trên chi lây ́ ́ ́ ́ ượ ̣ ̉ ̉ ̉ ̣ ̉ ̉ ̣ ̣ ́
ơ
c đia chi segment cua no ta co thê s dung lênh Mov v i ́ ́ ́ ́ ơ ử c đia chi offset cua biên, đê lây đ
ự
ử ̣ ̣ ̉ ̣ ̉ ̉ co thê s dung lênh Mov v i toan t ́ ̀ ̉ ử
́ Seg (t
́ ươ
ng t
́ ̣ ̣ ̣ ̉ ̉ ̉ ́ ư ̣ ̉ ̉ ̀ ̀ ư ̣ ̉ ̉ ̀ ượ ́
ư ̣ ̉ ́
c khai bao nh sau: ̃
́
TenGom (la biên kiêu byte) đa đ Gia s biêń
̉ ử ́ ̣ ́ ̣ ́ ́ ́ ̀ ́ ́ ̉ ̣ ̣ ̣ ̉ ́ ́ ́ ́
ư ử ̣ ̉ ̉ ̣ ự
́ ́
̀ ̀ ̉ ̣ ̉ ̉ ̣ ̉ ́
́
̀ ́ ́ ̣ ử ượ ơ ̣ ̣ ̣ ̣ ̉ ̉ ̣ ́ ́ ́ ự ư ự ̣ ̣ ̣ ̉ ̣ ̣ ̀
́
(t c la, ́
Gia s tai đia chi 0100:0C00 trong bô nh co ch a môt xâu ki t ́
gôm 50 ki t
̀ ư
̀ ̃ ̉ ử
́
ơ ̀
ươ ự ̣ ng trinh. ơ
nay vao môt biên trong ch
́ ̀
́ ̀ ̀ ̀ ́ ́
́
̣ ơ ̉ ̣ ng trinh phai khai bao môt biên byte co đô l n 50 byte: ̉ ̣ ̀ ̀ ́
ơ ư ̉ ̣ ̀ ́ ̉ ươ ̉ c ́
̀
ô nh đ
̉ ở ượ
̉ ở ́ ự ̉ ượ
̉ ử
đ
́
Offset đê lây đia chi offset cua
toan t
́
̀
biên). Vi du: Cac lênh sau lây đia chi Segment:Offset cua biên XauKT (hay tro DS:SI vê đâu
́
biên XauKT):
Mov Ax, Seg XauKT ; đ a đia chi Segment cua biên XauKT
Mov DS, Ax ; vao thanh ghi DS
Mov SI, Offset XauKT ; đ a đia chi Offset cua biên XauKT vao SI
́
Vi du 2:
TenGom DB ‘Nguyen Kim Le Tuan’
Xem cac lênh sau đây (1):
Mov Bx, 0
Mov Al, TenGom[Bx] ; Al =‘N’
Add Bx, 7 ;
Mov Bl, TenGom[Bx] ; Bl =‘K’
Xem cac lênh sau đây (2):
Lea DI, TenGom
Mov Al, [DI] ; Al =‘N’
Mov Bl, [DI + 7] ; Bl =‘K’
̀
̀ ́
ươ
ươ
Ta co thê thây, nhom cac lênh (1) va nhom cac lênh (2) la t
ng đ
ng nhau vê tac dung cua
̀
́
́
ử
ử
cua no; (2): s dung thanh
no, nh ng (1): s dung tr c tiêp tên biên đê truy xuât đên cac phân t
́
̀
́
ợ
ươ
ử
cua biên. Trong tr
ghi chi muc DI đê truy xuât đên cac phân t
ng h p nay đia chi segment
́
̀
̀
ợ
̉ ở
măc đinh đ
c chi b i DS, điêu nay phu h p v i viêc s dung đia chi gian tiêp thanh ghi chi
muc.
́
Vi du 3:
̀
́
̃
gôm 50 ô nh , môi ô 1 byte). Hay copy xâu ki t
́
ươ
ơ
V i yêu câu nay ch
LuuTru DB 50 Dup (‘ ‘)
Mov Ax, 0100
Mov DS, Ax ; tro căp thanh ghi DS:SI về
̀
Mov SI, 0C00 ; đâu vung nh ch a xâu cân copy (0100:0C00)
;
Mov Ax, Seg LuuTru ; tro căp thanh ghi ES:DI về
Mov ES, Ax ; đâu biên LuuTru
Lea DI, LuuTru
;
Mov Cx, 50
Lap_Copy:
́
̀
ơ ượ
ự ư
Mov Bh, DS:[SI] ; m n Bh đê chuyên t
t
ng ki t
́
ơ ượ
Mov ES:[DI], Bh ; chi b i DS:SI sang ô nh đ
c chi b i ES:DI
́
́
tiêp theo
Inc SI ; chuyên đên ki t ́ ̀ ̣ ̣ ̉ ̉ ̉ ự
đu 50 ki t ) ́ ̀ ̃ ́ ư ̣ ̉ ̣ ̣ ợ
́ ̀ ́ ́ ̀ ́
ơ ư ̣ ̣ ̃
̣ ư ̣
̀ ́ ươ ự ̣ ̣ ̣ ̣ ́
ng t ́ ư Inc DI
Loop Lap_Copy ; lăp lai đu 50 lân (đê copy
Chu y:́ ́ H p ng con cung câp cac lênh LDS (Load Pointer use DS) đê lây
́
́
nôị dungtoan hang bô
̀
nh 32 bit đ a vao cac thanh ghi 16 bit (măc đinh 16 bit cao vao thanh ghi đoan d liêu DS); va
ư măc đinh 16 bit cao vao thanh ghi đoan
lênh LES (Load Pointer use DS) t
LDS nh ng
̃
ư ̣
d liêu (th hai) ES [2 137]. ự ọ ậ ủ ậ ệ
T h c l p trình assembly Bài 4: T p l nh assembly c a Intel 8086/8088 (3) ̣ 5. Lênh Mul va Div̀ ́ ́ Cu phap: ̣ (cid:0) ̣ ̣ (cid:0) ̣ ́ ́ ̀ ́ ̀ ́ ́
́
ơ ơ ̣ ̉ ̣ ̣ ̀ ̀ ́ ́ ́ ̀ ́ ̣ ̣ ̣ ̣ ̣ Trong đo:́ [Toan hang nguôn]co thê la thanh ghi hay ô nh . V i cac lênh nhân: [Toan hang
́
́
ơ
đich] ngâm đinh la thanh ghi Al hoăc Ax. V i cac lênh chia: [Toan hang đich] la môt trong cac
thanh ghi đa năng Ax, Bx,... ́ ̣ Tac dung: ́ ̀ ́ ́ ́ ́ ự ̣ ̣ ́ ́ ̀ ́
ơ ̣ ̣ ̣ ̉ ̣ ̣ ́ ̉ ̀
Lênḥ
Mul (Multiply): Th c hiên phep nhân trên sô không dâu. Nêu [Toan hang nguôn] la
́
́
́
toan hang 8 bit thi lênh se nhân nôi dung cua [Toan hang nguôn] v i gia tri thanh ghi AL, kêt
́
ư ở
qua 16 bit ch a ̀
̃
thanh ghi Ax. ́ ̀ ̀ ́ ̃ ̀ ̣ ̣ ̣ ̣ ̉ ̣ ́ ́ ̀ ̀ ở ̣ ̉ ̣ ́
̀
Ax, phân cao ́
́
́ ̀ ́ ̀ ̀ ̀ ̉ ̉ ̣ ́
́
ơ
Nêu [Toan hang nguôn] la toan hang 16 bit thi lênh se nhân nôi dung cua [Toan hang nguôn] v i
́
́
ở
ư ở
gia tri thanh ghi Ax, kêt qua 32 bit ch a
căp thanh ghi Dx:Ax, phân thâp
Dx.
̀
́
ơ
Nêu phân cao cua kêt qua (AH hoăc DX) băng 0 thi cac c CF = 0 va OF = 0. ́ ự ự ư ̣ ̣ ng t ́
lênh Mul nh ng th c hiên phep nhân trên hai sô IMul (Interger Multiply): T
́
̀ ́ ́ ́ ́ ̉ ̣ Lênḥ
́
co dâu. Kêt qua cũng la môt sô co dâu. ươ ́ ́ ́ ́ ̀ ́ ự ̣ ̣ ́ ́ ̣ ̣ ̣ ̉ ̣ ̣ ̃ ́
́ ́
́ ́ ́ ́
́
ư ư ́
́
ư ̀
Lênḥ
Div (Divide): Th c hiên phep chia trên sô không dâu. Nêu [Toan hang nguôn] la
̀
̀
toan hang 8 bit thi lênh se lây gia tri cua thanh ghi Ax (sô bi chia) chia cho [Toan hang nguôn]
̉ ươ
(sô chia), kêt qua th ng sô ch a trong thanh ghi Al, sô d ch a trong thanh ghi Ah. ́ ́ ̀ ́ ́ ́ ̣ ̣ ̣ ̣ ̉ ̣ ̣ ̀ ́ ́ ́ ́ ̃ ́
̉ ươ ́
ư ̣ ́ư ́
̀
̀
Nêu [Toan hang nguôn] la toan hang 16 bit thi lênh se lây gia tri cua căp thanh ghi Dx:Ax (sô bi
́
ư
chia) chia cho [Toan hang nguôn] (sô chia), kêt qua th
ng sô ch a trong thanh ghi Ax, sô d
ch a trong thanh ghi Dx. ́ ́ ́ ́ ươ ượ ̉ ̣ ̉ t qua gi ́
ơ
i han cua thanh ghi AL (chia 8 bit) hay ́
ng sô v
̃ ́ ̃ ́ ̀ Nêu phep chia cho 0 xay ra hay th
Ax (chia 16 bit) thi CPU se phat sinh lôi “Divice overflow”. ́ ́ ự ư ự ̣ ̣ ng t lênh ́
Div nh ng th c hiên phep chia trên hai sô co ̀ ́ ́ ́ ́ ̉ ươ
Lênḥ
Idiv (Integer Divide): T
́
̀
́
dâu. Kêt qua cung la cac sô co dâu. ́ ̣ Vi du 1: ̀ ́ ̣ ̣ Mul Bl ; Ax ßAL * Bl: sô bi nhân ngâm đinh trong Al ́ ̀ ̣ ̣ Mul Bx ; Dx:Ax ßAx * Bx: sô bi nhân ngâm đinh trong Ax ́ ́ ́ ́ ươ ư ư ư Idiv Bl ; Ax/Bl, th ng sô ch a trong Al, sô d ch a trong Ah ́ ́ ́ ươ ư ư Idiv Bx ; Dx:Ax/Bx, th ng sô ch a trong Ax, sô d trong Dx ̃ ̃ ́ ́ ̀ ̀ ́ ự ̣ ̣ ̣ ́
Day cac lênh d ́
́
ươ
i đây se th c hiên phep gan A = 4*A – 3*B, trong đo A va B la cac ̉ ́
Vi du 2:
́
biên kiêu word: ́ ́ ̉ ượ ư Mov Ax, 4 ; sô nhân phai đ c ch a trong Ax ́ ự ̣ IMul A ; th c hiên phep nhân ̀ ́ ư ̣ ̉ Mov Bx, Ax ; l u tam kêt qua vao Bx Mov Ax, 3 ; Ax = 3 Imul B ; Ax = Ax * B Sub Bx, Ax ́ ̀ ̀ ́ ̣ ̉ Mov A, Bx ; đăt kêt qua cuôi cung vao A ̀ ̃ ̀ ́ ̀ ́ ̃ ̉ ử ợ ̣ ượ ̉ ̉ ̉ ng tran đa không xay ra va kêt qua phep nhân chi ̀
ươ
ng h p nay ta đa gia s hiên t
Trong tr
́ư
ch a trong thanh ghi Ax. ́ ́ ́ ự ̣ ̣ ̣ Cac lênh sau đây th c hiên phep: chia 123 cho 24: Vi du 3: ̀ ́ ̣ ̣ Mov Ax, 123 ; đăt sô bi chia vao Ax ́ ̀ ̣ ́
Mov Bl, 24 ; đăt sô chia vao Bl (thanh ghi 8 bit) ́ ̀ ́
̉ ư ở
Idiv Bl ; chia Ax cho Bl, kêt qua ch a Al va Ah ̃ ̃ ́ ́ ́ ̀ ̀
ư ự ̣ ̣ ̣ ̣ Day lênh d ́
́
ươ
i đây se th c hiên phep gan A = N! (tinh N giai th a). A la môt biên ́
Vi du 4:
word: ́ ̉ ư ̉ ̣ ̉ Mov Ax, 1 ; chuân bi Ax đê l u kêt qua ́ Mov Cx, N ; tinh N! LapNhan: Mul Cx ; Ax ßAx * Cx Loop LapNhan ; ́ ́ ̀ ̉ ̉ Mov A, Ax ; tra kêt qua vao biên A ̀ ́ ́ ́ ̉ ử ợ ượ ́
ơ ̉ ̣ Trong tr ̀
ươ
ng h p nay chung ta gia s kêt qua không v ́
t qua g i han 16 bit. ́ ́ ̃ ́ ̀ ̀ ̀ ̀ ́ ̉ ử ở ̉ ̉ ̣ ̣ ̣ ́
ơ ự
̀ ́ ́ ư ̉ ́
̀
Chung ta đa biêt: N! = 1 nêu N = 1, N! = N*(N1)*(N2)*...*1 nêu N>1, điêu nay hoan toan phu
́
ợ
h p v i s thay đôi cua thanh ghi CX trong lênh lăp Loop. Do đo,
đây ta co thê s dung CX
̀
ư
ư
nh la N trong biêu th c tinh giai th a. ́ ̃ ̀ ́ ợ ư ̣ ̉ ̉ ́ ả
̀ ̀ ̀ ̣ ̣ ̉ ̉ ́ ́ ̀ ̀ ̉ ̣ ̣ ̀ ́ ́ ́ ̃ ́
ợ ̣ ̉ Chu y:́ ́ H p ng cung câp lênh AAM (Ascii Adjust for Multiple) đê điêu chinh kêt qu phep
́
́
nhân trên 2 sô BCD dang không dôn. Va lênh AAD (Ascii Adjust for Division) đê điêu chinh kêt
̀
qua phep chia trên 2 sô BCD dang không dôn. Ngoai ra con co lênh CBW (Convert Byte to
́
́
Word) va lênh CWD (Convert Word to Doubleword) đê hô tr cho phep chia trên cac sô co dâu
[2 – 187200]. ́ ́ ́ ́ ̃ ̀ ử ̣ ̉ ̣ ̣ ́ ́ ́ ̀ ́ ́ ̣ ̣ ̉ ̣ ́
Lênh IMul cua vi x ly Intel 80286 cho phep ghi ro [Toan hang đich], [Toan hang nguôn] trong
câu lênh, cac lênh nay co thê co đên 3 toan hang [1 541]. ̣ 6. Lênh logic: NOT – AND – OR – XOR – TEST ̀ ́ ́ ́ ́ ́ ́ ̉ ự ̉ ̣ ̣ ̣ ́
c khi tim hiêu vê cac lênh logic chung ta xem lai kêt qua th c hiên cac phep tinh logic trên ươ
́ ̀ ̣ ̉ ̀
Tr
2 bit nhi phân A va B thông qua bang sau đây: A B A And B A Or B A Xor B NotA 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 0 ́ ́ ́ ́ ́ ́
ơ ̉ ̉ ̉ ̉ ̉ ́
́ ́ ́ ́ ́ ́ ̉ ̉ ̉ ̉ ́ ̀ ́ ̀ ́
ơ ́
ơ
Bang trên cho thây: V i phep And: kêt qua = 1 chi khi ca hai bit = 1; V i phep Or: kêt qua = 0
́
́
ơ
chi khi ca hai bit = 0; V i phep Xor: kêt qua = 0 khi hai bit giông nhau, kêt qua = 1 khi hai bit
khac nhau. V i phep Not: 0 thanh 1, 1 thanh 0. ́ ́ Cu phap: ̣ ̣ ̣ ̣ ̣ ̣ ̣ (cid:0) ́
́
́
́ ̣ ̣ ́ ́ ́ ́ ̀ ̀ ự ̣ ̣ ̉ ́
̀ ́ ́ ́ ̀ ́
ơ ̣ ̉ ̣ ̉ Trong đo:́ [Toan hang đich], [Toan hang nguôn] co thê la hăng sô (tr c hăng), biên, thanh ghi
̀
̀
́
hay đia chi ô nh . [Toan hang đich] không thê la hăng sô. ́ ̃ ̀ ́ ́ ́ ́ ́ ̣ ̣ ̣ ̣ ́
ng ng vê vi tri) ́ ươ ư
́ ự
́ ́ ̀ ươ ư
̉ ượ ̉ ̣ ̣ ̣ ̣ ̀
́ ́ ́ ́ ́ ́ ́ ́ ̣ ̣ ̉ ̉ ̣ ̣ ́ ́ ̀ ̉ ́
ng ng trên cac bit (t
Môi lênh logic th c hiên phep tinh logic t
Tac dung:
́
̀
́
c ghi vao lai [Toan hang đich]. Riêng
cua [Toan hang đich] va [Toan hang nguôn], kêt qua đ
̀
lênh Not, th c hiên phep đao bit ngay trên cac bit cua [Toan hang đich]. Hâu hêt cac lênh logic
đêu anh h ự
̀
ơ
ưở
ng đên cac c CF, OF, ZF,... ́ ̀ ́ ượ ư ̣ ̣ ̉ ̣ ̉ ̣ c t ng bit trong nôi dung cua [Toan hang ̀ ̀ ́ ́ ́ ̣ ̉ ự
Lênḥ
ưở
đich]. Lênh nay không lam anh h Not (Logical Not): Th c hiên viêc đao ng
̀
ơ
ng đên cac c . ́ ́ ượ ử ̣ ̣ ̉ ̣ ̣ ̉ ̣ Lênh Not th ̀
ươ
ng đ ̀
c s dung đê tao dang bu 1 cua [Toan hang đich]. ̀ ́ ́ ̀ ́ ự ư ̣ ̣ ̣
ng ng vê vi ́
ươ ư
And (Logical And): Th c hiên phep tinh logic And trên t ng căp bit (t
́
́ ́ ́ ̀ ́ ̀ ́ ́ ̉ ư ́
ơ ̉ ̣ ̣ ̣ Lênḥ
tri) cua [Toan hang nguôn] v i [Toan hang đich], kêt qua l u vao [Toan hang đich]. ́ ́ ̀ ́ ̀ ́ ượ ử ̣ ̣ ̉ ̣ ̣ ̣ ̣ ̀
ươ
ng đ c s dung đê xoa (= 0) môt hoăc nhiêu bit xac đinh nao đo trong môt Lênh And th
thanh ghi. ́ ̀ ́ ư ự ̣ ̣ ́
ng ng Or (Logical Inclusive Or):Th c hiên phep tinh logic Or trên t ng căp bit (t ươ ư
́ ̀ ́ ̀ ́ ̀ ́ ́ ́
́ ̉ ư ́
ơ ̣ ̉ ̣ ̣ ̣ Lênḥ
́
vê vi tri) cua [Toan hang nguôn] v i [Toan hang đich], kêt qua l u vao [Toan hang đich]. ́ ̀ ̀ ́ ́ ́ ̣ ̉ ̣ ̣ ̣ ̣ ̣ Lênh Or th ̀
̀
ươ
ng dung đê thiêt lâp (= 1) môt hoăc nhiêu bit xac đinh nao đo trong môt thanh ghi. ̀ ́ ́ ̀ ́ ư ự ̣ ̣ ̣
ng ng vê vi ́
ươ ư
Xor (eXclusive OR):Th c hiên phep tinh logic Xor trên t ng căp bit (t
́
́ ̀ ́ ́ ́ ́ ́ ̀ ̉ ư ́
ơ ̉ ̣ ̣ ̣ Lênḥ
tri) cua [Toan hang nguôn] v i [Toan hang đich], kêt qua l u vao [Toan hang đich]. ̃ ̀ ́ ́ ́ ́ ̣ ̉ ̣ ̉ ̣ ̀
́
ươ
ng dung đê so sanh (băng nhau hay khac nhau) gia tri cua hai toan hang, no cung ́ ́ ́ ́ ́ ̀ ̀
̃
ư ̣ ̣ Lênh Xor th
́
giup phat hiên ra cac bit khac nhau gi a hai toan hang nay. ́ ̀ ́ ư ̉ ̣ ̣ ng t
́ ươ
́ Test: T
ưở ̉ ̉ Lênḥ
chi anh h ́
́
ự ư ̣
nh lênh And nh ng không ghi kêt qua vao lai [Toan hang đich], no
̀
ơ
ng đên cac c CF, OF, ZF,... ́ ̣ Vi du 1: Mov Al,0 ; Al ß0 ́ ̀ ư Not Al ; Al = Not Al. T c la Al = 0FFh ́ ̣ Vi du 2: Cho AL = (10010011)2, BL = (11001100)2. And Al, Bl ; Al ß 10010011 And 11001100. Al = And Al, 0 ; Al ß 10010011 And 0. Al = Or Bl, Al ; Bl ß 11001100 Or 10010011. Al = Or Bl, 4 ; Bl ß 11001100 Or 100. Al = Xor Al, Bl ; Al ß 10010011 Xor 11001100. Al = Xor Bl, Bl ; Bl ß 11001100 Xor 11001100. Bl = 00000000 ́ ̀ ́ ́ ́ ̃ ̉ ử ư ̣ ̉ ̣ ̣ ̣ ̣ ợ
Đê xoa nôi dung thanh ghi nao đo, trong h p ng ta co thê s dung môt trong cac lênh ́
Vi du 3:
sau đây: Mov Ax, 0 Sub Ax, Ax ̀ ̀ ́ ́ ́ ̣ Xor Ax, Ax ; cac căp bit giông nhau thi đêu = 0 ̃ ́ ́ ́ ̀ ́ ́ ́ ̣ ̣ ̉ ̃
́
ư
nguyên gia Lênh sau đây se xoa (= 0) cac bit 3 va 6 cua thanh ghi AL, cac bit khac gi ́
Vi du 5:
tri:̣ And AL, 10110111b ; AL ßAL And 10110111 ̃ ́ ́ ợ ̣ ̣ ̣ ̃
̀ ́
́ ́ ́ ̀
̣ ươ ư ̣ ̣ ̣ ̣ c goi la day bit măt na, cac bit 3 (= 0) va 6 (= 0)
́
́
ơ
ng ng v i ́
̀
̀
ươ
10110111 đ
ng h p nay: day bit
́
̀
ư ̣
c goi la cac bit măt na. Nh vây muôn lam cho bit nao = 0 ta cho bit măt na t
́
̃ ượ
̀
̀ ̀ ́ ́ ̣ ̣ ̣ Trong tr
ượ
đ
́
no = 0, cac bit con lai trong day bit măt na đêu = 1. ̀
́ ̃ ́ ̀ ́ ́ ́ ́ ́ ̣ ̣ ̉ ̃
ư ́
L nh sau đây se thiêt lâp (= 1) cac bit 3 va 6 cua thanh ghi AL, cac bit khac gi ệ
́ ̣ Vi du 6:
nguyên gia tri: Or AL, 01001000b ; AL ßAL Or 01001000 ̃ ́ ́ ̀ ợ ̣ ̣ ̣ ̀
̀
ươ
ng h p nay: day bit 0
̀ ̃
̀ ́
́ ́ ́ ̣ ươ ư ̣ ̣ ̣ ̣ 1001000 đ
́
c goi la cac bit măt na. Nh vây muôn lam cho bit nao = 1 ta cho bit măt na t c goi la day bit măt na, cac bit 3 (= 1) va 6 (= 1)
́
́
ơ
ng ng v i ́
ư ̣
́
̃ ượ
̀
̀ ́ ̀ ́ ̣ ̣ ̣ Trong tr
ượ
đ
́
no = 1, cac bit con lai trong day bit măt na đêu = 0. ̀
́ ́ ̃ ́ ̀ ̣ ̣ ̉ ̉ Vi du 7: Lênh sau đây se kiêm tra bit 12 cua thanh ghi AX la = 0 hay = 1: And AX, 0001000000000000b ; AX ßAX And 0001000000000000 ̃ ́ ́ ́ ́ ́ ̀ ́ ̣ ư ̣ ̉ ̉ ̉ ́
ơ
́ ̉ ̀
V i day bit măt na nh trên, nêu bit 12 cua Ax = 0 thi kêt qua: Ax = 0, nêu bit 12 cua Ax = 1 thi
kêt qua: Ax <> 0. ̀ ́ ́ ́ ̀ ̣ ̉ ̉ ̣ ̉ ̣ ̉ ́ ̀
c s dung, vi no lam thay đôi gia tri cua
̀ ̀ ượ ử
ụ ằ ́
ươ ệ ề ̉ ̉ ̉ ́
c kiêm tra ́ ́ ́ ̃ ́
ơ ̣ ̉ ̉ ̉ ̉ ̉ ắ
̀
c kêt qua kiêm tra. Ngoai ra, no cung chi kiêm tra ư
Cach dung lênh And nh trên đê kiêm tra bit it đ
ể
thanh ghi cân kiêm tra (đi u này có th kh c ph c b ng l nh Test) va phai thêm b
́
ượ
gia tri cua Ax (= 0 hay <> 0) m i biêt đ
ượ
đ c 1 bit.́ ́ ́ ́ ́ ̃ ́ ử ư ̣ ̣ ̣ ̣ ̣ ̀
ng s dung kêt h p gi a cac lênh dich bit, lênh quay bit, lênh ươ
́ ̉ ̉ ̉ ̣ ̀
ợ
ươ
ự
Trong th c tê ng
i ta th
́
nhay,... đê kiêm tra cac bit trong môt thanh ghi. ̃ ̉ ư ̣ ̣ ̉ 7. Lênh chuyên d liêu qua công: IN và OUT ́ ́ Cu phap: (cid:0) ỉ ổ > IN AL, <Đ a ch c ng
ị ị
ỉ ổ >, AL ệ ệ
ự ế ướ ạ ụ
ặ ượ ậ
ộ ằ ể ượ ị
ị ố i d ng m t h ng s ho c đ Trong đo:́<Đ a ch c ng> chính là s hi u c ng (port) mà l nh nh n nhi m v trao đ i d
ỉ ổ
ổ ữ
ố ệ ổ
ỉ ổ
ệ
li u qua nó. Đ a ch c ng có th đ
c ghi
c ghi tr c ti p d
thông qua thanh ghi Dx. ́ ̣ Tac dung: ọ ữ ệ ừ ổ ượ ở ư ị ng d li u 8 bít t c ng đ ỉ
c ch ra ỉ ổ
<Đ a ch c ng> đ a ư ữ LênhIn (Input): Đ c m t l
vào l u tr trong thanh ghi AL. ộ ượ ị ế ế ằ 0 đ n FF (h th p l c phân) thì có th vi ệ ậ ụ
ả ớ ạ ừ
i h n t
ơ
ớ ỉ ổ
ệ ể ỉ ế ị ị ể ế ự ế
t tr c ti p
N u đ a ch c ng n m trong gi
ỉ
ị
ỉ ổ
trong câu l nh, n u đ a ch c ng l n h n FF thì ta ph i dùng thanh ghi Dx đ ch đ nh đ a ch
c ng.ổ ượ ộ ượ
ng d li u 8 bít t
ị ữ ệ
ỉ ổ ươ ổ
thanh ghi AL ra c ng đ
ế ự ế ng t ở
ỉ
c ch ra
ệ
t tr c ti p trong câu l nh c vi ị
ặ ừ
ở
L nhệ Out (Output): G i m t l
ể ượ
ự ệ
ỉ ổ
<Đ a ch c ng>. T
l nh In, đ a ch c ng có th đ
ho c thông qua thanh ghi Dx. ́ ̣ Vi du 1: In Al, 40h ; Mov Dx, 3B0h ; In Al, Dx ; Ví d 2:ụ Out 40h, Al ; Mov Dx, 3B0h ; Out Dx, Al ; Ví d 3:ụ Các khai báo h ng:ằ DAT EQU 13h ; POR EQU 7Ch ; Các l nh:ệ Mov Al, POR ; Mov Bl, DAT ; Out Bl, Al ; ự ọ ậ ủ ậ ệ
T h c l p trình assembly Bài 4: T p l nh assembly c a Intel 8086/8088 (4) ứ Th Hai, 02/09/2013 23:37 ́ ̣ ̣ ̣ ̀ ̉ ử ơ ̣ ̣ ̣ ̉ ̣ ̣ ̉ ́
ư
̀ ́ ́ ̃
ư ̣
́
̉ ư ́
́
ơ ̉ ̣ ̉ ̉ ̣ ̀ ̀ ̀ ́
ơ ́
Môt sô vi du minh hoa:
́
́
́
ơ
Vi du 1:
Gia s tai đia chi 0100:0120 trong bô nh co ch a môt mang d liêu, gôm 100 ô nh ,
́
̃
̀
̃
môi ô la 1 word. Hay tinh tông nôi dung cua cac ô nh nay, kêt qua ch a trong thanh ghi Dx.
Mov Ax, 0100
Mov DS, Ax ; tro căp thanh ghi DS:DI về
́
Mov DI, 0120 ; đâu vung nh cân truy xuât (0100:0120) ̉ ư ̉ ̣ ̉ ̀ ̀ ́
ơ ̣ ̉ ́
ơ ̉ ở ̣ ́ ́ ́ ̀ ́
ơ ́
ơ ̉ ̀ ̣ ̣ ̉ ̣ ̉ ́ ̀ ́
ơ ̣ ̣ ̉ ̣ ̉ ̣ ̣ ̉ ̣ ́ ̀ ̀ Ở ̃
ư ̣ ̉ ̉ c l u vao thanh ghi Dx. ̉ ỉ ẽ ữ ệ ừ ớ ắ ầ ạ ị i đ a ch 0100:0120 vùng nh b t đ u t ệ
ớ ắ ầ ạ i 0100:0500: ồ ớ
ớ ị ề
ề ỏ
ỏ ộ ụ ư ạ ớ ạ vào Ax ị i DS:SI
i DS:DI ớ ế ế ộ ở ộ ộ
trong cùng m t segment nên ỉ ầ ử ụ
đây ta ch c n s d ng m t ớ
ạ ữ ệ ổ ộ ớ ̣ ả ượ ư ướ ế ớ ớ ỉ ớ
ớ
ủ
Các l nh sau đây s tính t ng n i dung c a 100 ô nh (100 byte nh ) trong b nh ,
c vùng nh này: ộ
i đ a ch 0A00:0120. K t qu đ c l u vào word nh ngay tr ề
ề
ề ỏ
ỏ
ỏ ồ ớ ồ
ớ
ớ
ồ
ớ ướ
c vùng nh ngu n ứ ổ ;
Mov Dx, 0 ; chuân bi Dx đê l u tông
̀
Mov Cx, 100 ; lăp 100 lân vi mang gôm 100 ô nh
Lap_TT:
̀
Add Dx, DS:[DI] ; công thêm n/dung ô nh chi b i DS:DI vao
Dx
Add DI, 2 ; chi đên ô nh kê tiêp (vi ô nh word nên
tăng 2)
́
ơ
Loop Lap_TT ; lăp lai đu 100 lân (duyêt qua đu 100 ô nh )
;
́
́
Kêt thuc đoan lênh trên tông nôi dung cua 100 word nh băt đâu tai đia chi 0100:0120 trong bô
́
ơ ượ ư
nh đ
đây chung ta bo qua kha năng tran d liêu trong thanh ghi
́
kêt qua Dx.
Ví d 2:ụ Các l nh sau đây s copy 100 word d li u t
sang vùng nh b t đ u t
Mov Ax, 0100
Mov DS, Ax
Mov SI, 0120 ; tr DS:SI v vùng nh ngu n 0100:0120
Mov DI, 0500 ; tr DS:DI v vùng nh đ ch 0100:0500
;
Mov Cx, 100
Lap_Copy:
Mov Ax, DS:[SI] ; l u t m n i d ng word nh t
ớ ạ
Mov DS:[DI], Ax ; ghi giá tr Ax và word nh t
Add SI, 2 ; đ n word nh ti p theo
Add DI, 2
Loop Lap_Copy
;
ề ở
Hai vùng b nh đã cho đ u
thanh ghi đo n d li u DS.
́
ẽ
ệ
Vi du 3:
ắ ầ ạ ị
b t đ u t
Mov Ax, 0A00h
Mov ES, Ax
Mov SI, 0120h ; tr DS:SI v vùng nh ngu n 0A00:0120
Mov DI, SI ; tr DS:DI v vùng nh ngu n 0A00:0120
Sub DI,2 ; tr DS:DI v word nh tr
;
Mov Cx, 100
Mov Dx, 0 ; DX ch a t ng ộ ủ ớ ạ i ES:SI ớ ạ ệ ể ị PTR đ đ nh ki u ô nh c n truy xu t. ủ ộ
t ộ ườ ầ ớ ợ ớ ầ
ớ ượ
i ô nh đ
ệ ố
ấ
ề
ớ
ế
ng h p này, n u không
ỉ ấ
ệ ố ấ ế
ế ử ệ ả Add DL, ES:[SI], khi đó h th ng ch l y PTR thì l nh Add ph i vi ư
t nh sau: ạ i ES:SI c ng thêm vào DL (vì DL là thanh ghi byte: 8 bít), ừ ế ự ệ ế bi n Xau1 vào bi n Xau2. Gi Ascii t ả ử
s ượ ướ TTong:
Add Dx, Byte PTR ES:[SI] ; c ng n.d c a byte nh t
vàoDX
Inc SI ; ô nh byte
Loop TTong
;
Mov Word PTR ES:[DI], DX
;
ấ
ể
ử ụ
ử
Trong đo n l nh trên chúng ta s d ng toán t
ỉ ở
ớ ạ
ấ
L nhệ Add Dx, Byte PTR ES:[SI]: l y n i dung c a byte nh t
c ch b i ES:SI
ị ả 1
ế Add Dx, ES:[SI] thì h th ng l y giá tr c
ế
ộ
c ng thêm vào thanh ghi DX. N u ta vi
ạ
word t
i ES:SI c ng thêm vào DX (vì DX là thanh ghi word (16 bít), đi u này không đúng v i
ự ế
th c t
, vì chúng ta đang c n truy xu t đ n các byte nh . Trong tr
dùng toán t
giá tr cị ả 1 byte t
Ví d 4:ụ Các l nh sau đây s copy toàn b 20 kí t
Xau1 và Xau2 đã đ ộ
ẽ
c khai báo tr ộ
ư
c nh sau: Xau1 DB ‘Khoa CNTT – DHKH Hue’
Xau2 DB 20 Dup (‘ ’) ệ ạ ầ c khai báo trong đo n Data. Hai l nh đ u tiên ̃
ợ
ng trình h p ng đ ư ượ
ạ ủ ư ấ ỉ ạ
ỏ ề ế ươ
ị
ủ ụ ể ế ỉ ươ ể ộ ả
ng trình ra màn hình văn b n trong ch ự ừ
t ng trình sau đây: Đ in m t xâu kí t
ườ ng MSDOS). Các l nh:ệ
Mov Ax, @Data
Mov DS, Ax
Lea SI, Xau1
Lea DI, Xau2
;
Mov Cx, 20
Lap_Copy:
Mov Al, Byte PTR DS:[SI]
Mov Byte PTR DS:[DI], Al
Inc SI
Dec DI
Loop Lap_Copy
;
ở
ế ủ
trên
Các bi n c a ch
ẽ ứ
ụ
có tác d ng l y đ a ch segment c a đo n Data đ a vào thanh ghi đo n DS. Do đó, DS s ch a
ỏ
ị
đ a ch segment c a hai bi n Xau1 và Xau2. Hay c th : DS:SI tr v bi n Xau1 và DS:DI tr
ề
v Xau2.
ươ
Ví d 5:ụ Ch
ơ ắ
đ n s c (môi tr
Chú ý: ợ ề ự ặ ự ệ ạ ủ i v trí hi n t ấ
ra màn hình, t ̃
ư
ắ ể ươ
ặ ạ
i c a con tr màn hình ho c t ỹ ỹ ượ ọ ạ ị
ậ ng trình h p ng ghi m t kí t
ỏ
ậ ộ
ộ ọ ộ
i m t t a đ
ế
c g i là k thu t ghi ra màn hình gián ti p thông ế ằ ấ ượ ọ ộ ớ ủ ớ ộ ọ ả ề ộ
ứ
ố ộ ể ự ươ ư ậ
ố ra màn hình ch ỹ ớ ậ ể ọ ừ ộ ọ
ộ
ượ ọ màn hình ch b nh màn hình. K thu t này đ ươ
ấ ự ế ớ ộ ạ ộ
ỗ ỗ ệ ề ng trình có th đ c nó t
ớ
ế ộ ườ ị ộ ử ụ
ổ ứ ư ng là
ộ
ch c l u tr thông tin trên màn hình trong b nh ớ ệ ề ộ
ữ
ế ộ ườ ủ ng h đi u hành MSDOS, b nh màn hình c a ch đ nàm hình đ n s c ớ
ệ ề
ộ ộ
ượ ư ớ
ữ ạ ắ ầ ạ ế ế ộ
ớ
i segment nh 0B800, b t đ u t ơ ắ
i c l u tr t ổ ứ ư ữ ư ạ ộ ớ ứ ủ ự ế ộ ớ
ề ự ứ đó. T ng dòng kí t trên màn hình, ấ
ừ
i các offset liên ti p nhau trong t t ủ
c l u t
c l u tr t
ự ủ ữ ạ ố c l u tr t c a dòng 79
ượ ư ậ ễ ớ ữ
ượ ư ữ ầ ượ ạ
ế ộ
c t 0 đ n c t 79), đ
ữ ạ
ượ ư
c a dòng 0 đ
i 80 word ti p theo,... , 80 kí t
ớ
ộ ế
ầ
ự ủ
i 80 word đ u tiên, 80 kí t
c a dòng
ượ ư
i 80 word cu i
ộ
c offset trong b nh màn hình,
ủ ụ ể ự ộ
c t a đ (dòng, c t) c a nó. C th , t đ trên màn hình khi ta bi
ộ ế ượ ọ ộ
ứ ượ c tính theo công th c sau: ướ c là 25 x 80 x 2 (byte) = 40000 byte. ạ
ử ử ụ ươ BIOS và MSDOS đã cung c p nhi u hàm/ng t đ ch
ộ
ho c m t xâu kí t
ị
màn hình xác đ nh nào đó. K thu t này đ
ắ
qua các hàm/ng t màn hình.
ấ ả ữ
ủ
t c nh ng thông tin mà chúng ta th y đ
t r ng, t
c trên màn hình c a m t máy tính
Bi
ộ
ữ
ề ượ ư
c l u tr trong b nh màn hình c a máy tính đó, theo m t cách nào đó. T c là, n i
đ u đ
ộ
thao tác ghi/đ c trên màn hình đ u ph i thông qua b nh màn hình. Nh v y: Mu n ghi m t
ớ
ng trình có th ghi nó vào b nh màn hình. Mu n đ c m t xâu kí
xâu kí t
ỹ
ự ừ
t
t
c g i là k
ậ
thu t truy xu t tr c ti p b nh màn hình.
M i h đi u hành, m i ch đ màn hình s d ng m t đo n b nh xác đ nh (th
ớ
khác nhau) cho b nh màn hình. Và cách t
màn hình cũng khác nhau v i các h đi u hành, các ch đ màn hình khác nhau.
Trên môi tr
ế
25 dòng (0 đ n 24) x 80 c t (0 đ m 79) đ
offset 0000.
ỗ
T ch c l u tr thông tin trên màn hình trong b nh màn hình lo i này nh sau: M i kí
ự
t
,
trên nàm hình chi m 1 word trong b nh màn hình: byte th p ch a mã ASCII c a kí t
ự
ộ
byte cao ch a thu c tính (màu ch , màu n n,...) c a kí t
ả ừ ộ
ừ
l n l
t
trái sang ph i (t
ự ủ
ộ
ớ
b nh màn hình: 80 kí t
ế
ượ ư
ữ ạ
1đ
c l u tr t
ộ
cùng trong b nh nàm hình. Nh v y ta d dàng tính ra đ
ớ
ươ ứ
t
ng ng v i m t kí t
ự ạ ọ ộ
ủ
offset c a kí t
t o t a đ (Dòng, C t) đ
(80*(Dong 1) + (Cot 1))*2
ớ
ộ
B nh màn hình lo i này có kích th
ọ ự ậ
ạ
B n đ c t
l p trình th nhé.
ự ọ ậ
T h c l p trình assembly Bài 5: S d ng Interrupt trong ch ng trình assembly (1) ứ Th Hai, 02/09/2013 23:55 Ắ ƯƠ NG T TRONG CH ế ị ư ắ
ề ệ
ạ
t b ngo i vi, h
ầ ổ
i s d ng, ..., g i đ n vi x lý (h Intel) m i khi nó c n trao đ i ớ ng trình ng
ử ử ừ ể ọ
ắ
ả ử NG TRÌNH ASSEMLBLY
ệ ố
ầ
ệ
ườ ử ụ
ử
ử ế
ầ ượ ự ụ ụ ừ
ệ
ầ c s ph c v t
ộ ỗ
ắ ậ ượ ủ
i nghiêm trong x y ra trong quá trình x lý c a
i ệ ắ vi x lý. Ng t cũng có th phát sinh t
ử
ệ ạ
ệ
ị
thao tác (l nh) mà nó b i t ướ c m t tín hi u yêu c u ng t vi x lý s d ng ngay thao tác (l nh) hi n t
ứ c đó. ử ạ ắ ắ ắ ầ ứ
ấ ộ ư ề
ắ ề ầ ắ ắ Ng t (Interrupt) là các tín hi u mà các thành ph n trong h th ng, nh : thi
ỗ
ươ
đi u hành, ch
thông tin v i vi x lý hay c n đ
chính bên trong vi x lý khi nó phát hi n m t l
ẽ ừ
ệ
ộ
ử
nó. Khi nh n đ
ớ ế ụ ạ ừ
ầ
ể
đ xem xét và đáp ng yêu c u ng t đó, sau đo m i ti p t c l
ừ
d ng tr
ồ
ử ụ
Các máy IBM_PC, s d ng vi x lý Intel, bao g m nhi u lo i ng t: Ng t ph n c ng, ng t
ắ ượ
c (ng t có đ u tiên cao nh t). Trong đó
ph n m m, ng t bên trong, ng t không ch n đ ủ ươ ườ ử
i s ng trình c a ng h đi u hành và ch c phát sinh t
ươ ượ ng th y trong các ch
ề ừ ệ ề
ng trình h p ng .̃
ư
c cung c p b i BIOS và h đi u ắ ệ ề
ỗ ấ
ượ ọ 0 đ n 255 và đ ộ ươ ố ừ
ượ ọ ộ ắ ệ ụ ệ ố ượ
ươ
ề ế
c g i là ch
ả
ẽ ở
ắ
ố
c g i là s hiêu ng t. M i ng t
ụ ụ ắ ứ
ể
ng trình con ph c v ng t, t c là, đ
ươ
ự
ng trình con ph c ọ ộ ầ ắ ể ươ ỉ ả ự ả ọ ọ
ọ
ng trình ph i ch ra s hi u ng t c n g i, khi đó h th ng s ph i g i th c hi n
ứ ng trình con ph c v ng t t ụ ụ ắ ươ ứ
ệ ề ệ ề ạ ấ
t ộ ụ ụ ắ ề
ắ
ng trình g i m t ng t m m khi c n. Khi g i ng t
ệ ố
ắ ầ
ệ
ọ
ầ
ể
ở ộ
ỉ
ị ớ ị ủ ươ ộ c l u tr t ữ ạ
ỗ ị ộ ị ụ ụ ắ ẽ ượ ư
i m t không
ỉ
ắ
c g i là b ng vector ng t (m i đ a ch đ nh ớ ơ đ nh v c a 256 ch
ớ ặ
ộ ớ
ụ ụ ắ ượ ọ
ắ ậ ượ ả ư ị ị ữ ở ỉ ộ
ỏ ệ
i, đ a giá tr con tr l nh CS:IP hi n t
ư
ầ ử
ứ hai ph n t
ắ ủ ấ ắ ị
i đây (2 ph n t ặ ị ẽ
ng ng đ đáp ng yêu c u g i này.
ườ
ng h đi u hành 16 bít MSDOS, ngay sau khi kh i đ ng, h đi u hành n p t
ng trình con ph c v ng t vào b nh . Khi đó 256 đ a ch (Segment:Offset) các
ng trình con ph c v ng t, s đ
ả
ượ ọ
ắ
ộ
c g i là m t vector ng t.
ừ ươ
ầ
ng trình thì nó ph i: 1.
c m t yêu c u ng t n (Int
n) t
ch
ỉ ủ ệ
ệ ạ
i (đó chính là đ a ch c a l nh sau
ỉ
ầ ử ị
(đ a ch ) trong
ể ư
liên ti p) đ đ a
ươ
ng trình ự ệ ế ệ ỏ ệ ể ặ
ắ ỉ
ệ ng trình. ắ ẽ ượ ơ ế ủ ộ ờ ọ c chúng tôi làm rõ i g i ng t s đ ấ
ầ ủ
ph n sau c a tài li u này. ̣ ắ ượ
ề
ầ
ắ
ng t ph n m m là các ng t đ
ụ
ợ
ấ
ườ
ề
d ng, đi u này th
ắ
ệ ố
H th ng các ng t m m bên trong máy tính IBM_PC đ
ồ
ắ
c đánh s t
hành, g m 256 ng t, chúng đ
ớ
ươ ứ
ề
ng ng v i m t ch
m m t
ng con đ
ầ
ộ
ứ
đáp ng m t yêu c u ng t m m thì h th ng s ph i th c hi n m t ch
ụ ắ ươ ứ
ng ng.
v ng t t
̃
ợ
ấ ệ
ư
H p ng cung c p l nh Int đ các ch
ố ệ
ươ
ề
m m ch
ươ
ch
Trong môi tr
ươ
ả
c 256 ch
ị
vùng nh , n i
ớ
ệ
gian nh đ c bi
t trong b nh , vùng nh này đ
ươ
ị ủ
v c a m t ch
ng trình con ph c v ng t đ
ư ậ
ệ ố
Nh v y khi h th ng nh n đ
ệ ạ
ệ
ừ
D ng l nh hi n t
ắ
ọ
ệ
trên đ nh Stack; 2. Xác đ nh ph n t
l nh g i ng t) vào l u tr
ầ ử
ị ạ
ế
ắ
ả
b ng vector ng t ch a vector ng t c a ng t n, l y giá tr t
ỏ ệ
ầ
ỉ ủ ệ
ủ
vào c p thanh ghi con tr l nh CS:IP (đây chính là đ a ch c a l nh đ u tiên c a ch
ụ ụ ắ
ớ
ươ
ắ ầ
ộ
ụ ụ ắ
con ph c v ng t n trong b nh ); 3. B t đ u th c hi n ch
ng trình con ph c v ng t cho
ấ
ươ
ặ ệ
ế
ộ
ầ ử
ủ
ng trình này, đó là l nh Iret; 4. L y n i dung c a hai ph n t
đ n khi g p l nh k t thúc ch
ệ ệ
ự
ở ạ ế ụ
ạ ặ
trên đ nh Stack đ t vào l
i ti p t c th c hi n l nh
i c p thanh ghi con tr l nh đ quay tr l
ươ
ọ
sau l nh g i ng t trong ch
ế
ề
ữ
Nh ng v n đ liên quan đ n Stack và c ch c a m t l
ệ
ơ ở
h n
Lênh Int
́
́
Cu phap: ắ ủ ố ệ ể ầ ế ứ
ề ọ
ắ ề
ắ
ắ ủ
0 đ n 255, đó chính là s hi u ng t c a 256 ng t m m mà BIOS và ắ ̣ ượ ọ ẽ ự ặ
ệ ươ ươ ề ủ
ộ
c g i thì h th ng s th c hi n ch ể ọ
ệ
L nh Int (Interrupt) đ
ợ
ng trình h p ng . Khi m t ng t m m đ
ụ ụ ắ ươ ứ ề
ượ ử ụ
c s d ng đ g i m t ng t m m (c a BIOS ho c MSDOS)
̃
ộ
ệ ố
ắ
ư
ng
ớ
ng ng v i nó. Int ủ
ủ ắ
ắ
ươ ọ
ọ
ộ ề ắ ụ ụ ắ ể ự ể ệ ộ
ề ứ ứ ỗ ệ
ố ượ ượ ộ Int 10h ; g i ng t 10h c a BIOS
Int 20h ; g i ng t 20h c a MSDOS
ơ
M t ng t m m, hay chính xác h n là m t ch
nhi u ch c năng khác nhau, m i ch c năng này đ ng trình con ph c v ng t, có th th c hi n
c
c th hi n thông qua m t con s , đ ọ ả ắ ươ ắ ớ ọ
c khi g i ng t ch ỉ
ng trình ph i ch rõ g i ng t v i ọ ướ
ầ ố ệ
ằ ắ
ủ
ặ ố ệ ớ ượ ạ
c l ọ
i: g i hàm ủ ấ ế ướ ọ
ắ
ầ ầ ế ả ề ữ ệ ọ
ắ ượ ầ ủ ữ ệ
ị ươ
c khi g i hàm/ng t ch
ệ c th c hi n ch ớ ộ ế ệ ng trình c n cung c p đ y đ d li u vào (n u có) cho nó, sau
ả ữ
ng trình c n xác đ nh rõ nó có tr v d li u k t qu (d
ờ ệ
đâu: thanh ghi hay ô nh , và có tác đ ng đ n các c hi u ̣ ặ ố ệ ầ
ọ
ứ ấ
ứ ọ ắ ế ệ ự ự ệ ệ ộ ể ủ
ủ ệ
ỏ ế ọ ồ ệ ố ụ ể ệ ạ ả ề ồ ứ ệ ạ
ủ ậ ứ ế ầ ồ i, thanh
t ngày trong tu n (0 : ch nh t, 6 : th ứ ́ ̀ ́ ̣ ̉ ượ ử ụ ắ ắ ấ ọ ớ ng đ i ủ
ắ ư c s d ng nh t, nên
ự
/xâu kí t
ầ ữ ệ ủ ắ ộ ệ ề ậ ứ
ắ ệ ố ễ ấ ắ
ỗ
̀
́ ự ầ ủ ự ̣ ra màn hình. Kí t ượ ặ ướ
c đ t tr c ự ề ể ể (ho c mã ASCII c a kí t ) c n in đ
đi u khi n. đây có th là kí t ặ
ự ườ
th ặ
ng ho c kí t ự ở ̣ ự ầ c n in ra> ̣ Các l nh sau đây in ra màn hình kí t ự A: ọ
g i là s hi u hàm c a ng t. Do đó, tr
hàm nào, b ng cách đ t s hi u hàm c n g i vào thanh ghi AH.
Ví d 2:ụ
ắ
Mov Ah, 01 ; g i ng t 21h v i hàm 01, Hay nói ng
Int 21h ; 01 c a ng t 21h
ắ
Tr
ươ
ự
khi hàm/ng t đ
ứ ở
ế
li u ra) hay không, n u có thì ch a
hay không.
́
Vi du 3:
Mov Ah, 02 ; đ t s hi u hàm c n g i vào AH
ấ ữ ệ
Mov DH, 10 ; cung c p d li u vào th nh t vào DH
ấ ữ ệ
Mov DL, 20 ; cung c p d li u vào th hai vào DL
ắ
ớ
Int 10h ; g i ng t 10h v i hàm 02. Hàm/ng t này không
ả
ả ề ữ ệ
; tr v d li u k t qu .
ắ ủ
ắ
ệ ọ
Dãy l nh trên th c hi n vi c g i hàm 02 c a ng t 10h (ng t c a BIOS), nó th c hi n vi c
ả
ị
d ch chuy n con tr đ n dòng 10 c t 20 c a màn hình văn b n.
Ví d 4:ụ
ớ
ắ
Mov Ah, 2Bh ; g i ng t 21h v i
Int 21h ; hàm 2Bh
Hàm này tr v ngàythángnăm hi n t
i (theo đ ng h h th ng trên máy tính). C th :
ệ ạ
ứ
Thanh ghi CX (19802099) ch a năm hi n t
i, thanh ghi DH (112) ch a tháng hi n t
ờ
ệ ạ
ghi DL (131) ch a ngày hi n t
i. Đ ng th i AL cho bi
7).
Môt sô ham cua ngăt 21h (MSDOS)
ở
ườ
đây chúng tôi ch n gi
Ng t 21h c a MSDOS là ng t th
thi u vệ ề ng t này, nh ng ch v i các hàm vào/ra kí t
ỗ
ủ
ứ
ự ơ ả
ỉ ớ
c b n. Ch c năng c a m i
ủ ừ
ng t, ch c năng c a các hàm trong m t ng t, các yêu c u d li u vào/ra c a t ng hàm trong
m i ng t,... d dàng tìm th y trong các tài li u v l p trình h th ng.
ắ
ủ
Ham 02 c a ng t 21h:
ự
ộ
In m t kí t
Tac dung:
trong thanh ghi DL. Kí t
ử
S dung:
Vao:̀ Ah = 02
Dl = ủ ệ ự
A
ự
kí t A: ả ử ằ ế ế trong bi n TieuDe ra màn hình. Gi s r ng bi n ự ừ
t ư ệ
ượ
c khai báo nh sau: ả ử ạ ị ớ ỉ ứ ộ ự ồ
ASCII, g m 50 kí ẽ ệ ự . Các l nh sau đây s in xâu kí t ộ
i đ a ch 0A00:0100 trong b nh có ch a m t xâu kí t
nói trên ra màn hình. ắ
ộ ự ộ ầ ả ượ ̣ c ị
(m t xâu kí t ) ra màn hình. Đ a ch c a xâu c n in này ph i đ
ở ấ ự
ả ượ ế Int 21h ; 41h là mã ASCII c a kí t
Ví d 2:ụ Các l nh sau đây in ra màn hình 10 kí t
ự ắ ầ ừ
, b t đ u t
Mov Cx, 10
Mov Ah, 02
Mov Dl, ‘A’
Lap_In:
Int 21h
INC DL
Loop Lap_In
Ví d 3:ụ Các l nh sau đây in xâu kí t
TieuDe đã đ
TieuDe DB ‘Khoa CNTT Truong DHKH Hue’
Các l nh:ệ
Lea DI, TieuDe
Mov Cx, 25
Mov Ah, 02
Lap_In:
Mov Dl, Byte PTR [DI]
Int 21h
INC DI
Loop Lap_In
;
Ví d 4:ụ Gi
s t
ự
t
Mov Ax, 0A00h
Mov ES, Ax
Mov DI, 0100h
;
Mov Cx, 50
Mov Ah, 02
Lap_In:
Mov Dl, Byte PTR ES:[DI]
Int 21h
INC DI
Loop Lap_In
;
̀
ủ
Ham 09 c a ng t 21h:
́
In m t dãy kí t
Tac dung:
ỉ ở ặ
ch b i c p thanh ghi DS:DX và xâu ph i đ ỉ ủ
c k t thúc b i d u $. ̣ Ah = 09 ầ ủ ủ ế ệ ̣ ộ
t l nh in n i dung c a ế TieuDe. Vi ng trình đã khai báo bi n ướ ợ ả ượ ả ử ươ
s ch
ra màn hình:
ườ ư
c nh sau: c khai báo tr ng h p này bi n TieuDe ph i đ ồ ể ệ Lea TieuDe ả ơ ạ ươ ự ế ớ ầ ư ị
d ng đo n gi n đ n, thì không c n đ a đ a ư ế ở ạ
t ợ
ng trình h p ng vi ỉ ở
ạ
ng trình d ng COM:
ạ
ng trình d ng EXE: ả ử ế ượ ư s bi n TieuDe đã đ c khai báo nh sau: ừ ế ự ệ ỉ “Truong DHKH Hue” t bi n TieuDe ra màn hình: ừ ế ệ ỉ “Khoa CNTT” t bi n TieuDe ra màn hình: ả ử ạ ị ứ ớ ộ ự s t ồ
ASCII, g m 50 kí ự ệ ẽ . Các l nh sau đây s in xâu kí t ộ
i đ a ch 0A00:0100 trong b nh có ch a m t xâu kí t
nói trên ra màn hình. ử
S dung:
Vao: ̀
DS:DX = ắ ̀
́ ẽ ứ ư ộ ụ ể ̣ bàn phím vào l u trong thanh ghi AL. C th là, AL s ch a mã ậ ự ự ừ
t
ghi trên phím nh p. ̣ ậ ự ộ
ứ
ghi trên phím nh p> ệ ộ ẽ ấ ọ ậ
ủ
ươ
ng trình g i ng t 21h v i hàm 01 thì màn hình s xu t hi n m t con
ể ườ ử ụ ế bàn phím. Khi đó, n u ng ộ ườ ử ụ ế ị ườ ử ụ
i s d ng gõ
i s d ng gõ m t phím kí ự ư ắ trên phím gõ ự ệ ấ ở ‘*’. ̣ ệ ệ
i s d ng nh p m t kí t ỏ
vào AL ể ườ ử ụ
ộ ự ượ ấ ị ấ
ộ
ng kí t ự
đ c n đ nh ẽ
ậ
ự ớ ố ượ
, v i s l
ng trình c trong ch ướ
ả ử ế ượ ệ
ế
c, vào bi n LuuXau đã khai báo tr
s bi n LuuXau đ c khai báo nh sau: Mov DS, Ax
Mov Dx, 0100h
;
Mov DI, Dx
Mov Cx, 50
Add DI, Cx
Mov Byte PTR DS:DX, ‘$’
;
Mov Ah, 09
Int 21h
;
ủ
Ham 01 c a ng t 21h:
ậ
Tac dung:Nh p m t kí t
ủ
ASCII c a kí t
ử
S dung:
Vao:̀ Ah = 01
ế
Ra: Al = 0: n u phím nh p là m t trong các phím ch c năng
Al = < mã ASCII c a kí t
ụ ể ư
ắ
ớ
C th nh sau: Khi ch
ỏ
ậ
ộ
ậ
ự ừ
tr nh p, đ ng
i s d ng nh p vào m t kí t
t
ộ
ứ
ậ ượ
m t trong các phím ch c năng thì AL nh n đ
c giá tr 0, n u ng
ậ ượ
ự
ự
ủ
nào đó thì AL nh n đ
t
đó.
c mã ASCII c a kí t
ứ
ắ
ủ
ự
ươ
hàm 01 ng t 21h nh ng kí t
ng t
Chú ý: Hàm 08 c a ng t 21h có ch c năng t
ệ
ấ
ấ ả ề ượ
không xu t hi n trên màn hình, t
c xu t hi n b i kí t
t c đ u đ
́
Vi du 1:
ớ
Mov Ah, 01 ; v i hai l nh này màn hình s xu t hi n con tr
ậ
Int 21h ; nh p đ ng
ậ
Ví d 2:ụ Các l nh sau đây cho phép nh p m t xâu kí t
ướ
ươ
tr
ư
Gi
LuuXau DB 30 Dup (‘ ‘)
Các l nh:ệ
Mov Ax, Seg LuuXau
Mov DS, Ax
Lea DI, LuuXau
;
Mov Cx, 30
Mov Ah, 01
Nhap_Xau: ự ườ ườ ử ụ ậ ỉ
i s d ng ch nh p các kí t (gõ phím kí t ự ể
đ ng h p này chúng ta đã gi s : Ng ợ
ậ ứ ử ụ ự ế ờ ố ế ậ ụ ằ
ể ươ ắ ồ ạ
ắ
chúng ta s d ng hàm 01 ng t 21h đ nh p xâu, vì nó t n t
ả ượ
ậ
c a xâu nh p ph i đ
ắ
ủ
ng trình. Đ kh c ph c, MSDOS cung c p hàm 0Ah c a ng t 21h đ i hai
c
ể ắ
ộ ướ ươ ự ộ ả ̣ ế
ng trình, bi n này ph i c trong ch
ư ệ
ệ Int 21h
Mov Byte PTR DS:[DI], Al
INC DI
Loop Nhap_Xau
;
ả ử
Trong tr
ậ
nh p), không nh p các phím ch c năng.
ể
ậ
, không bao gi
Trong th c t
ạ
ự ủ
ể ế
h n ch : không th k t thúc nh p b ng cách gõ phím Enter; s kí t
ấ
ướ
ị
ấ
n đ nh tr
c trong ch
ỗ ợ
ự
ậ
h tr nh p xâu kí t
.
̀
ủ
Ham 0Ah c a ng t 21h:
́
ậ
Tac dung:Nh p m t xâu kí t
ượ
đ c ch b i c p thanh ghi DS:DX. Và bi n đ m ph i có d ng nh sau: ế
vào m t bi n đ m cho tr
ả
ế
ậ ủ ự ố
t ạ
i đa c a xâu nh p vào ể ố ể ứ ậ
c nh p ự ẽ ượ
s đ ộ ả ế ư ươ ươ
ế ế ỉ ở ặ
ứ ố
Byte 0: ch a s kí t
ộ ị
ứ
Byte 1: ch a m t tr không (= 0)
ộ ị ỗ
ứ
ệ
ự
ng trình th c hi n).
ư
ng trình ph i khai báo bi n (tên bi n là Xau_Nhap) nh
c m t bi n nh trên ch ư ậ ứ ế ể ầ ộ ượ ử ụ ể ứ ứ ị c s d ng đ ch a các kí t ị
s đ ự ẽ ượ
c ế
ứ ố ậ ự ể ậ ớ ị ỉ ị vào vùng nh có đ a ch xác đ nh ử ̣ ủ ậ ị ỉ ế ờ ư Byte 2, byte 3, byte 4, ... ch a m t tr r ng (đ tr ng), đ ch a các kí t
vào sau này (khi ch
ượ
ể
Đ có đ
sau:
Xau_Nhap DB 256, 0, 256 Dup (‘ ‘)
ồ
Nh v y Xau_Nhap là m t bi n ki u byte, g m 258 byte. Byte đ u tiên (byte) ch a tr 256,
ự ố
ứ
tr ng, đ
byte 1 ch a tr 0, 256 byte ti p theo ch a kí t
ự
.
nh p sau này. Xau_Nhap ch a t
i đa 256 kí t
ộ
ể ử ụ
Cũng có th s d ng hàm 0Ah/21h đ nh p m t xâu kí t
trong bô nh .ớ
S dung:
Vao:̀ Ah = 0Ah
DS:DX = <Đ a ch Segment:Offset c a xâu nh p>
Ra: DS:DX không thay đ iổ
ệ
Bi n đ m bây gi có d ng nh sau: ứ ổ ự ạ
Byte 0: không thay đ iổ
Byte 1: ch a t ng s kí t ố
ứ đã đ
ự ậ
c nh p vào
ậ
ượ
c nh p vào. ế ệ ớ ượ
đã đ
ư ế ươ ̣ ậ
ng trình nh p vào xâu: V i khai báo bi n đ m Xau_Nhap nh trên, n u sau này ch Byte 2, byte 3, byte 4, ... ch a các kí t
́
Vi du 1:
“Tin hoc” thì: ự trong xâu “Tin hoc” ẫ
Byte 0: v n ch a s 256
ứ
Byte 1: ch a giá tr 7, đó chính là 7 kí t
ứ ầ ượ
ừ ự t các kí t trong xâu “Tin hoc. ư ng trình đã khai báo xâu TieuDe nh sau: ứ ố
ị
ế
T byte 2 đ n 8 ch a l n l
ả ử ươ
Ví d 2:ụ Gi
s ch ự ế ộ ậ ể TieuDe DB 100, 0, 100 Dup (‘ ‘)
ử ụ ệ vào bi nTieuDe: ữ ệ ự ự ự ậ ư ư
th c s nh p đ a vào l u tr trong thanh ghi Cx: ạ ậ ệ ự ừ i màn hình: v a nh p ra l ự ừ ử ụ ể ệ ậ ạ i màn hình: v a nh p ra l ươ ự ộ ử ụ
ắ ạ
ử ụ ể ể
ậ ạ ng trình d ng COM sau đây s d ng hàm 0Ah ng t 21h đ nh p m t xâu kí t
i màn hình. ể ơ ả ế Buff g m toàn kí t
ồ
ầ ư ự ố ậ
ắ
ự ừ
v a nh p ra l
ờ
‘$’, nh đó, khi dùng hàm
ỉ ầ
ậ ng trình không c n đ a thêm kí t ‘$’ vào cu i xâu nh p, mà ch c n tr ỏ ự ầ c n in ra. Các l nh sau đây s d ng hàm 0Ah/21h đ nh p m t xâu kí t
Mov Ax, Seg TieuDe
Mov Ds, Ax
Lea Dx, TieuDe
Mov Ah, 0Ah
Int 21h
ấ ố
Các l nh sau đây l y s kí t
Mov Cx, 0
Mov Cl, TieuDe[1]
ể
ử ụ
Các l nh sau đây s d ng hàm 02/21h đ in xâu kí t
Lea DI, TieuDe
Mov Cx, 0
Mov Cl, TieuDe[1]
Add DI, 2
Mov Ah, 02
Lap_In:
Mov Dl, DS:[DI]
Int 21h
INC DI
Loop Lap_In
Các l nh sau đây s d ng hàm 09/21h đ in xâu kí t
Mov Ax, Seg TieuDe
Mov Ds, Ax
Lea Dx, TieuDe
Add Dx, 2
Mov DI, Dx
Mov Cx, 0
Mov Cl, TieuDe[1]
Add DI, Cx
Mov Byte PTR DS:[DI], ‘$’
Mov Ah, 09h
Int 21h
Ví d 3:ụ Ch
vào bi nế Buff. Sau đó s d ng hàm 09h ng t 21h đ in xâu kí t
ự
ươ
ng trình khai báo bi n
Đ đ n gi n, ch
ươ
ể
09h/21h đ in ra ch
ề ầ
DS:DX v đ u vùng/xâu kí t
.Model small ắ ặ ị ̣ ỉ
c g i s tr v trong c p thanh ghi ES:SI đ a ch Gi ượ ọ ẽ ả ề
ệ ử ụ ử ủ ả i, tên này dài không quá 8 kí t ự
.
ấ ẽ ả c đ a vào thanh ghi ah ầ
ắ ọ ự ể ra nàm hình .Code
ORG 100h
Start:
JMP Main
TBN DB 'Nhap vao mot xau ki tu: $'
TBX DB 0Ah,0Dh,'Xau vua nhap: $'
Buff DB 100,0,100 Dup ('$')
Main Proc
Mov Ah, 09h
Lea Dx, TBN
Int 21h
;
Mov Ah, 0Ah
Lea Dx, Buff
Int 21h
;
Mov Ah, 09h
Lea Dx, TBX
Int 21h
;
Mov Ah, 09h
Lea Dx, Buff
Add Dx, 2
Int 21h
;
Int 20h
Main Endp
End Start
ụ
ộ ố
M t s ví d :
́
ủ
ả ử
s hàm X c a ng t Y khi đ
Vi du 1:
ấ
ủ
ớ ứ
ủ
c a vùng nh ch a tên c a nhà s n xu t (nhãn hi u) c a vi x lý đang s d ng trên máy tính
ệ ạ
hi n t
ệ
Các l nh sau đây s in tên nhà s n xu t nói trên ra màn hình:
ọ ượ ư
Mov Ah, X ; hàm c n g i đ
ớ
Int Y ; g i ng t Y v i hàm X
;
Mov Cx, 8 ; tên dài không quá 8 kí tự
Mov Ah, 02 ; dùng hàm 02/21h đ in kí t
LapIn: ế ự ế ti p theo ắ ả ử ượ ọ c g i v i AL = 1 (đ ị ắ ự ặ
ử ụ ỉ ủ
ệ ạ ẽ ả ề
c g i là hàm con) s tr v
ớ ứ ngàythángnăm s n xu t ROMBIOS
ờ trong ấ
ế ố
t s kí t ả
i. Đ ng th i hàm/ng t này cũng cho bi ệ ngàythángnăm nói trên ra màn hình: ầ c đ a vào thanh ghi ah ắ ọ
ọ ự ủ ư ố c a xâu ngàythángnămvào Cx ể ự ra nàm hình ự ế ế ti p theo ị c s d ng đ t o th m c con trên đĩa. Hàm này quy đ nh: ư ụ ầ ạ ả ườ ư ụ ế ứ
ở ị ẽ ứ ế ư ụ ố ổ ư ụ ư ụ ẽ ạ ệ đĩa ư ụ ầ ạ ươ ứ ư ế ả ng trình ph i khai báo bi n TenTM, ch a xâu tên th m c c n t o nh sau: ệ ạ ị ỗ ế i Mov Dl, Byte PTR ES:[SI]
Int 21h
INC SI ; đ n kí t
Loop LapIn
;
Ví d 2:ụ Gi
ượ ọ ớ
ủ
s hàm X c a ng t Y khi đ
trong c p thanh ghi ES:DI đ a ch c a vùng nh ch a
ồ
đang s d ng trên máy tính hi n t
xâu ngàythángnăm trong thanh ghi BX.
ẽ
Các l nh sau đây s in xâu
ọ ượ ư
Mov Ah, X ; hàm c n g i đ
ớ
Mov Al, 1 ; g i hàm X v i Al = 1
ớ
Int Y ; g i ng t Y v i hàm X
;
Mov Cx, Bx ; đ a s kí t
Mov Ah, 02 ; dùng hàm 02/21h đ in kí t
LapIn:
Mov Dl, Byte PTR ES:[DI]
Int 21h
INC DI ; đ n kí t
Loop LapIn
;
ư ụ
Ví d 3:ụ Hàm 39h c a ng t 21h đ
ể ạ
ượ ử ụ
ắ
ủ
ẫ
ồ
DS:DX ch a xâu tên th m c c n t o, bao g m c đ
ng d ntìm đ n th m c này, xâu này
ệ ạ
ế
k t thúc b i tr 0. N u vi c t o không thành công thì Cf = 1, khi đó thanh ghi Ax s ch a mã
i.ỗ
l
Các l nh sau đây s t o ra th m c con BTCB trong th m c ASSEM trên th m c g c
D.
Ch
TenTM DB ‘D:\ASSEM\BTCB’,0
Các l nh:ệ
Mov Ax, Seg TenTM
Mov DS, Ax
Mov Dx, Offset TenTM
Mov Ah, 39h
Int 21h
;
Jc TB_Loi ; n u CF = 1 thì vi c t o b l
ự ọ ậ ử ụ ươ TB_Loi:
ứ Th Ba, 03/09/2013 16:05 Ụ M T S VÍ D ị ặ ắ ỉ
c g i s tr v trong c p thanh ghi ES:SI đ a ch Ộ Ố
ượ ọ ẽ ả ề
ệ ủ ả ử ử ụ ủ
ả ử
s hàm X c a ng t Y khi đ
ấ
ủ
ớ ứ i, tên này dài không quá 8 kí t ả ẽ ự
.
ấ c đ a vào thanh ghi ah ọ ầ
ắ ể ự ra nàm hình ế ự ế ti p theo ượ ọ ả ử ắ c g i v i AL = 1 (đ ị ẽ ả ề
c g i là hàm con) s tr v
ớ ứ ngàythángnăm s n xu t ROMBIOS
ờ ỉ ủ
ệ ạ ặ
ử ụ ự ắ ả
i. Đ ng th i hàm/ng t này cũng cho bi ấ
ế ố
t s kí t trong ệ ngàythángnăm nói trên ra màn hình: ầ c đ a vào thanh ghi ah ọ
ọ ắ ư ố ự ủ ngàythángnămvào Cx c a xâu
ể ự ra nàm hình ự ế ế ti p theo Ví d 1:ụ Gi
ủ
c a vùng nh ch a tên c a nhà s n xu t (nhãn hi u) c a vi x lý đang s d ng trên máy tính
ệ ạ
hi n t
ệ
Các l nh sau đây s in tên nhà s n xu t nói trên ra màn hình:
ọ ượ ư
Mov Ah, X ; hàm c n g i đ
ớ
Int Y ; g i ng t Y v i hàm X
;
Mov Cx, 8 ; tên dài không quá 8 kí tự
Mov Ah, 02 ; dùng hàm 02/21h đ in kí t
LapIn:
Mov Dl, Byte PTR ES:[SI]
Int 21h
INC SI ; đ n kí t
Loop LapIn
;
Ví d 2:ụ Gi
ượ ọ ớ
ủ
s hàm X c a ng t Y khi đ
trong c p thanh ghi ES:DI đ a ch c a vùng nh ch a
ồ
đang s d ng trên máy tính hi n t
xâu ngàythángnăm trong thanh ghi BX.
ẽ
Các l nh sau đây s in xâu
ọ ượ ư
Mov Ah, X ; hàm c n g i đ
ớ
Mov Al, 1 ; g i hàm X v i Al = 1
ớ
Int Y ; g i ng t Y v i hàm X
;
Mov Cx, Bx ; đ a s kí t
Mov Ah, 02 ; dùng hàm 02/21h đ in kí t
LapIn:
Mov Dl, Byte PTR ES:[DI]
Int 21h
INC DI ; đ n kí t
Loop LapIn ị c s d ng đ t o th m c con trên đĩa. Hàm này quy đ nh: ế ư ụ ả ườ ư ụ ầ ạ ế ẽ ứ ứ
ở ị ư ụ đĩa ứ ẽ ạ
ả ư ụ
ế ư ụ ầ ạ ư ụ ố ổ
ư ng trình ph i khai báo bi n TenTM, ch a xâu tên th m c c n t o nh sau: ế ị ỗ ệ ạ i ấ ả ươ ự ả ạ có trong b ng mã t c (256) các kí t ;
ư ụ
Ví d 3:ụ Hàm 39h c a ng t 21h đ
ể ạ
ượ ử ụ
ắ
ủ
ẫ
ồ
DS:DX ch a xâu tên th m c c n t o, bao g m c đ
ng d ntìm đ n th m c này, xâu này
ệ ạ
ế
k t thúc b i tr 0. N u vi c t o không thành công thì Cf = 1, khi đó thanh ghi Ax s ch a mã
i.ỗ
l
ệ
Các l nh sau đây s t o ra th m c con BTCB trong th m c ASSEM trên th m c g c
ươ
D. Ch
TenTM DB ‘D:\ASSEM\BTCB’,0
Các l nh:ệ
Mov Ax, Seg TenTM
Mov DS, Ax
Mov Dx, Offset TenTM
Mov Ah, 39h
Int 21h
;
Jc TB_Loi ; n u CF = 1 thì vi c t o b l
ạ ộ ự ấ ỳ b t k . Sau đó in ra ậ ậ ậ
ng trình d ng COM: Nh p vào m t xâu kí t
ể
ử ụ
c nh p vào nh p. S d ng hàm 09/21h đ in ra. ươ
Sau đây là ch
ự ừ ượ
v a đ LapIn:
Int 21h
;
Mov Bl, Dl
Mov Dl, ' '
Int 21h
Mov Dl, Bl
;
INC Dl
Loop LapIn
;
Int 20h
Main Endp
End Start
ụ
Ví d 5.1:
ạ
l
i chính xâu kí t
.Model Small
.Code
ORG 100h
Start:
JMP Main
TBN DB 'Nhap vao mot xau ki tu: $'
TBX DB 0Ah,0Dh,'Xau vua nhap: $'
Buff DB 100,0,100 Dup (' ')
Main Proc
Mov Ah, 09h
Lea Dx, TBN
Int 21h
;
Mov Ah, 0Ah
Lea Dx, Buff
Int 21h
;
Mov Cx, 0
Mov Cl, Buff[1]
Add Dx, 2
Mov DI, Dx
Add DI, Cx ộ ự ấ ỳ ậ ạ b t k . Sau đó in ra l ạ
i ể ậ ậ ử ụ ươ
ng trình d ng EXE: Nh p vào m t xâu kí t
c nh p vào nh p. S d ng hàm 02/21h đ in ra. Sau đây là ch
ự ừ ượ
v a đ Mov Byte PTR [DI], ‘$’
;
Mov Ah, 09h
Lea Dx, TBX
Int 21h
;
Mov Ah, 09h
Lea Dx, Buff
Add Dx, 2
Int 21h
;
Int 20h
Main Endp
End Start
ụ
Ví d 5.2:
chính xâu kí t
.Model Small
.Stack 100h
.Data
TBN DB 'Nhap vao mot xau ki tu: $'
TBX DB 0Ah,0Dh,'Xau vua nhap: $'
Buff DB 100,0,100 Dup (' ')
.Code
Main Proc
Mov Ax,@Data
Mov DS, Ax
;
Mov Ah, 09h
Lea Dx, TBN
Int 21h
;
Mov Ah, 0Ah
Lea Dx, Buff
Int 21h
;
Mov Cx, 0
Mov Cl, Buff[1]
Add Dx, 2 ươ ẽ ạ ậ ộ ng trình d ng COM: Nh p vào m t kí t ự ườ
th ng, ch ng trình s in ự ươ
ng ng. Mov DI, Dx
;
Mov Ah, 09h
Lea Dx, TBX
Int 21h
;
Mov Ah, 2
Lap_In:
Mov Dl, [DI]
Int 21h
INC DI
Loop Lap_In
;
Mov Ah, 4Ch
Int 21h
Main Endp
End
Ví d 6:ụ Sau đây là ch
ươ ứ
in hoa t
ra kí t
.Model Small
.Code
ORG 100h
Start:
Jmp Main
TB1 DB 'Nhap vao mot ki tu thuong: $'
TB2 DB 0Ah,0Dh,'Ki tu hoa tuong ung: $'
Main Proc
Mov Ah, 09h
Lea Dx, TB1
Int 21h
;
Mov Ah, 01
Int 21h
Mov Bl, Al
;
Mov Ah, 09h
Lea Dx, TB2
Int 21h
; ộ ự ạ ậ ạ sau đó in ra l i xâu đã ng trình d ng COM: Nh p vào m t xâu kí t
ượ ậ ứ ự ả c. ươ
đ o ng Mov Ah, 02
Mov Dl, Bl
Sub Dl, 20h
Int 21h
;
Int 20h
Main Endp
End Start
Ví d 7:ụ Sau đây là ch
nh p theo th t
.Model Small
.Code
ORG 100h
Start:
JMP Main
TBN DB 'Nhap vao mot xau ki tu: $'
TBX DB 0Ah,0Dh,'Xau vua nhap: $'
Buff DB 100,0,100 Dup (' ')
Main Proc
Mov Ah, 09h
Lea Dx, TBN
Int 21h
;
Mov Ah, 0Ah
Lea Dx, Buff
Int 21h
;
Mov Cx, 0
Mov Cl, Buff[1]
;
Mov Ah, 09h
Lea Dx, TBX
Int 21h
;
Lea Dx, Buff
Add Dx, 2
Mov DI, Dx
Add DI, Cx
Dec DI ỏ ơ ạ ậ ươ ố ố ứ ấ ng trình d ng COM: Nh p vào hai s (s th nh t: nh h n 5; s th ố ứ ổ ậ ủ ố ừ Sau đây là ch
ặ ằ Mov Ah, 02
Lap_In_Nguoc:
Mov Dl, [DI]
Int 21h
DEC DI
Loop Lap_In_Nguoc
;
Int 20h
Main Endp
End Start
Ví d 8:,ụ
ỏ ơ
hai: nh h n ho c b ng 5), sau đó in ra t ng c a hai s v a nh p.
.Model Small
.Code
ORG 100h
Start:
Jmp Main
TBN1 DB 'Nhap so hang thu nhat (nho hon 5): $'
TBN2 DB 0Ah,0Dh,'Nhap so hang thu hai (nho hon bang 5): $'
TBX DB 0Ah,0Dh,'Tong cua hai so la: $'
Main Proc
Mov Ah, 09h
Lea Dx, TBN1
Int 21h
Mov Ah, 01
Int 21h
Mov Bl, Al
Sub Bl, 30h
;
Mov Ah, 09h
Lea Dx, TBN2
Int 21h
Mov Ah, 01
Int 21h
Sub Al, 30h
Add Bl, Al
;
Mov Ah, 09h Lea Dx, TBX
Int 21h
Mov Ah, 02
Mov Dl, Bl
Add Dl, 30h
Int 21h
;
Int 20
Main Endp
End Start ự ọ ậ ậ ệ ủ ế T h c l p trình assembly Bài 6: T p l nh assembly c a Intel 8088/8086 Ti p theo (1) ứ Th Sáu, 25/10/2013 15:44 Ậ Ệ Ủ ế T P L NH ASSEMBLY C A INTEL 8088/8086 (Ti p theo) ệ L nh so sánh: ́ ́ ́ ́ ̣ ̣ Cu phap: ́ Cmp [Toan hang đich ̀
], [Toan hang nguôn ] (cid:0) ́ ể ằ ̣ ̣ ́ ́
́ ế
́ ̀
́ ̀ ́ ể ́
ằ ố ̣ ̣ ̣ (cid:0) ị ộ ủ ệ ̣ ́ ̀ ́ ́ ̣ ̣ ̣ ́ ́ ể
ự ư ệ
ổ ư ế ả ỉ ̣ ̣ ị ủ Trong đo:́ [Toan hang đich], [Toan hang nguôn] có th là h ng, bi n, thanh ghi hay ô
ớ
nh . [Toan hang đich] không th là h ng s . [Toan hang đich] và [Toan hang nguôn] không
ớ
ể ồ
ờ
th đ ng th i là ô nh .
c s d ng đ so sánh giá tr /n i dung c a [Toan ́
́
ượ ử ụ
L nh Cmp (
Compare) đ
Tac dung:
́
ừ
ấ
ươ
ớ
nh l nh Sub, nó l y [Toan hang đich] tr
ng t
hang đich] so v i [Toan hang nguôn]. T
̀
́
đi [Toan hang nguôn] nh ng k t qu không làm thay đ i [Toan hang đich] mà ch làm thay
ộ ố ờ ệ
ổ
đ i giá tr c a m t s c hi u: CF, ZF, OF,... ́ ̀ ́ ́ ́ ́ ả ế ̣ ̣ ̣ ́ ủ ệ
̀ ́ ́ ́ ́ ̀ ̣ ̣ ̣ ̣ ̣ ́
̀ ́ ́ ̀ ́ ̣ ̣ ̣ ̣ → → ả ẽ ế ộ K t qu so sánh c a l nh Cmp là: [Toan hang đich] > [Toan hang nguôn]; [Toan hang đich]
́
≥[Toan hang nguôn]; [Toan hang đich] < [Toan hang nguôn]; [Toan hang đich] ≤[Toan hang
̀
́
ỗ
nguôn]; [Toan hang đich] = [Toan hang nguôn]; [Toan hang đich] ≠ [Toan hang nguôn];... m i
ộ ờ ươ ứ
ế
k t qu s tác đ ng (0 1, 1 0) đ n m t c t ́
́
ụ ể
ng ng c th nào đó. ả ử ụ ươ ể ờ c k t qu so sánh ch
ả ượ ặ ệ
ư ậ ệ ẽ ệ ng trình ph i s d ng các l nh ki m tra c (đó là cá
c đ t ngay sau l nh so sánh. Nh v y l nh Cmp s không có ý ộ ậ ể ế ượ ế
ả
Do đó, đ bi
t đ
ả
ệ
l nh nh y), và chúng ph i đ
ứ
nghĩa khi nó đ ng đ c l p. ể ề ệ ấ ả ổ i, l nh Cmp đ
ề ượ ạ ệ
ả c l
ệ ể
Có th nói ng
ờ
các c ) cho các l nh nh y có đi u ki n. ị
ượ ử ụ
c s d ng đ cung c p đi u ki n nh y (thay đ i giá tr
ệ ́ ̣ Vi du 1: (cid:0) (cid:0) (cid:0) ị
ị
ớ ộ ớ
ớ
ớ ượ Cmp Ax, Bx ; so sánh giá t thanh ghi Ax v i Bx
Cmp Ax, 20 ; so sánh giá tr thanh ghi Ax v i 20
Cmp Ax, [SI] ; so sánh Ax v i n i dung ô nh đ ỉ ở
c ch b i SI Ví d 2:ụ (cid:0) (cid:0) ị ế ớ
ớ ị
ị Cmp Al, ‘A’ ; so sánh giá tr thanh ghi Al v i ‘A’
Cmp Al, Var1 ; so sánh giá tr thanh ghi Al v i giá tr bi n Var1 ấ ả ề ế ế ả ộ trên đi u không có ý nghĩa, vì nó không cho bi t k t qu so sánh m t ở
ệ
T t c cá l nh Cmp
ờ
ả
ự ế
cách tr c ti p mà ph i ánh thông qua các c . ể ử ụ ị ủ ể ể ặ ờ
L nhệ Cmp không th s d ng đ so sánh ho c ki m tra giá tr c a các c . ệ ả
Các l nh nh y ệ ệ ề ả L nh nh y không đi u ki n: ́ ị Cu phap: ́ Jmp (cid:0) ị ộ ệ ủ ụ ủ ộ ặ
ể ị Trong đo:́ ơ ế ự ệ ủ ệ ổ ộ ỏ ệ ủ ặ
ộ ỉ ủ ệ ớ ẽ ị C ch th c hi n c a l nh Jmp là thay đ i n i dung c a c p thanh ghi con tr l nh CS:IP.
ớ
CS:IP m i s là đ a ch c a l nh sau ạ ệ ỉ ổ ớ ạ ệ ệ ả ượ ạ
c l
ổ ệ
ạ ự
ề ệ ớ ạ ệ ớ ị ự
i, v i d ng Far, khi l nh th c hi n thì c thanh ghi IP và
ố ớ ạ
ượ ạ
c l i, v i d ng Far thì l nh Jmp ớ ị ị
ố ớ ạ
L nh Jmp có 3 d ng: Short, Near và Far. Đ i v i d ng Short và Far thì ch có thanh ghi IP b
ệ
thay đ i khi l nh th c hi n, ng
ị
thanh ghi đo n CS đ u b thay đ i. Hay nói cách khác: Đ i v i d ng Short và Near thì l nh
ả ằ
Jmp và ́ ̣ Vi du 1: Start: Jmp Main TieuDe DB ‘Khoa CNTT – DHHH’ Main Proc .................. Main Endp End Start Ví d 2:ụ (cid:0) Jmp short Main (cid:0) Jmp Ax (cid:0) Jmp word PTR [BX] (cid:0) Jmp dword PTR [BX] Ví d 3:ụ Reset DD 5BE000F0h Jmp Reset Ví d 4:ụ Mov Ax, 15 Mov Bx, 20 Jmp TTong Add Ax, Bx TTong: Sub Ax, Bx Mov Cx, Ax ế ạ ệ ượ ự ệ ặ c th c hi n. Khi g p ệ ệ ươ ụ ả ng trình nh y đ n th c hi n l nh sau nhãn TTong, đó chính là ệ Add Ax, Bx không đ
K t thúc đo n l nh trên Cx = Ax = 5, vì l nh
l nhệ Jmp TTong ch
ế
l nhệ Sub Ax, Bx. ề ệ ả ệ L nh nh y có đi u ki n: ́ ề ệ ị ́
Cu phap chung: ả
(cid:0) ươ nh l nh Jmp. (cid:0) ự ư ệ
ng t
ề
ả ệ ặ ầ ̣ ng trình s ki m tra Khi g p m t l nh nh y có đi u ki n, đ u tiên ch
ả ủ ươ
ệ ệ ự ề ế ẽ ể
ị ở ế
ả ệ ề ờ ệ ự ề ả ủ
ả ươ ổ ươ ệ ị
ệ ả ả ổ ơ ị ướ ệ ử ụ ệ ổ
ệ
ể
ị ủ
Đi u ki n nh y c a các l nh nh y này chính là s thay đ i giá tr c a các c hi u, do đó đ
ị
ệ
ị ủ
ộ ệ
ạ
ả
ng trình ph i làm thay đ i giá tr c a
t o đi u ki n nh y cho m t l nh nh y xác đ nh thì ch
ể
ườ
ớ
ờ ệ ươ ứ
ng ng v i nó. Ch
ng dùng các l nh đ ch bít, quay bít, so sánh,... đ
c hi u t
ấ
ệ
ờ ệ
làm thay đ i giá tr các c hi u đ t o đi u ki n nh y cho các l nh nhay. Cách đ n gi n nh t
là s d ng l nh Cmp ngay tr ả
ng trình th
ề
ể ạ
ả
c l nh nh y. ệ ớ ữ ệ ề ệ ấ ả Sau đây là các l nh nh y có đi u ki n v i d li u có d u: (cid:0) (cid:0) (cid:0) (cid:0) ồ
ồ
ồ
ồ ế
ế
ế
ế ả
ả
ả
ả L nhệ JG: Nh y n u [Đích] > [Ngu n] ; (SF = 0F và ZF = 0)
L nhệ JL: Nh y n u [Đích] < [Ngu n] ; (SF <> 0F)
L nhệ JGE: Nh y n u [Đích] ≥[Ngu n] ; (SF = 0F)
L nhệ JLE: Nh y n u [Đích] ≤[Ngu n] ; (CF <> 0F và ZF = 1) (cid:0) ề ệ ... ́ ồ ̣ ̣ ứ ́
ươ ướ ệ ử ụ ạ
ứ ả c l nh nh y. T c là, ch ́
ệ
ng trình s d ng l nh Cmp đ t o
ự ệ ượ ệ ả ể
c hay không (có chuy n
ồ ụ ể ệ
ụ ệ
ệ
ể ị ủ ộ ị ướ ̀
Trong đó: [Đích] và [Ngu n] chính là hai toán h ng: [Toan hang đich] và [Toan hang nguôn]
ể ạ
trong l nh Cmp đ ng ngay tr
ề
ả
đi u ki n nh y cho các l nh này. C th : l nh nh y có th c hi n đ
ế
ề
đi u khi n đ n ớ ề ệ ệ ệ ả ả ầ ệ ử ụ
ế ể ạ
ả ủ ờ ề ệ V i vi c s d ng l nh Cmp đ t o đi u ki n nh y cho các l nh nh y thì ta không c n quan
tâm đ n các c đi u ki n nh y c a chúng. ệ ớ ữ ệ ệ ấ ả ề
Sau đây là các l nh nh y có đi u ki n v i d li u không d u: (cid:0) (cid:0) (cid:0) ồ
ồ
ớ (cid:0) ế
ế
ế
ế ả
ả
ả
ả ơ
ỏ ơ L nhệ JA: Nh y n u [Đích] > [Ngu n] ; (CF = 0 và ZF = 0)
L nhệ JB: Nh y n u [Đích] < [Ngu n] ; (CF = 0)
ồ
L nhệ JNA: Nh y n u [Đích] không l n h n [Ngu n]; (CF =1 or ZF =1)
ồ
L nhệ JNB: Nh y n u [Đích] không nh h n [Ngu n] ; (CF = 0) ớ ữ ệ ữ ệ ụ ể ệ ấ ấ ả ớ Các l nh nh y v i d li u có d u có th áp d ng v i các d li u không d u. ề ệ ệ ả Sau đây là các l nh nh y có đi u ki n dùng chung: (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) ế ờ
ế ờ
ế ờ
ế ờ
ế
ế ả
ả
ả
ả
ả
ả ồ
ồ ươ
ươ ự
JZ; (ZF = 1)
ng t
ự
JNZ; (ZF = 0)
ng t (cid:0) ề ệ L nhệ JC: Nh y n u c CF = 1
L nhệ JNC: Nh y n u c CF = 0
L nhệ JZ: Nh y n u c ZF = 1
L nhệ JNZ: Nh y n u c ZF = 0
L nhệ JE: Nh y n u [Đích] = [Ngu n]; T
L nhệ JNE: Nh y n u [Đích] ≠[Ngu n]; T
... ươ ườ ặ ệ ử ụ ể ạ ệ ị ng trình th ng s d ng các l nh d ch bít ho c l nh quay bít đ t o ớ
ề ệ ả ệ
V i các l nh này, ch
đi u ki n nh y nó. ị ủ ự ự ệ ệ ị ệ Dãy l nh sau đây th c hi n vi c gán giá tr cho thanh ghi Cx d a vào giá tr c a Ví d 1a:ụ
thanh ghi Ax và Dx: Mov Ax, 12 Mov Dx, 25 ; Cmp Ax, Dx ; Ax ? Bx ế Jg Nhan1 ; n u Ax > Dx Jle Nhan2 Nhan1: Mov Cx, Ax Jmp Tiep_Tuc Nhan2: Mov Cx, Dx Jmp Tiep_Tuc Tiep_Tuc: Mov Bx, Cx ; ắ ơ ớ ệ Jle Nhan2, vì n u Ax không l n h n Dx thì ch c ẵ ể ấ ở
ẽ đây là t ệ Jmp Tiep_Tuc sau
ạ ệ
ế
ấ
t nhiên. Vì th đo n l nh ế ệ
ư ể ượ ế Có th th y,
ch n nó s nh h n ho c b ng Dx. Ngoài ra cũng không c n dùng l nh
nhãn Nhan2, vì vi c chuy n đ n l nh sau nhãn
trên có th đ ầ
đây không c n dùng l nh
ặ ằ
ỏ ơ
ể
ệ
ọ
c vi t rút g n nh trong ế
ầ
ở
Tiep_Tuc
Ví d 1bụ sau đây. ệ ườ ọ ủ ệ ợ Dãy l nh sau đây là tr ng h p rút g n c a dãy l nh trên: Ví d 1b:ụ Mov Ax, 12 Mov Dx, 25 ; Cmp Ax, Dx ế Jg Nhan1 ; n u Ax > Dx Mov Cx, Dx ; khi Ax ≤Dx Jmp Tiep_Tuc Nhan1: Mov Cx, Ax ; khi Ax > Dx Tiep_Tuc: Mov Bx, Cx ; ả ụ ế ư ế Cx = Dx = 25. Nh ng n u cho Trong c hai ví d trên: khi k t thúc, Bx =
Ax = 120 (Ax > Bx) thì Bx = Cx = Ax = 120. ứ ể ả ộ ố ộ ớ ỉ s t i đ a ch 0A000:0100 trong b nh có ch a m t m ng các s nguyên ki u ồ ả ử ạ ị
Ví d 2:ụ Gi
ầ ử
byte, g m 100 ph n t (100 byte). ị ủ ả ơ ớ ầ ử ủ ổ ế
trong m ng này mà giá tr c a nó l n h n 123. K t ệ
Các l nh sau đây tính t ng c a các ph n t
ả ứ ở
qu ch a thanh ghi Dx. Mov Ax, 0A000h Mov DS, Ax Mov DI, 0100h ; Mov Dx, 0 Mov Cx, 100 Lap_TT: Mov Al, Byte PTR DS:[DI] Cmp Al, 123 Jle Tiep_Tuc Add Dx, Al Tiep_Tuc: ỏ ế ầ ử ế ế INC DI ; tr đ n ph n t k ti p ặ ạ ể ổ Loop Lap_TT ; l p l i: ki n tra và tính t ng ; ứ ớ ộ ộ ự ượ s t i đ a ch 0C000:00120 trong b nh có ch a m t xâu kí t , xâu này đ c ả ử ạ ị
ị ố Ví d 3:ụ Gi
ỉ
ở
ế
k t thúc b i giá tr 0 (s 0). ẽ ế ồ ự ế ả ớ . K t qu ghi vào ô nh ngay ướ Các l nh sau đây s đ m xem xâu nói trên g m bao nhiêu kí t
tr ệ
ớ ứ
c vùng nh ch a xâu này: Mov Ax, 0C000h Mov ES, Ax Mov DI, 00120h Mov SI, DI ; Mov Dx, 0 Lap_Dem: Mov Al, Byte PTR ES:[DI] Cmp Al, 0 ; so sánh Al v i 0ớ ế ế ố Je KetThuc ; n u Al = 0: đã đ n cu i xâu INC Dx ; khi Al <> 0: đ mế ỏ ế ự ế ế INC DI ; tr đ n kí t k ti p ặ ạ ế ể Jmp Lap_Dem ; l p l i: ki n tra và đ m KetThuc: Mov Byte PTR DS:[SI 1], Dx ; ư ệ ả ộ Ví d 4:ụ Các l nh sau đây in n i dung b n b n ASCII ra màn hình, nh ng không in ra các kí
ả
ự
t có mã 07h, 0Ah, 0Dh. Mov Cx, 256 Mov Ah, 02 Mov Dl, 0 Lap_In: Cmp Dl, 07h Je TTuc Cmp Dl, 0Ah Je TTuc Cmp Dl, 0Dh Je TTuc Int 21h TTuc: INC DL Loop Lap_In ; ệ ậ ộ ự ấ ỳ ự ế ừ ự ừ
b t k , dài không quá 200 kí t
, t
ậ
ữ
là ch cái in hoa trong xâu v a nh p vào ế Ví d 5:ụ Các l nh sau đây cho phép nh p m t xâu kí t
bàn phím vào bi n XauNhap. Sau đó copy các kí t
bi n XauHoa. ướ ế ươ ế ả Tr c h t ch ng trình ph i khai báo các bi n: XauNhap DB 200, 0, 200 Dup (‘ ’) XauHoa DB 200 Dup (‘ ’) Các l nh:ệ Mov Ax, Seg XauNhap Mov DS, XauNhap Mov Dx, Offset XauNhap Mov Ax, Seg XauHoa Mov ES, XauHoa Mov DI, Offset XauHoa ; Mov Ah, 0Ah Int 21h ; Mov Cx, 0 Mov Cl, XauNhap[1] Mov SI, Dx Add SI, 2 ; Lap_Copy: Mov Al, DS:[SI] Cmp Al, ‘A’ Jl TTuc Cmp Al, ‘Z’ Jg TTuc Mov ES:[DI], Al INC DI TTuc: INC SI ; Loop Lap_Copy ; ớ ả ự ằ ở ữ ữ ế ị là ch cái in hoa n m nh ng v trí liên ti p nhau: A, ầ ượ Nên nh , trong b ng mã ASCII các kí t
B, C, ..., Z, chúng có mã l n l t là 65, 66, 67, ..., 90. ữ ệ ứ ộ ỉ ớ
ụ ể ế ộ
ứ ị i đ a ch 0F000:FFFE trong b nh ROMBIOS có ch a m t byte d li u.
ạ ủ
t lo i c a máy tính đang s d ng. C th , n u byte này: ch a tr 0FBh: máy ử ụ
ị ứ ứ ả ử ạ ị
Ví d 6:ụ Gi
s t
ế
Byte này cho bi
ị
PC/XT; ch a tr 0FCh: máy PC/AT; ch a tr 0FFh: máy PC classic;... ệ ế ử ụ ạ ộ Các l nh sau đây cho bi t máy tính đang s d ng thu c lo i máy nào: ướ ế ươ ả ờ ế ả Tr c h t ch ng trình ph i khai báo các bi n tr l i: TB1 DB ‘Day la may PC/XT.$’ TB2 DB ‘Day la may PC/AT.$’ TB3 DB ‘Day la may PC classic.$’ Các l nh:ệ Mov Ax, 0F000h Mov ES, Ax Mov SI, 0FFFEh ; Mov Al, Byte PTR ES:[SI] Cmp Al, 0FBh Je TraLoi1 Cmp Al, 0Fch Je TraLoi2 Cmp Al, 0Ffh Je TraLoi3 ... TraLoi1: Mov Ax, Seg TB1 Mov DS, Ax Lea Dx, Offset TB1 Mov Ah, 09 Int 21h Jmp KetThuc TraLoi2: Mov Ax, Seg TB2 Mov DS, Ax Lea Dx, Offset TB2 Mov Ah, 09 Int 21h Jmp KetThuc TraLoi1: Mov Ax, Seg TB3 Mov DS, Ax Lea Dx, Offset TB3 Mov Ah, 09 Int 21h Jmp KetThuc ..... KetThuc: Mov Ah, 4Ch Int 21h ; ộ ể ể ợ ủ ụ
ế ạ ậ
ụ ữ ợ ớ ể ấ ệ ệ ấ
ầ ơ ả ượ ự ấ ấ ớ ̃ ữ ợ ộ
ơ ư ả ấ ệ ̃
ư
ấ
Có th nói, ví d trên đây là m t thao tác đi n hình trong l p trình h p ng . Nó cũng cho th y
i l p trình h p ng ̃
ứ
ư
ườ ậ
ch c năng và th m nh c a ngôn ng này. Đây cũng là m c tiêu mà ng
ớ ữ ệ
ấ
ắ
i. Vi c truy xu t vào các vùng nh d li u đ l y các byte/word thông tin c u hình h
nh m t
ộ
ệ
ữ ậ
ố
c th c hi n m t
th ng là m t yêu c u c b n v i các ngôn ng l p trình c p th p, và nó đ
ắ ể
ụ
cách khá đ n gi n trong ngôn ng h p ng . Ví d trên đây cũng cho th y nguyên t c đ làm
vi c này. ế ệ ị Các l nh D ch bít – Quay bít (còn ti p) ự ọ ậ ậ ệ ủ ế T h c l p trình assembly Bài 6: T p l nh assembly c a Intel 8088/8086 Ti p theo (2) ứ Th Sáu, 25/10/2013 16:08 Ậ Ệ Ủ ế T P L NH ASSEMBLY C A INTEL 8088/8086 (Ti p theo) ệ ị Các l nh D ch bít – Quay bít ị ệ ề ệ ị ị ả ệ ệ
ặ ề ặ ộ ộ
ệ
ả ề ộ ượ ị ặ
ờ ệ c d ch hay đ ề
t đ ặ
ề ầ ượ ượ ư
c quay đ u l n l
ể ể ượ ử ụ ườ ng đ Các l nh d ch bít là các l nh làm cho các bít trong m t thanh ghi b d ch v bên trái (l nh ShR)
ộ
ề
ho c v bên ph i (l nh ShL) m t ho c nhi u bít. L nh quay bít làm cho các bít trong m t
ườ
ề
thanh ghi quay theo “chi u trái” ho c theo “chi u ph i” m t ho c nhi u bít. Thông th
ng
ị
ượ
c đ a qua c CF. Do đo, các l nh d ch bít
các bít đ
ủ
ị
và quay bít th
c s d ng đ ki m tra giá tr bít (= 0 hay = 1) c a các bít trong thanh
ghi. ợ ệ ệ ạ ờ ̃
ư
ờ ấ
H p ng cung c p hai d ng l nh quay bít, quay không qua c CF (l nh RoL và RoL) và quay
ệ
có qua c CF (l nh RcL và RcR). ́ ́ Cu phap: (cid:0) ̣ (cid:0) ̣ ̣ ̣ ́
́
Shr [Toan hang đich
́
́
Shl [Toan hang đich
(cid:0) Rcr [Toan hang đich
́
́
(cid:0) Rcl [Toan hang đich
́
́ ], ầ ặ ộ ố ị ̣ ́
ự ế ́
ị ệ ế ả ớ ơ ỉ ỉ ị Trong đo:́ [Toan hang đich] là m t thanh ghi 8 bít ho c 16 bít. ́ ̣ Tac dung: (cid:0) ́ ́ ̣ ả ờ ầ ượ ượ ư
t đ ứ ặ
ị ề
ố ộ
ủ ầ ố ị ậ ượ ằ ớ ị ươ ẽ ộ ứ
ự ớ
v i thanh ghi 16 bít thì sau 16 l n d ch nó s nh n đ ị
ng t ầ
ị ề ị ờ
ế ở
ẽ ượ
ầ
c
ị
ộ
c m t
ẽ ư
01001001 thì sau khi b d ch v bên trái 2 bít nó s nh L nhệ ShR (Shift Logical Right): D ch chuy n các bít trong thanh ghi [Toan hang đich]
ị
ể
ượ ị
ẽ
c đ a vào c CF, c CF s
sang ph i m t ho c nhi u bít. Các bít đ
c d ch l n l
ệ
ị
ch a bít c a l n d ch cu i cùng. Sau khi d ch các bít b khuy t ( bên đ i di n) s đ
c
ẽ
thay b ng các bít có tr 0. T c là, v i thanh ghi 8 bít thì sau 8 l n d ch nó s nh n đ
ậ ượ
m t dãy 8 bít = 0, t
ế
dãy 16 bít = 0. N u thanh ghi AL =
sau: AL = 00100100, khi đó CF = 1. (cid:0) ươ ự ư ệ ư ượ ị ng t nh l nh ShR nh ng các bít đ ề
c d ch v L nhệ ShL (Shift Logical Left): T phía bên trái. (cid:0) ượ ư c ự ư ệ
nh l nh ShR, nh ng bít đ
ứ ị ớ
bên đ i di n. T c là, v i thanh ghi 8 bít thì sau 8
ươ ầ ị ươ
L nhệ RCR (Rotate through Carry Right): T
ố
ng t ề ế ầ ị ng t
ệ
ế ở
ạ
i bít b khuy t
ự ớ
ầ
v i thanh ghi 16 bít thì sau 16 l n d ch
i dãy bít ban đ u, t
01001001 thì sau khi b quay v bên
i dãy bít ban đ u. N u thanh ghi AL =
ẽ ư ẽ ượ ặ
ị
c đ t vào l
d ch s đ
ị
ậ ạ
ẽ
ầ
l n d ch nó s nh n l
ậ ạ
ẽ
nó s nh n l
trái 2 bít nó s nh sau: AL = 001001 01, khi đó CF = 1. (cid:0) ươ ự ư ệ ư ượ ng t nh l nh RCR nh ng các bít đ c L nhệ RCL (Rotate through Carry Left): T ề quay v phía bên trái. Ví d 1:ụ (cid:0) Shr Al, 1
(cid:0) Mov Cl, 2 Shr Al, CL Shl Bl, CL Rcl AL, CL (cid:0) Rcr Dl, 1 ả ứ ở ế ệ ố thanh ghi Al ế
ị ủ ổ Ví d 2:ụ Các l nh sau đây đ m s bít b ng 1 trong thanh ghi BX, k t qu ch a
ằ
mà không làm thay đ i giá tr c a nó: Mov Al, 0 Mov Cx, 16 DemBit1: Rol Bx, 1 Jnc TiepTuc Inc Al TiepTuc: Loop DemBit1 ; ế ố ươ ứ ữ ng ng) gi a hai thanh ghi Ax và Bx. ả ứ ế ế Ví d 3:ụ Các l nh sau đây đ m s bít gi ng nhau (t
ệ
K t qu ch a trong bi n Dem ( ố
Dem DB 0): Mov Dem, 0 Xor Ax, Bx Mov Cx, 16 KTra: Shl Ax, 1 Jnc Bit_0 Jmp TiepTuc Bit_0: Inc Dem TiepTuc: Loop KTra ; ủ ệ ộ ướ ạ ị i d ng sô nh phân: Ví d 4:ụ Các l nh sau đây in n i dung c a thanh ghi BX ra màn hình d ủ ặ Mov Cx, 16 ; l p in đ 16 bít ự ớ Mov Ah, 02 ; in ra kí t v i hàm 02/21h In_NhiPhan: ể ầ ơ ờ ị
Shl Bx, 1 ; d ch trái đ bít c n in r i vào c CF ệ ả ờ Jc In_1 ; l nh JC nh y khi c CF = 1 ứ ầ ị ự Mov Dl, ‘0’ ; CF = 0 t c là bít c n in có tr = 0, nên in ra kí t ‘0’ Int 21h Jmp In_Tiep In_1: Mov Dl, ‘1’ Int 21h In_Tiep: Loop In_NhiPhan ; ộ ố ệ ậ ị ừ ư ữ ư
bàn phím đ a vào l u tr trong thanh ghi Ví d 5:ụ Các l nh sau đây nh p m t s nh phân t
BX: Mov Bx, 0 Mov Cx, 0 Mov Ax, 0 Mov Ah, 1 Nhap: Int 21h ế ế ậ Cmp Al, 0Dh ; n u nh p Enter thì k t thúc Je KetThuc ; Cmp Al, ‘1’ Je Them_Bit Cmp Al, ‘0’ Je Them_Bit ; Mov Ah,09 ế ượ ư Mov Dx, Seg TB ; Bi n TB đ c khai báo nh sau: Mov DS, Dx ; TB DB ‘Ban phai nhap 0/1 hoac Enter$’ Mov Dx, Offset TB Int 21h Jmp Nhap Them_Bit: ẻ ử ụ Sub Al, 30h ; có th s d ng l nh ệ And Al, 0Fh Shl Bx, 1 Or Bx, Al Inc Cx Cmp Cx, 17 Jne Nhap KetThuc: Mov 4Ch Int 21h ; ả ử ạ ị ứ ộ ớ ỉ ữ ệ s t i đ a ch 0B000:0010 trong b nh có ch a m t byte d li u, nó cho bi t ộ ố ộ
ế ệ ạ t máy tính hi n t ế
i có (byte 3 ắ Ví d 6:ụ Gi
ệ ố
ế ấ
m t s thông tin liên quan đ n c u hình h th ng. Byte 3 cho bi
ổ
= 1) hay không có (byte 3 = 0) c ng c m USB. ệ ạ ệ ệ ạ ự ệ ổ ế ắ ổ ế
Các l nh sau đây cho bi
t máy tính hi n t
i (máy th c hi n đo n l nh) có hay không có c ng
ả ượ
ắ
c thông báo thông qua thanh ghi Cx: Cx = 0: không có c ng c m USB;
c m USB. K t qu đ
ắ
ổ
Cx = 0FFFFh: có c ng c m USB. Mov Ax, 0B000h Mov DS, Ax Mov DI, 0010h ; Mov Ax, 0 Mov Al, byte PTR DS:[DI] ; Mov Cl, 4 Shr Al, Cl Jc CoUSB ; co cong USB Mov Cx, 0 ; khong co cong USB Jmp KetThuc CoUSB: Mov Cx, 0FFFFh KetThuc: ... ; ự ế ế ả ể ườ ượ ả ờ ờ , k t qu ki m tra này th ng đ c tr l i thông qua ngay chính c CF. CF = 0: ổ Trong th c t
ổ
không có c ng USB, CF = 1: có c ng USB. ị ủ ệ ị ệ
ộ ố ủ ể ử ụ
ứ ố ể ự
ộ ố ấ ộ Chú ý 1: Có th s d ng l nh d ch bít ShR/ShL đ th c hi n phép chia/phép nhân giá tr c a
ớ
m t thanh ghi (ch a s nguyên không d u) v i m t s là b i s c a 2. ẽ ị ứ ệ ớ Ví d :ụ Hai l nh sau đây s d ch AL sang trái 3 bít, t c là nhân AL v i 8: Mov Cl, 3 Shl Al, Cl ; Al ß AL * 8, 8 = 23. ẽ ị ứ ệ ả ớ Ví d :ụ Hai l nh sau đây s d ch AL sang ph i 3 bít, t c là chia AL v i 8: Mov Cl, 3 Shr Al, Cl ; Al ß AL * 8, 8 = 23. ợ ấ ể ố ọ ể ử ụ ệ ng t ể ự
́ ị
ự
hoàn toàn ShL, có th s d ng đ th c hi n
ư ớ ố ̣ ng t ệ
ươ
ị
ủ
ShR nh ng bít cu i cùng c a [Toan hang đich] không b
ể ự ố
ể ử ụ ́
ệ ẫ ằ ớ ị ươ
nguyên giá tr cũ, có th s d ng đ th c hi n chia 2 v i các có ̃
ư
Chú ý 2: H p ng còn cung c p các l nh d ch chuy n s h c SAL (Shift Arithmetic Left) và
SAR (Shift Arithmetic Right) . SAL t
ự
nhân 2 v i các s âm. SAR t
ữ
thay b ng bít 0 mà v n gi
d u.ấ ế ố ị ử
ự ế ợ ớ ủ
ộ ệ ơ ị ầ
t s bít c n d ch,
ng h p l n h n m t, tr c ti p trong l nh d ch, quay mà không c n thông qua thanh ệ
Các l nh dich bít, quay bít c a các vi x lý Intel 80286/80386/.... cho phép vi
ầ
ườ
trong tr
ghi Cl [1 – 540]. ệ ỗ
ử
Các l nh x lý chu i
b:
c:
có th m t ho c nhi u giá tr ,
tr
ự ặ
ộ ố
ể
ộ
ộ ấ
ộ
ho c m t xâu kí t
nó có th là m t s , m t kí t
, và cũng có th là m t d u h i ch m (“?”).
ộ
ự
ộ
ộ ố
ể
ố
hay m t xâu kí t
(cid:0) DaySo DD 1020, 1345, 2389, 5763
ầ
các ph n sau s đ i
ệ
ệ
ủ ụ
(cid:0) Không th c ng tr c ti p hai thanh ghi đo n. Trong tr
thanh ghi đa năng làm trung gian.
ộ
ự
ệ ạ
ị ủ ờ
thêm giá tr c a c nh (CF) hi n t
Carry) [2 171]. T
(cid:0) Đ th c hi n phép c ng trên các s /giá tr BCD (Binary Coded Decimal) ta ph i s
ả ử
ể ự
ệ
ụ
d ng các l nh c ng
ể ề
Addition) đ đi u ch nh (adjust) k t qu cu i cùng [2 172]. T
các s BCD ph i s d ng l nh
(cid:0) Mul [Toan hang nguôn
̀
́
]
̀
́
IMul [Toan hang nguôn
]
(cid:0) Div [Toan hang nguôn
̀
́
]
̀
́
IDiv [Toan hang nguôn
]
(cid:0) Not [Toan hang đich
́
́
]
(cid:0) And [Toan hang đich
́
́
̀
], [Toan hang nguôn
]
(cid:0) Or [Toan hang đich
́
̀
́
], [Toan hang nguôn
]
(cid:0) Xor [Toan hang đich
́
́
̀
], [Toan hang nguôn
]
̀
́
́
], [Toan hang nguôn
Test [Toan hang đich
]
(cid:0) OUT <Đ a ch c ng
Tài liệu liên quan
Tài liêu mới