ướ ầ ớ ậ ử

ự ọ ậ 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 IBM­PC: 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:        ế     DB         b:        ế     DW        c:         ế     DD      

(cid:0) ằ ố d:        ằ EQU    

ườ ượ ử ụ ườ ế ể ợ 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.  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  có th  là m t s , m t kí t .

Ví d  1:ụ

(cid:0)

Spt                 DB      0 (cid:0) KiTu               DB      ‘a’ (cid:0)

(cid:0) TieuDe           DB      ‘Tin hoc’ SoNguyen      DW     ?

(cid:0) DaySo           DD      1020, 1345, 2389, 5763

ụ ế ể 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            .Code                         ORG   100h             :                                 JMP    

ặ ạ

ủ ụ ữ ệ       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.  là nhãn c a l nh Jmp.

ươ ấ ạ ộ 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    ầ  các ph n sau s  đ i

ệ ươ ấ

ạ ng trình d ng EXE: ế ộ ộ ớ

    ệ         ấ Trong c u trúc ch ủ ệ ướ ẫ h ỉ ợ ấ C u trúc này cho th y rõ, m t ch ữ ệ   ữ ệ ạ ạ đo n Code (đo n mã l nh), trong này bao g m c  ph n khai báo d  li u. Các khai báo d  li u ệ ử trong ch ng trình, nh ng v i vi c s   ị ụ d ng đ nh nghĩa đo n đ n gi n các khai báo d  li u ph i đ t  Ch  d n ủ đây c a tài li u này. C u trúc ch .Model            .Stack           100h .Data

ữ ệ ặ ạ

ủ ụ 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] ệ [Các toán h ng]ạ [;L i gi

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)

ệ ệ ệ ự ­     ệ ộ ử ủ c a vi x  lý trên máy tính th c hi n l nh này.

ệ ữ ệ ữ ỗ ợ 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 ả ử ụ ố

(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

ả ố ệ  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  ả ự ộ  đ ng gi m 1 đ n  c trong thanh ghi CX. Sau m i l n l p CX t

ặ ể ươ ớ ố ầ ặ ặ ẽ ừ 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                                                                            ặ ộ Trong đó:  là m t nhãn l nh và nó ph i đ ng tr byte. Tác d ng:ụ ặ ệ  Khi g p l nh này ch ượ ặ ướ ớ ủ c đ t tr đ  n l n, v i n đ ệ ị v  (Cx = Cx ­ 1) và l nh l p s  d ng khi Cx = 0. ượ ử ụ ệ ng đ L nh Loop th ướ ượ ị c trong thanh ghi Cx (t đ nh, đ ậ trình b c cao). Ví d  1:ụ  Xem đo n l nh sau đây:                     Mov        Ax, 6                     Mov        Cx, 4                           ; l p l          Lap:    Add         Ax, 10                        ; c ng thêm 10 vào Ax                     Loop       Lap                             ; l p l K t thúc đo n l nh trên: Ax = 46 (c  th : = 26 + 10; L n 4: Ax = 36 + 10 = 46). Ví d  2:ụ  Xem đo n l nh sau đây: ạ ệ                     Mov        Ax, 6                                   Mov        Bx, 3                                   Mov        Cx, 4               ; l p l             Lap_TT:                     Add         Ax, Bx              ; c ng thêm giá tr  thanh ghi Bx vào thanh ghi Ax                     Inc           Bx                    ; tăng Bx lên 1 đ n vơ                     Loop       Lap_TT              ; l p l                     ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­          ; sau l nh l p này Ax = 24, Bx = 7                     Mov        Dx, Ax                ; Dx ß Ax                     Mov        Cx, Bx                ; Cx = 7, sau Loop Cx = 0, đ ầ K t thúc đo n l nh trên: Ax = 24 (L n 1: Ax = 6 + 3;L n 2: Ax = 9 + 4; 5; L n 4: Ax = 18 + 6) và Dx = Ax = 24. ặ ệ  Loop     Lap_TT ch Khi g p l nh Ax, Bx (Lap_TT là nhãn c a l nh này), t ệ    Bx. Dó đó, có th  nói l nh Loop này th c hi n vòng l p cho c  hai l nh Add và Inc. Đó  ườ cũng chính là lý do mà ng ệ trên (nhãn l nh và l nh không cùng trên m t dòng). Ví d  3:ụ  Xem đo n l nh sau đây:

ầ ặ ạ 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) ̣

(cid:0) Mul     [Toan hang nguôn ̀ ́ ] ̀ ́ IMul   [Toan hang nguôn ] (cid:0) Div      [Toan hang nguôn ̀ ́ ] ̀ ́ IDiv    [Toan hang nguôn ]

́ ́ ̀ ́ ̀ ́ ́ ́ ơ ơ ̣ ̉ ̣ ̣

̀ ̀ ́ ́ ́ ̀ ́ ̣ ̣ ̣ ̣ ̣

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*(N­1)*(N­2)*...*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 – 187­200].

́ ́ ́ ́ ̃ ̀ ử ̣ ̉ ̣ ̣ ́ ́ ́ ̀ ́ ́ ̣ ̣ ̉ ̣ ́ 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) ́ ́ ́ ́ ̣ ̣

(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 ]

́ ́ ́ ́ ̀ ̀ ự ̣ ̣ ̉

́ ̀ ́ ́ ́ ̀ ́ ơ ̣ ̉ ̣ ̉ 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

(cid:0) OUT       <Đ a ch  c ng

ệ ự ế ướ ạ ụ ặ ượ ậ ộ ằ ể ượ ị ị ố 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           Trong đo:́ Trong đó  là s  hi u ng t c a m t ng t m m c n g i. T c là, n có th  là m t  ộ ộ ố ệ ị ừ trong các giá tr  t MSDOS cung c p.ấ ́ Tac dung: trong ch trình con ph c v  ng t t Ví d  1:ụ

ủ ủ

ắ ắ ươ ọ ọ ộ ề ắ ụ ụ ắ ể ự ể ệ ộ ề ứ ứ ỗ ệ ố ượ ượ ộ 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ày­tháng­năm hi n t i (theo đ ng h  h  th ng trên máy tính). C  th :  ệ ạ ứ Thanh ghi CX (1980­2099) ch a năm hi n t i, thanh ghi DH (1­12) ch a tháng hi n t ờ ệ ạ ghi DL (1­31) 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 =  Ra:     Không có ́ Vi du 1:  Gi ế bi nTieuDe ế ­     Trong tr                      TieuDe     DB   ‘Truong DH Khoa hoc Hue$’ ệ ạ ệ ­     Và đo n l nh g m các l nh sau:             Mov          Ah, 09             Mov          Ax, Seg TieuDe             Mov          DS, Ax             Mov          Dx, Offset TieuDe          ; có th  dùng l nh             Int             21h ̃ , v i các ch Trong th  t ế ầ ủ ch  Segment c a bi n c n in vào DS. B i vì: ươ ố ớ ­     Đ i v i các ch ươ ố ớ ­     Đ i v i các ch Ví d  2:ụ  Gi             TieuDe     DB            ‘Khoa CNTT Truong DHKH Hue$’ Các l nh sau ch  in các kí t             Mov          Ax, Segment TieuDe             Mov          DS, Ax             Mov          Dx, TieuDe             Add           Dx, 11             Mov          Ah, 09             Int             21h           ự Các l nh sau ch  in các kí t             Mov          Ax, Segment TieuDe             Mov          DS, Ax             Mov          Dx, TieuDe             Mov          DI, Dx             Add           DI, 10             Mov          Byte PTR DS:[DI], ‘$’             Mov          Ah, 09             Int             21h           ỉ Ví d  3:ụ  Gi ự t             Mov          Ax, 0A00h

̀ ́ ẽ ứ ư ộ ụ ể ̣ 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ày­tháng­năm s n xu t ROM­BIOS  ờ trong ấ ế ố t s  kí t ả i. Đ ng th i hàm/ng t này cũng cho bi

ệ ngày­tháng­năm nói trên ra màn hình:

ầ c đ a vào thanh ghi ah

ắ ọ ọ

ự ủ ư ố c a xâu ngày­tháng­nă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ày­tháng­nă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                                    Jmp     KetThuc

ự ọ ậ ử ụ ươ TB_Loi:                              KetThuc:             ...             ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ T  h c l p trình Assembly ­ Bài 5: S  d ng Interrupt trong ch ng trình assembly (2)

ứ 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ày­tháng­năm s n xu t ROM­BIOS  ờ ỉ ủ ệ ạ ặ ử ụ ự ắ ả i. Đ ng th i hàm/ng t này cũng cho bi ấ ế ố t s  kí t trong

ệ ngày­tháng­năm nói trên ra màn hình:

ầ c đ a vào thanh ghi ah

ọ ọ ắ

ư ố ự ủ ngày­tháng­nă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ày­tháng­nă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                          Jmp     KetThuc        TB_Loi:                      KetThuc:             ...             ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­     Ví d  4:ụ  Sau đây là ch ng trình d ng COM: In ra t ASCII: .Model       Small .Code       ORG       100h           Start:                     Jmp         Main     TB       DB    'Noi dung Bang ma ASCII:',0Ah,0Dh,'$'          Main           Proc                     Mov        Ah, 09h                     Lea          Dx, TB                     Int           21h                     ;­­­­­­­­­­­­­­­­­­­­­­­­­­                     Mov        Cx, 256                     Mov        Ah, 02                     Mov        Dl, 0

ạ ộ ự ấ ỳ 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ó th  là nhãn c a m t l nh, tên c a m t th  t c ho c có th   ể ủ ộ ộ c đ nh nghĩa) nào đó.  cũng có th  là m t ộ ị ủ ỉ ủ ườ ế ạ ng là đ a ch  c a m t ô nh  trong đo n Code. (cid:0) ớ ề ặ ệ ộ ể ự ế ả ̣ Khi g p l nh này ch Tac dung: ể ượ ị ớ là m t thanh ghi, m t ô nh  (đã đ ị bi n nào đó, giá tr  c a nó th ể ng trình chuy n đi u khi n (nh y đ n) đ n th c  ấ ỳ ề ́ ệ ệ ụ ệ ộ ế ươ hi n l nh sau  mà không ph  thu c vào b t k  đi u ki n nà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  trong b  nh .

ạ ệ ỉ ổ ớ ạ ệ ệ ả ượ ạ 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à  ph i n m trong cùng Segment nh , ng ể ằ ở  các Segment nh  khác nhau. và  có th  n m

́ ̣ 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 ả ủ ươ ệ ệ ự ề ế ẽ ể ị ở ế    , n u Trong đo:́ : T ị ́ ộ ệ Tac dung: ế ệ ự ỏ ệ ệ ẽ ả ỏ ả đi u ki n nh y c a nó, n u th a mãn thì s  nh y đ n th c hi n l nh  không thì b  qua không th c hi n l nh nh y này.

ả ệ ề ờ ệ ự ề ả ủ ả ươ ổ ươ ệ ị ệ ả ả ổ ơ ị ướ ệ ử ụ ệ ổ ệ ể ị ủ Đ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  hay không) ph  thu c vào giá tr  c a [Đích] và [Ngu n] trong  ứ ệ l nh Cmp đ ng ngay tr c 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 ...  [2 ­ 150]

ươ ườ ặ ệ ử ụ ể ạ ệ ị 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  ROM­BIOS 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.  là s  bít c n d ch, n u  ế  = 1 thì ch  đ nh tr c ti p trong câu l nh, n u  l n h n 1 ph i ch  đ nh thông qua  thanh ghi CL.

́ ̣ 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