ƯỜ

Ạ Ọ

NG Đ I H C K  THU T CÔNG NGHI P

TR KHOA ĐI N TỆ Ử

B  môn: K  thu t máy tính

ASSEMBLY

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

M C L C

Ệ Ọ Ớ Ả

NG 1 C  B N V  H P NG Ơ Ả ợ

1.1.1.Tr   1.1.2.Tr     1.1.3.Tr   1.1.4.Tr ươ ng trình h p ng

ủ ự

ấ ợ

ữ Ạ Ử NG 2 TR NG THÁI C A VI X  LÝ VÀ CÁC THANH GHI C

ờ ư ế ế ả ng đ n các c  nh  th  nào

Ề Ể

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

5     I THI U MÔN H C ....................................................................................................................   GI                                                                                                                6     ........................................................................................................   BÀI GI NG MÔN: ASSEMBLY   Ọ Ụ I.M C ĐÍCH MÔN H C  6     ....................................................................................................................                                                                                                                             Ộ   6     .........................................................................................................................                                                                                                                                II.N I DUNG CHÍNH Ế Ộ                                                                                                                         III.N I DUNG CHI TI T  7     ....................................................................................................................     Ề Ợ Ữ ƯƠ                                                                                                   CH  7     ..............................................................................................     ữ ệ  7     ...................................................................................................................                                                                                                                            1.1.Cú pháp l nh h p ng ườ                                                                                                               7     .........................................................................................................   ng tên (Name field) ườ ử                                                                                                    8     ..............................................................................................   ng toán t  (Operator field) ườ ạ  8     ng các toán h ng (Operand(s) code) ...............................................................................                                                                                      ườ                                                                                              ng chú thích (Comment field)  8     .........................................................................................   ữ ợ ể ố ệ   1.2.Các ki u s  li u trong ch                                                                                  9     ..............................................................................     1.2.1.Các số                                                                                                                                          9     ......................................................................................................................................       1.2.2.Các ký tự  9     .................................................................................................................................                                                                                                                                          ế                                                                                                                    1.2.3.Các bi n (Variables)  9     ...............................................................................................................     ế                                                                                                                             1.2.3.1.Bi n byte  9     ..........................................................................................................................       ế ừ  10         (word) ...............................................................................................................                                                                                                                      1.2.3.2.Bi n t ả ế                                                                                                              1.2.3.3.Bi n m ng (array)  10      .........................................................................................................     ộ ừ ấ                                                                                       10      .................................................................................     1.2.3.4.Byte th p và byte cao c a m t t ỗ  10      ........................................................................................                                                                                                (Character string) 1.2.4.Chu i các ký t   ằ  11      1.2.5.Các h ng (Constnts) ..............................................................................................................                                                                                                                       ơ ả ệ                                                                                                                                1.3.Các l nh c  b n  11      ...........................................................................................................................     ệ                                                                                                       1.3.1.L nh MOV và l nh XCHG  11      ..................................................................................................     ệ  12      1.3.2.L nh ADD, SUB, INC, DEC ................................................................................................                                                                                                         ệ                                                                                                               13      .........................................................................................................     1.3.3.L nh NEG (NEGative) ữ ấ ể                                                                             13      1.4.Chuy n ngôn ng  c p cao thành ngôn ng  ASM .......................................................................     ệ ề                                                                                                                         1.4.1.M nh đ  A=B:  13      ......................................................................................................................       ề ệ  13      1.4.2.M nh đ  A=5­A: ..................................................................................................................                                                                                                                           ề ệ                                                                                                                   1.4.3.M nh đ  A=B­2*A:  14      ..............................................................................................................     ữ ươ ộ                                                                                                ng trình h p ng 1.5.C u trúc m t ch  14      ...........................................................................................     ớ ộ ể  14      ...................................................................................................................                                                                                                                            1.5.1.Các ki u b  nh ạ ố ệ                                                                                                                              1.5.2.Đo n s  li u  14      .........................................................................................................................     ạ ế                                                                                                                           1.5.3.Đo n ngăn x p  14      ......................................................................................................................     ạ 1.5.4.Đo n mã  15      ................................................................................................................................                                                                                                                                         ệ  15      ...........................................................................................................................                                                                                                                                    1.6.Các l nh vào, ra ầ ươ                                                                                                                      1.7.Ch ng trình đ u tiên .................................................................................................................  16          ữ ươ ộ ạ ạ                                                                                         1.8.T o và ch y m t ch  17      ....................................................................................     ng trình h p ng ự ỗ ấ ộ  18      ...........................................................................................................                                                                                                                    1.8.1.Xu t m t chu i ký t ữ ườ ổ ươ                                                                             ng trình đ i ch  th  19      ng sang ch  hoa ........................................................................   1.8.2.Ch   Ủ Ờ ƯƠ                                        CH  21      ...................................     ờ 2.1.Thanh ghi c  (Flag register)  21      .........................................................................................................                                                                                                                   22      ............................................................................................................................                                                                                                                                     2.2.Tràn (Overflow) ệ ưở                                                                                 2.3.Các l nh  nh h  23      ............................................................................     ươ                                                                                                                         2.4.Ch  25      ng trình Debug ....................................................................................................................     Ệ ƯƠ  29                                                                                                  ..........................................................................................       NG 3 CÁC L NH ĐI U KHI N CH ả ụ ề ệ   3.1.Ví d  v  l nh nh y                                                                                                                         29      .....................................................................................................................     ệ ề ả                                                                                                                            3.2.Nh y có đi u ki n  29      .......................................................................................................................     ệ  32      3.3.L nh JMP .....................................................................................................................................

2

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ấ ấ ẽ

ặ ấ

Ị Ệ

ệ ệ ệ ị ố ậ

Ủ Ụ

ơ

ƯƠ ệ Ứ ệ ở ộ ủ ụ ấ ố ậ

ƯƠ ả

ế

ộ ế ộ ị ế ộ ị ế ộ ị ử ử ả  gi ế ạ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Ứ ệ ữ ấ ủ                                                                                                        32      3.4.C u trúc c a ngôn ng  c p cao ..................................................................................................      33      .................................................................................................................                                                                                                                          3.4.1.C u trúc r  nhánh ấ                                                                                                                 33      ...........................................................................................................   3.4.1.1.C u trúc If ­ Then   ấ                                                                                                      33      ................................................................................................   3.4.1.2.C u trúc If ­ Then ­ Else   ấ  34      ................................................................................................                                                                                                         3.4.1.3.C u trúc If ­ Then ­ Else   ..........................................................................................................................                                                                                                                             3.4.2.C u trúc l p  36                                                                                                                                       3.4.2.1.Vòng For  36      .........................................................................................................................                                                                                                                        3.4.2.2.Vòng WHILE  37      .................................................................................................................        37      ...............................................................................................................                                                                                                                        3.4.2.3.Vòng REPEAT ấ ớ ấ ậ                                                                                                         3.5.L p trình v i c u trúc c p cao  38      ....................................................................................................     ƯƠ                                                                           CH NG 4 CÁC L NH LOGIC, D CH VÀ QUAY  43      ......................................................................     ệ  43      4.1.Các l nh logic ..............................................................................................................................                                                                                                                                       ệ                                                                                                                 4.1.1.L nh And, Or và Xor  43      ............................................................................................................     ệ   .............................................................................................................................                                                                                                                                4.1.2.L nh NOT  45          ệ                                                                                                                                45      ............................................................................................................................       4.1.3.L nh TEST  46      4.2.L nh SHIFT .................................................................................................................................                                                                                                                                          ị                                                                                                          4.2.1.L nh d ch trái (Left Shift)  46      .....................................................................................................     ả ị                                                                                                      47      ................................................................................................     4.2.2.L nh d ch ph i (Right Shift)  48                                                                                                                              ......................................................................................................................       4.3.L nh quay (Rotate) ấ ố                                                                                                  4.4.Nh p/xu t s  nh  phân và s  Hexa  49      .............................................................................................     ị ậ ố   4.4.1.Nh p s  nh  phân                                                                                                                      49      ..................................................................................................................     ị ấ ố 4.4.2.Xu t s  nh  phân  50      ...................................................................................................................                                                                                                                            ậ ố  50                                                                                                                               .......................................................................................................................       4.4.3.Nh p s  Hexa Ế ƯƠ                                                                                             CH  52      ........................................................................................     NG 5 NGĂN X P VÀ TH  T C 5.1.Ngăn x pế                                                                                                                                            52      ......................................................................................................................................     ệ  52      5.1.1.L nh PUSH và PUSHF .........................................................................................................                                                                                                                  ệ                                                                                                                    5.1.2.L nh POP và POPF  52      ...............................................................................................................     ụ Ứ   5.2. ng d ng c a stack                                                                                                                         53      .....................................................................................................................     ủ ụ                                                                                                                        5.3.Th  t c (procedure)  54      .....................................................................................................................        55      ...............................................................................................................................     5.4.Call và Return                                                                                                                                    ụ ề ủ ụ                                                                                                                               5.5.Ví d  v  th  t c  56      ..........................................................................................................................                                                                                                      CH  58      NG 6 L NH NHÂN VÀ CHIA .............................................................................................      58      6.1.L nh MUL và IMUL ...................................................................................................................                                                                                                                            ả ủ ệ ụ                                                                                 6.2. ng d ng đ n gi n c a l nh MUL và IMUL  59      ............................................................................                                                                                                                                6.3.L nh DIV và IDIV  60      .......................................................................................................................     ấ ủ ố ị                                                                                                           6.4.M  r ng d u c a s  b  chia  61      ........................................................................................................       ậ  61      6.5.Th  t c nh p/xu t s  th p phân ................................................................................................                                                                                                         Ỉ Ế Ộ Ị Ả                                                                               CH  69      ..........................................................................     NG 7 M NG VÀ CÁC CH  Đ  Đ A CH ề                                                                                                                               7.1.M ng m t chi u ..........................................................................................................................  69          ỉ  70      7.2.Các ch  đ  đ a ch  (Addressing modes) ......................................................................................                                                                                               ỉ                                                                                     7.2.1.Ch  đ  đ a ch  gián ti p qua thanh ghi  70      ................................................................................     ỉ ơ ở ỉ ố                                                                                                  7.2.2.Ch  đ  đ a ch  ch  s  và c  s    72      .............................................................................................    74                                                                                            ....................................................................................        LABEL  PTR và toán t 7.2.3.Toán t   ...........................................................................................                                                                                              7.2.4.Chi m đo n (segment override)  76          ế ấ ạ                                                                                               76      .........................................................................................     7.2.5.Truy xu t đo n ngăn x p (stack) ế ố ệ ắ                                                                                                               7.3.S p x p s  li u trên m ng  76      ..........................................................................................................     ề ả  78      7.4.M ng hai chi u ............................................................................................................................                                                                                                                                     ế ộ ị ỉ ố ơ ở ỉ   .........................................................................................................                                                                                                            7.5.Ch  đ  đ a ch  ch  s  c  s  80          ể ụ   7.6. ng d ng đ  tính trung bình                                                                                                           81      .......................................................................................................      82      ..................................................................................................................................                                                                                                                                           7.7.L nh XLAT

3

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Ụ Ụ Ụ Ụ Ụ Ụ Ụ Ủ NG TRÌNH VÍ D

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

86      ...........................................................................                                                                              PH  L C 1: INTEL 80X86 INSTRUCTION SET       Ị    129    .......................................................................                                                                                PH  L C 2: CÁC D CH V  C A BIOS VÀ DOS Ụ ƯƠ  130                                                                                     PH  L C 3: CÁC CH     ...............................................................................      130                                                                                                                                      Communication     ................................................................................................................................        130                                                                                                                                           .....................................................................................................................................       Compression  130                                                                                                                                                        CPU      ..................................................................................................................................................    130                                                                                                                                           Date & Time     .....................................................................................................................................     ............................................................................................................................                                                                                                                               Disk & File access    130             130    ..........................................................................................................................                                                                                                                                   Keyboard & Mouse  130                                                                                                                                          Math routines     ....................................................................................................................................      130                                                                                                                                                  Memory     ............................................................................................................................................        130    Protected mode .................................................................................................................................                                                                                                                                             130                                                                                                      ..............................................................................................     TSR (Terminal and Stay Presidented)

4

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

GI

I THI U MÔN H C

ữ ậ 1. Tên môn h c:ọ  Ngôn ng  l p trình Assembly.

ố ờ 45 LT + 15 BT. 2. Phân b  th i gian:

3. Môn tiên quy t:ế

(cid:0) ọ ạ ươ ữ ậ Ngôn ng  l p trình Pascal, C (Tin h c đ i c ng).

(cid:0) ế ấ ặ C u trúc máy tính (ho c Ki n trúc máy tính).

(cid:0) Vi x  lý.ử

ố ỹ ế ị ườ ạ t b  ngo i vi, Đo l ể   ề ng và đi u khi n ậ 4. Môn song hành: K  thu t ghép n i máy tính và thi

ằ b ng máy tính.

ả ọ 5. Mô t môn h c:

ọ ứ ơ ả ầ ứ ế ấ

ữ ể ả ề ế

ầ   Môn h c cung c p cho sinh viên nh ng ki n th c c  b n v  ki n trúc ph n c ng và ph n ủ ộ   i quy t các bài ứ ử ấ ủ ệ ố ữ ữ ậ ề ệ ố ể ề ế ợ m m c a b  vi x  lý x86 Fmaily. Ngôn ng  l p trình Assembly (h p ng ) đ  gi ữ ệ toán m c th p c a h  th ng: vào/ra d  li u, đi u khi n h  th ng, ...

6. Giáo trình chính:

ữ ậ ợ ươ L p trình h p ng  cho IBM PC và máy tính t ng thích.

ệ ả 7. Tài li u tham kh o:

ữ ậ ợ [1] Ytha Yu & Charles Marut, L p trình h p ng  (Assembly) và máy vi tính IBM­PC , NXB

ụ Giáo D c, 1996.

ễ ấ ậ ớ ợ ố ề L p trình v i H p Ng [2] PTS. Nguy n Quang T n, Vũ Thanh Hi n, ữ,  NXB Th ng Kê,

1997.

ế ụ ỹ ậ K  thu t vi x  lý [3] Văn Th  Minh, ử , NXB Giáo D c, 1997.

ầ ề ể ố ế ị ạ ố Đi u khi n và ghép n i các thi t b  ngo i vi [4] Tr n Bá Thái, , NXB th ng kê, 1987.

ầ ấ ụ C u trúc máy vi tính [5] Tr n Quang Vinh, , NXB Giáo D c, 1998.

[6] Computer   Organization   and   Assembly   Language   Programming   For   IBM   PC   and  Compatibles   Michael   Thorne   ­   The   Benjamin­Cummings   Publishing   Company,   Inc.  1991.

[7] Microprocessors   and   microcomputer­based   system   design   Mohamed   Rafiquzzaman   ­

CRC Press, 1995.

[8] Interfacing to the IBM Personal Computer Lewis C. Eggebrecht ­ SAMS, 1991.

[9] Microprocessors   and   interfacing:   Programming   and   Hardware   Douglas   V.   Hall   ­

Macmillan/McGraw­Hill, 1992.

ề ậ ỹ ể ự ộ đ ng, Đi n t ệ ử ễ    vi n 8. Đ i t

ọ   Sinh viên ngành K  thu t máy tính, Đi u khi n t ố ượ ng h c: ậ ỹ ệ ử thông, K  thu t đi n t .

ụ ễ ế Nguy n Ti n Duy. 9. Giáo viên ph  trách:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ệ ử ậ ộ ỹ B  môn K  thu t máy tính, Khoa Đi n t . ơ ị ụ 10. Đ n v  ph  trách:

5

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

BÀI GI NG MÔN: ASSEMBLY

I. MỤC ĐÍCH MÔN HỌC

II. N I DUNG CHÍNH

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

6

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

III. N I DUNG CHI TI T  Ơ    B   Ả   N V  CH

Ộ  ƯƠ     NG 1 C

Ề    H

Ợ   P NG

ẽ ớ ươ ể ạ ữ ệ ạ ắ ị ộ   i thi u nh ng nguyên t c chung đ  t o ra, d ch và ch y m t

Trong ch ợ ươ ng này s  gi ữ ng trình h p ng  trên máy tính. ch

ấ ủ ệ ợ ữ ượ C u trúc ng  pháp c a l nh h p ng  trong giáo trình này đ c trình bày theo Macro

ữ ự Assembler (MASM) d a trên CPU 8086/88.

1.1. Cú pháp lệnh hợp ngữ

ệ ề ạ ượ ế c vi t liên

ươ ng trình h p ng  bao g m m t lo t các m nh đ  (statements) đ ệ ợ ề ượ ế ộ M t ch ỗ ti p nhau, m i m nh đ  đ ồ ữ ộ ộ ế t trên m t dòng. c vi

ề ể ệ ộ M t m nh đ  có th  là:

ẽ ượ ộ ị ỉ ị c biên d ch (Assembler = ASM) thành mã máy. o M t ch  th  (instruction): nó s  đ

ỉ ẫ ủ ể o M t ch  d n c a Assembler (Assembler directive): ASM không chuy n thành mã

ộ máy.

ề ủ ệ ồ ườ Các m nh đ  c a ASM g m 4 tr ng:

Name Operator Operand(s) Comment

ườ ấ ặ ộ ự Các tr ộ ấ ng cách nhau ít nh t m t d u cách ho c m t ký t TAB.

Ví d :ụ

ở ạ ẽ ượ ế ế ặ ị ỉ ị Start: Mov cx, 5 ; Kh i t o bi n đ m vòng l p, (ch  th  này s  đ c d ch ra mã

máy).

ủ ụ ỉ ẫ ạ ộ ượ Main Proc ; T o m t th  t c có tên là Main (ch  d n này không đ ị c d ch ra

mã máy).

ườ

1.1.1.

Tr

ng tên (Name field)

ượ ủ ụ ế ệ ẽ ể c dùng cho nhãn l nh, tên th  t c và tên bi n. ASM s  chuy n tên

Tr ị ườ ng này đ ớ ỉ ộ thành đ a ch  b  nh .

(cid:0) ự ộ ố ữ ố ự ặ ệ ồ Tên bao g m các ký t : A ­ z, ch  s  và m t s  ký t đ c bi t: ?, @, _, $.

(cid:0) ượ ứ ấ Tên không đ c ch a d u cách.

(cid:0) ộ ừ ế ự Đ  dài t 1 đ n 31 ký t .

(cid:0) ế ự ả ự ầ N u trong tên có ký t ‘.’ thì nó ph i là ký t đ u tiên.

(cid:0) ượ ắ ầ ằ ộ Tên không đ ữ ố c b t đ u b ng m t ch  s .

(cid:0) ệ ự ASM không phân bi ữ t gi a ký t hoa và ký t ự ườ  th ng.

Ví d :ụ

ợ ệ ứ ấ COUNTER1 TWO WORDS ; Tên không h p l (ch a d u cách)

@CHARACTER2ABC ; Tên h p lợ ệ

ợ ệ ứ ấ SUM_OF_DIGITS A45.28 ; Tên không h p l (ch a d u cách)

DONE?YOU&ME ; Tên h p lợ ệ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ợ ệ ứ ấ .TEST ADD­REPEAT ; Tên không h p l (ch a d u cách)

7

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ườ

1.1.2.

Tr

ng toán t

(Operator field)

ườ ộ ệ ố ớ ử ệ ớ ợ Đ i v i m t l nh, tr ng toán t

ườ ủ ệ ng ký hi u mã phép toán mô t

ệ ệ ạ ứ    ch a ký hi u (symbol) d ng g i nh  (mnemonic) ệ ủ ẽ ủ c a mã phép toán (operator code = Opcode). ASM s  chuy n ký hi u c a mã phép toán thành   ự   ả ứ mã máy. Thông th  ch c năng c a phép toán (phép toán th c hi n công vi c gì).

Ví d :ụ  ADD, SUB, INC, DEC, INT, IN, OUT, ...

ỉ ẫ ố ớ ươ ứ ử ộ Đ i v i ch  d n ch ng trình d ch, tr ng toán t

ườ ể ả ướ (Pseudo ng ASM

ủ ụ ụ ạ ự ệ ế ệ ộ ộ ị ị  ch a m t opcode gi operator code = Pseudo­op). ASM không chuy n Pseudo­op thành mã máy mà h th c hi n m t công vi c gì đó, ví d  t o ra m t th  t c, đ nh nghĩa các bi n, ...

ườ

1.1.3.

Tr

ng các toán h ng (Operand(s) code)

Operand(s) = Đích, ngu nồ

ạ ỉ ỉ ị

ỳ ừ ố ệ ng các toán h ng ch  ra các s  li u tham gia trong ch  th  đó. ườ ể ạ ỉ ị ườ ộ Trong m t ch  th , tr ị Tu  t ng ch  th  khác nhau mà tr ỉ ặ ng này có th  có 2, 1 ho c không có toán h ng nào.

Ví d :ụ

ạ ộ ax, word cx

Add Inc Nop ; Hai toán h ngạ ; M t toán h ng ; Không toán h ngạ

ỉ ị ầ ạ ạ

ạ ườ ng là thanh ghi ho c ô nh  dùng đ  l u tr ườ ồ ớ ạ ứ Trong   các  ch   th   có  hai  toán  h ng,  toán  h ng  đ u  là   toán  h ng  đích  (destination ả ữ ế ặ  k t qu . Còn toán   ổ   ị ng không b  thay đ i

ệ ệ ự ể ư operand), toán h ng đích th ồ ạ ạ h ng th  hai là toán h ng ngu n (source operand), toán h ng ngu n th sau khi th c hi n l nh.

ỉ ẫ ủ ố ớ ộ ườ ạ ườ ứ ề ộ Đ i v i m t ch  d n c a ASM, tr ng toán h ng th ặ ng ch a m t ho c nhi u thông

ể ự ỉ ẫ ệ tin mà ASM dùng đ  th c hi n ch  d n.

ườ

1.1.4.

Tr

ng chú thích (Comment field)

ỳ ộ ữ ệ ọ ng chú thích là m t tu  ch n c a m nh đ  trong ngôn ng  ASM. Ng

ủ ế ườ ể ệ ầ ườ ng dùng tr

ậ ẽ ấ ề ể ữ ấ ươ ấ

Tr ườ ữ ượ ầ

ủ ể ả ữ ủ ủ ệ ấ ọ ườ ậ   ề i l p ế ề trình th   ng chú thích đ  thuy t minh v  câu l nh. Đi u này là c n thi t vì ế ngôn ng  ASM là ngôn ng  c p th p (low level) vì v y s  r t khó hi u ch ng trình n u nó   ố ớ   ộ c chú thích m t cách đ y đ  và rõ ràng. Tuy nhiên không nên có chú thích đ i v i không đ ư ươ ệ ng trình, k  c  nh ng l nh mà ý nghĩa c a nó đã r t rõ ràng nh : m i dòng l nh c a ch

Nop ; Không làm gì cả

ườ ấ ấ ả ằ Tr

ng chú thích b t đ u b ng d u ch m ph y. ASM cũng cho phép dùng toàn b ố ắ ầ ể ạ ầ ộ

ộ  ộ ủ   ả m t dòng cho chú thích đ  t o ra m t kho ng tr ng ngăn cách các ph n khác nhau c a ươ ch ụ ng trình, ví d :

ở ạ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

; ; Kh i t o các thanh ghi ; Mov Mov ax, 0 bx, 0

8

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ể ố ệ

ươ

1.2. Các ki u s  li u trong ch

ng trình h p ng

ệ ả

ị CPU ch  làm vi c v i các s  nh  phân, vì v y ASM ph i chuy n t ố ậ ữ ớ ộ ể ị

ể ấ ả ễ ố ệ ả ợ ậ ụ ậ ặ ố ỉ ươ thành s  nh  phân. Trong m t ch ng trình h p ng  cho phép bi u di n s  li u d ậ phân (Binary), th p phân (Decimal) ho c th p l c phân (Hexa) và th m chí là c  ký t ạ ố ệ   t c  các lo i s  li u ướ ạ ị  i d ng nh ự .

1.2.1.

Các số

ộ ố ị Lo iạ ả ế ặ ộ M t s  nh  phân là m t dãy các bit 0 và 1, ằ ph i k t thúc b ng B (ho c b).

ộ ố ậ

ữ ố ậ   ộ M t s  th p phân là m t dãy các ch  s  th p ế ặ ặ ằ ầ phân, k t thúc b ng D (ho c d) ho c không c n.

ữ ố ộ ế   M t s  hexa là m t dãy các ch  s  hexa, k t

ằ ặ ộ ố thúc b ng H (ho c h).

ợ ệ ợ ệ S  Hexa không h p l S  Hexa không h p l ễ ố ợ ệ và không Số ố ậ S  th p phân 10111 ố ị S  nh  phân 10111b ố ậ 64223 S  th p phân ố ậ ­2183D S  th p phân ố 1B4DH S  Hexa ố 1B4D ố FFFFH ố 0FFFFH S  Hexa ể Sau đây là các bi u di n s  h p l  trong ASM: ợ ệ h p l

1.2.2.

Các ký tự

ự ự ặ ấ ơ và m t xâu ký t ph i đ

ả ượ ự ề ặ ở ặ   ặ c đ t gi a c p d u ngo c đ n (ho c c p ngo c   c chuy n thành mã ASCII b i ASM do đó

ữ ặ ể ả ư ẽ ộ kép). Ví d : ‘A’ và “Hello”. Các ký t trong ch ặ Ký t ụ ượ  đ u đ ươ ng trình ASM s  xem ‘A’ và 41h (mã ASCII c u ‘A’) là nh  nhau.

ế

1.2.3.

Các bi n (Variables)

ư ế

Trong ASM, bi n đóng vai trò nh  trong ngôn ng  b c cao. M i bi n có m t lo i d ị ế ộ ị ữ ậ ươ ỉ ộ ượ ớ ộ ỗ ệ ả ng trình. B ng sau đây li c gán m t đ a ch  b  nh  sau khi d ch ch ạ ữ    t kê các

ạ ố ệ ể ị ệ li u và nó đ toán t ử ả  gi dùng đ  đ nh nghĩa các lo i s  li u.

ế PSEUDO­OP STANDS FOR 1.2.3.1. Bi n byte

ủ ế

ư ỉ ẫ Ch  d n c a ASM ể ị đ   đ nh   nghĩa   bi n   byte ạ có d ng nh  sau:

Define Byte Define Word (doublebyte) ế ừ  liên ti p) Define Doubeword (2 t ế ừ  liên ti p) Define Quadword (4 t Define Tenbytes (10 bytes liên ti p)ế DB DW DD DQ DT

NAMEDB initial_value

Ví d :ụ

ALPHA DB 4

ỉ ẫ ẽ ị

ớ ặ ấ ớ ỏ ị ủ ộ ấ ế ị

ộ   ; Ch  d n này s  gán tên ALPHA cho m t byte nh  trong b  nh  mà giá tr  ban ị  ầ ủ đ u c a nó là 4. N u giá tr  c a byte là không xác đ nh thì đ t d u ch m h i (?) vào giá tr ban đ u.ầ

Ví d :ụ

Byte DB ?

ế ạ ừ ế Đ i bi n byte, ph m vi giá tr  mà nó có th  l u tr ữ ượ  đ c là t ố    ­128 đ n 127 đ i

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ể ư ấ ừ ế ấ ố ớ ố v i s  có d u và t ị ố ớ ố  0 đ n 255 đ i v i s  không d u.

9

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ế ừ 1.2.3.2. Bi n t (word)

ỉ ẫ ủ ế ừ ư ộ ể ị Ch  d n c a ASM đ  đ nh nghĩa m t bi n t nh  sau:

NAMEDW initial_value

Ví d :ụ

WRD DW ­2

ươ ế ừ ể ị ể ấ ộ T

ự ng t ị nh  bi n byte, cũng có th  dùng d u ? đ  đ nh nghĩa m t bi n t ể ư ư ế ạ ữ ượ ừ ế ị có giá   ố    ­32768 đ n 32767 đ i c là t

ố ớ ố ừ ế ấ ấ ị tr  không xác đ nh. ph m vi giá tr  mà nó có th  l u tr  đ ớ ố v i s  có d u và t 0 đ n 65535 đ i v i s  không d u.

ế ả 1.2.3.3. Bi n m ng (array)

ặ ừ ớ ế ạ ả ớ ộ ớ ộ Trong ASM, m t m ng nh  là m t lo t các byte nh  ho c t nh  liên ti p nhau.

ầ ủ ị ọ Ví d :ụ  Đ  đ nh nghĩa m t m ng 3 byte g i là B_array mà giá tr  ban đ u c a nó là

ộ ể ế ể ị 10h, 20h và 30h chúng ta có th  vi ả t:

B_array DB 10h, 20h, 30h

Khi đó:

c gán cho byte đ u tiên. ượ ượ ứ ứ ượ B_array là tên đ B_array+1 là tên đ B_array+2 là tên đ c gán cho byte th  hai. c gán cho byte th  hai.

ả ộ ộ ị ỉ N u ASM gán đ a ch  offset là 0200h cho m ng B_array thì n i dung b  nh  s ớ ẽ

ư ế ả nh  sau (b ng bên):

ẽ ị ỉ ẫ ầ ử ả ồ ộ Ch  d n sau đây s  đ nh nghĩa m t m ng g m 4 ph n t có tên là W_array:

W_array DW 1000, 40, 2997, 230. Symbol

ả ử ả Gi ỉ i đ a ch  offset

s  m ng b t đ u t ộ ộ ắ ầ ạ ị ớ ẽ ư 0300h thì n i dung b  nh  s  nh  bên: B_array B_array+1 B_array+2 Address Contents 0200h 0201h 0202h 10h 20h 30h ộ ừ ủ ấ 1.2.3.4. Byte th p và byte cao c a m t t

Symbol ầ

ấ ế ừ ộ ừ ủ ặ Đôi khi ta c n truy xu t  đ n t ng byte   ả ử  ấ  s ,  gi

(byte  th p ho c byte  cao)  c a m t t ị chúng ta đ nh nghĩa:

Word1 DW 1234h W_array W_array+2 W_array+4 W_array+4 Address Contents 0300h 0302h 0304h 0306h 1000d 40d 2997d 230d

ấ ủ ứ ứ ủ ệ

ỉ ủ ỉ ủ ệ ấ ị ị

ị   thì byte th p c a Word1 ch a 34h, còn byte cao c a Word1 ch a 12h. Ký hi u đ a ế ỉ ủ   ch  c a byte th p là Word1 (là đ a ch  c a bi n Word1) còn ký hi u đ a ch  c a byer cao là Word1+1.

1.2.4.

Chu i các ký t

(Character string)

ể ượ ị ả ằ ộ ỗ ộ ự M t m ng các mã ASCII có th  đ c đ nh nghĩa b ng m t chu i các ký t .

Ví d :ụ

Letters db 41h, 42h, 43h

ươ ớ ẽ ươ s  t ng đ ng v i:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Letters db ‘ABC’

10

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ộ ỗ ữ ườ ữ ậ ỗ t ch  hoa và ch  th ng. Vì v y chu i ‘abc’ s ẽ

ể ượ ệ Bên trong m t chu i, ASM phân bi c chuy n thành 3 byte: 61h, 62h, và 63h. đ

ể ổ ợ ự ộ ị ố Trong ASM cũng có th  t h p các ký t và các s  trong m t đ nh nghĩa.

Ví d :ụ

MSG db ‘HELLO’, 0AH, 0DH, ‘$’

ươ ớ ươ t ng đ ng v i:

MSG db 48h, 45h, Ch, 4Ch, 4Fh, 0Ah, 0Dh, 24h

1.2.5.

Các h ng (Constnts)

ể ượ ằ ặ ờ ng trình, các h ng có th  đ ỉ ẫ c đ t tên nh  ch  d n EQU (EQUates). Trong m t ch

ươ ằ ư ị ộ Cú pháp đ nh nghĩa h ng nh  sau:

NAME EQU Value

Ví d :ụ

LF equ 0ah

ị ượ ế ươ Sau khi có đ nh nghĩa trên thì Lf đ c dùng thay th  cho 0ah trong ch ng trình. Vì

ẽ ể ỉ ị ậ v y ASM s  chuy n các ch  th :

Mov dl, 0ah

Mov dl, LF

ộ thành cùng m t mã máy.

ể ỗ ộ ụ ể ị Cũng có th  dùng EQU đ  đ nh nghĩa m t chu i, ví d :

Prompt equ ‘Type your name: ‘

ị Sau khi có đ nh nghĩa này, thay cho:

Msg db ‘Type your name: ‘

ể ế chúng ta có th  vi t:

Msg db Prompt

ơ ả

ệ 1.3. Các l nh c  b n

ầ ả ỉ

ể ố ệ ả ủ ớ ơ ộ   ệ CPU 8086/88 có kho ng 115 ch  th  (theo tài li u), trong ph n này chúng ta xem xét m t ượ   c dùng v i các thao tác di chuy n s  li u và ng đ

ố ọ ệ ị ố ệ ườ s  l nh đ n gi n c a 8086/88 mà chúng th ự th c hi n các phép tính toán s  h c và logic.

ể ế word1 và word2 là các bi n ki u word (2 byte), byte1 và byte2 là

ế ể ầ Trong ph n sau đây,  các bi n ki u byte.

1.3.1.

L nh MOV và l nh XCHG

ể ố ệ ế ộ ộ ị ữ ặ ự ể ể ớ ộ

ư ộ ị  ệ ữ L nh Mov dùng đ  chuy n s  li u gi a các thanh ghi, gi a m t thanh ghi và m t v ộ ố ế ặ ớ   trí nh  ho c đ  di chuy n tr c ti p m t s  đ n m t thanh ghi ho c m t v  trí nh . Cú pháp ủ ệ c a l nh Mov nh  sau:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

MOV Destination, Source

11

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Ví d :ụ

ấ ư nh  word1 đ a vào ax.

ộ ậ ủ ừ ớ ủ ự ệ ộ ỉ ị mov mov ax, word1 bx, ax

ổ ộ

ậ mov ah, ‘A’ ; L y n i dung c a t ; bx nh n n i dung c a ax, sau khi th c hi n ch  th ; n i dung ax không thay đ i. ị ; ax nh n giá tr  41h.

ả ấ ườ ủ ợ ỉ ị B ng sau cho th y các tr ặ ấ ng h p cho phép ho c c m c a ch  th  Mov:

Destination operand

Segment Reg Memory Location

Source operand General Reg General Reg Segment Reg MemoryLocation Constant Y Y Y Y Y N Y N Y Y N Y Constant N N N N

ủ ệ ể ể ặ ộ ủ   L nh Xchg (Exchange) dùng đ  hoán chuy n n i dung c a hai thanh ghi ho c c a

ộ ị ộ ớ m t thanh ghi và m t v  trí nh .

Ví d :ụ

ể ể ể ộ ộ ộ ế ế xchg xchg xchg ah, bl ax, word1 al, byte1 ữ ; Hoán chuy n n i dung gi a thanh ghi ah và bl ữ ; Hoán chuy n n i dung gi a thanh ghi ax và bi n word1 ữ ; Hoán chuy n n i dung gi a thanh ghi al và bi n byte1

ế ư ả ộ ố ạ ư ệ ệ Cũng nh  l nh Mov, l nh Xchg có m t s  h n ch  nh  b ng sau:

Source operand General Memory  Memory Location Destination operand General Register Y Y Memory Locatin Y N

1.3.2.

L nh ADD, SUB, INC, DEC

ệ ượ ủ ể ộ c dùng đ  c ng và tr

L nh ADD và SUB đ ộ ị ớ ủ ủ ớ ớ ộ ố ặ ộ ộ   ừ ộ  n i dung c a hai thanh ghi, c a m t ư  ộ ị

thanh ghi và m t v  trí nh , c a m t thanh ghi ho c m t v  trí nh  v i m t s . Cú pháp nh sau:

ADD Destination, Source

SUB Destination, Source

Ví d :ụ

sub sub sub word1, ax bl, 5 ax, dx ; word1:=word1­ax ; bl:=bl­5 ; ax:=ax­dx

ị ộ ố ạ ế ư ả ệ ậ ỹ Vì lý do k  thu t, các l nh ADD và SUB cũng b  m t s  h n ch  nh  b ng sau:

Source operand

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Gen Memory Memory Location Constant Destination operand General Reg Y Y Y Memory Loacation Y N Y

12

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ể ả ữ ị c phép. Đ  gi

ượ Vi c c ng ho c tr  tr c ti p gi a 2 v  trí nh  là không đ ộ ộ ừ ự ế ể ệ ộ ườ ặ ả ớ ế ế ấ   ớ i quy t v n ớ ộ   i ta ph i di chuy n m t byte (word) nh  đ n m t thanh ghi sau đó m i c ng

ừ ộ ớ ớ ề đ  này ng ặ ho c tr  thanh ghi này v i m t byte (word) nh  khác.

Ví d :ụ

mov add al, byte2 byte1, al

ể ộ ủ ộ ộ

ệ ớ ệ ặ ớ ể ả ặ ộ ớ ỏ ị

ộ ị  L nh INC (INCrement) đ  c ng thêm 1 vào n i dung c a m t thanh ghi ho c m t v trí nh . L nh DEC (DECrement) đ  gi m b t 1 kh i m t thanh ghi ho c v  trí nh . Cú pháp   ủ c a chúng là:

INC Destination

DEC Destination

Ví d :ụ

inc inc dec word1 ax bl

1.3.3.

L nh NEG (NEGative)

ể ổ ấ ộ ị ủ ệ ặ ấ ớ ộ L nh NEG đ  đ i d u (l y bù 2) c a m t thanh ghi ho c m t v  trí nh . Cú pháp nh ư

sau:

NEG destination

Ví d :ụ

neg ax

ả ử ệ ệ ầ Gi ự  s  ban đ u ax=0002h, sau khi th c hi n l nh neg ax thì ax=0fffeh.

ạ ạ ả ỉ ị Chú ý: Hai toán h ng trong các ch  th  có hai toán h ng trên ph i cùng kích th ướ   c

ặ (cùng là byte ho c cùng là word).

ữ ấ

1.4. Chuy n ngôn ng  c p cao thành ngôn ng  ASM

ả ử ể ẽ ệ ề ể ế Gi s  A và B là 2 bi n ki u word. Chúng ta s  chuy n các m nh đ  sau trong ngôn ng ữ

ữ ấ c p cao ra ngôn ng  ASM:

1.4.1.

ề M nh đ  A=B:

ư ư mov mov ax, A b, ax ; Đ a A vào ax ; Đ a ax vào B

1.4.2.

ề M nh đ  A=5­A:

mov sub mov ax, 5 ax, a ax, a ư ; Đ a 5 vào ax ; ax=5­a ; a=ax

Cách khác:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

neg add a a, 5 ; A=­A ; A=5­A

13

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

1.4.3.

M nh đ  A=B­2*A:

mov sub sub mov ax, B ax, A ax, A A, ax ; ax=b ; ax=B­A ; ax=B­2*A ; A=B­2*A

ươ

1.5. C u trúc m t ch

ng trình h p ng

ố ệ ẽ ượ ế ộ ể ạ ạ ạ ỗ ớ ộ ng trình ngôn ng  máy bao g m mã (code), s  li u (data) và ngăn x p (stack). ộ  ng trình s  đ c chuy n thành m t đo n b

ỗ ớ ở ươ ộ ồ M t ch ươ ế ầ M i ph n chi m m t đo n nh . M i đo n ch nh  b i ASM.

1.5.1.

ể Các ki u b  nh

ỉ ẫ ươ ượ ở ng trình đ

ố ệ Đ  l n c a mã và s  li u trong m t ch ớ ộ ớ ủ ể ộ ươ c quy đ nh b i ch  d n MODEL ủ ị ỉ ẫ ư ằ ớ ộ ị nh m xác đ nh ki u b  nh  dùng v i ch ng trình. Cú pháp c a ch  d n MODEL nh  sau:

.MODEL memory_model

ủ ể ấ ả ộ ớ ị B ng sau cho th y các ki u b  nh  (các giá tr  và ý nghĩa c a memory_model):

MODEL

DESCRITION ạ ộ

ề ề ạ ạ ộ ộ

ằ ơ ơ ớ ộ ộ ơ ạ

ớ ơ ớ ộ ơ SMALL MEDIUM COMPACT LARGE HUGE code và data n m trong m t đo n ạ code nhi u h n m t đo n, data trong m t đo n ạ data nhi u h n m t đo n, code trong m t đo n ộ code và data l n h n m t đo n, array không quá 64KB ạ code, data l n h n m t đo n, array l n h n 64KB

1.5.2.

ạ ố ệ Đo n s  li u

ạ ố ệ ươ ằ Đo n s  li u c a ch ế ng trình ch a các khai báo bi n, (có th  là) khia báo h ng, ...

ể ắ ầ ớ ủ ạ ố ệ ứ ỉ ẫ ể ư Đ  b t đ u đo n s  li u, chúng ta dùng ch  d n DATA v i cú pháp nh  sau:

.DATA

ướ ủ ế ả ằ ; Khai báo tên và kích th c c a các bi n, m ng và h ng.

Ví d :ụ

byte1 word1 word2 msg db dw dw db 2 2 5 ‘This is a message’

1.5.3.

ế Đo n ngăn x p

ụ ế ớ ộ ể ư   M c đích c a vi c khai báo đo n ngăn x p là dành m t vùng nh  (vùng stack) đ  l u

ệ ủ ệ ữ ư ạ ủ tr  cho stack. Cú pháp c a l nh nh  sau:

.STACK size

ế ượ N u không khai báo size thì 1 KB đ c dành cho vùng stack.

Ví d :ụ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

.Stack 100h ; Dành 256 byte cho vùng stack

14

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ươ ữ ợ ườ ị ng giá tr  100h cho

ố ớ Chú ý:  Đ i v i các ch ướ ủ ng trình h p ng  nói chung, thông th ợ c c a vùng stack là phù h p. kích th

1.5.4.

ạ Đo n mã

ị ủ ứ ệ ỉ ươ ắ ầ ằ ạ Đo n mã ch a các câu l nh (ch  th ) c a ch ng trình. B t đ u đo n mã b ng ch ỉ

ư ạ ẫ d n CODE nh  sau:

.CODE

ệ ạ ườ ượ ổ ứ ủ ụ Bên trong đo n mã, các l nh th ng đ ấ    ch c thành th  t c (procedure) mà c u c t

ủ ụ ư ủ ộ trúc c a m t th  t c nh  sau:

Name Proc

; body of procedure

Name Endp

ủ ấ ộ ươ ủ ụ ữ ầ ợ Sau đây là c u trúc c a m t ch ng trình h p ng  mà ph n CODE là th  t c có tên là

MAIN:

Small 100h

ả ế ữ ệ ằ ạ i đây

Proc

ủ ụ ế

.Model .Stack .Data ị ; Đ nh nghĩa d  li u (bi n, m ng, h ng) t .Code Main ủ ụ ; Thân th  t c Main Endp Main ; Các th  t c khác n u có Main End

ệ 1.6. Các l nh vào, ra

ế ị ổ ớ CPU thông tin v i các thi

ạ ấ ế ứ ế ầ ổ

ủ ệ ệ   t b  ngo i vi thông qua các c ng I/O (Input/Output port). L nh ụ   IN và OUT c a CPU cho phép truy xu t đ n các c ng này. Tuy nhiên h u h t các  ng d ng không dùng l nh IN và OUT vì hai lý do:

(cid:0) ỉ ổ ạ ổ ị ỳ Các đ a ch  c ng thay đ i tu  theo lo i máy tính khác nhau.

(cid:0) ễ ờ ơ

ể ậ ấ ươ ươ ạ ở

ủ ủ

ượ   c ng trình con (routine) đ Có th  l p trình cho các I/O d  dàng h n nh  các ch ụ ụ ế ạ   cung c p b i các hãng ch  t o máy tính. Có hai lo i ch ng trình ph c v  I/O là: các routine c a BIOS (Basic Input Output System) và các routin c a DOS (Disk Operating   System).

ệ L nh INT (Interrupt)

ể ọ ươ ủ ể ệ ớ Đ  g i các ch ng trình con c a BIOS và DOS có th  dùng l nh INT v i cú pháp nh ư

sau:

INT interrupt_number

ọ ộ ị ỉ interrupt_number là m t s  mà nó ch  đ nh m t routine. Ví d ụ INT 16h g i routine

đây Ở ệ ệ ậ ố ệ ừ ự th c hi n vi c nh p s  li u t ộ ố  Keyboard.

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ệ L nh: INT 21h

15

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ộ ố ớ ể ọ ượ ị INT 21h đ

c dùng đ  g i m t s  l n các hàm (function) c a DOS. Tu  theo giá tr  mà ộ ố ươ ứ ẽ ọ ặ ạ ủ chúng ta đã đ t vào thanh ghi ah, INT 21h s  g i ch y m t s  routine t ỳ ng  ng.

ế ẽ ầ Trong ph n này chúng ta s  quan tâm đ n 2 hàm sau đây:

ROUTINE

FUNCTION NUMBER 1 2 Single key input Single character output

FUNTION 1 : Single key input Input Output

: AH=1 : AL= ASCII code if character key is pressed   AL=0 if non character key is pressed

ể ọ ệ ệ ự Đ  g i routine này th c hi n các l nh sau:

ah, 1 21h ; Input key function ; ASCII code in AL and display character on the screen

mov int FUNTION 2: Display a character or execute a control function Input

: AH=2   DL=ASCII code of the the display character or control character

Output : AL= ASCII code of the the display character or control character

ẽ ệ ấ Các l nh sau s  in lên màn hình d u ?

ủ ắ ; S  d ng hàm 2 c a ng t 21h

mov mov int ử ụ ah, 2 dl, ‘?’ ; character is ‘?’ 21h ; display character

ể ự ứ ể ế ể Hàm 2 cũng có th  dùng đ  th c hi n ch c năng đi u khi n. N u dl ch a ký t ự ề    đi u

ể ự ề ự ệ ọ khi n thì khi g i INT 21h, ký t đi u khi n s  đ ề ứ ệ ể ẽ ượ c th c hi n.

ự ề ể ườ Các ký t đi u khi n th ng dùng là:

FUNCTION

ASCII code (Hex) 7 8 9 A D SYMBOL BEL BS HT LF CR beep backspace tab line feed carriage return

ươ

1.7. Ch

ng trình đ u tiên

ươ ữ ằ ợ ọ ộ ộ t m t ch ng trình h p ng  nh m đ c m t ký t ự ừ  t bàn phím và in nó Chúng ta s  vi

ế ầ ẽ ế trên đ u dòng ti p theo.

100h

ị ộ ự ể ; Hàm 2: hi n th  m t ký t

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

TITLE PGM1: ECHO PROGRAM .Model Small .Stack .Code Main Proc ắ ị ấ ể ; Hi n th  d u nh c ah, 2 mov dl, ‘?’ mov 21h int

16

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ậ ự

bàn phím

ự ừ ộ  t c đ a vào trong al

ọ ; Hàm 1: đ c m t ký t ự ọ ượ ư  đ c đ ; Ký t ự ấ ; C t ký t trong bl

carriage return ự ; Th c hi n carriage return  line feed ệ ự ; Th c hi n line feed

ể ị ự ; Hi n th  ký t

ộ ; Nh p m t ký t ah, 1 mov 21h int bl, al mov ớ ế ; Nh y đ n dòng m i ah, 2 mov dl, 0dh ; Ký t mov 21h int dl, 0ah ; Ký t mov 21h int ị ể ; Hi n th  ký t dl, bl mov int 21h ở ề ; Tr  v  DOS mov int ề ah, 4ch ; Hàm thoát v  DOS ; exit to DOS 21h

Main Endp End Main

ươ

1.8. T o và ch y m t ch

ng trình h p ng

ướ ể ạ ạ ộ ươ ữ Có 4 b c đ  t o và ch y m t ch ợ ng trình h p ng  là:

(cid:0) ộ ể ạ ả ả ậ ạ ươ ồ ng trình ngu n (source

Dùng m t trình so n th o văn b n  đ  t o ra t p tin ch program file).

(cid:0) ể ạ ậ ị ố ượ ng (object file) ngôn

ữ ộ Dùng m t trình biên d ch (Assembler) đ  t o ra t p tin đ i t ng  máy.

(cid:0) ề ậ ế ặ ộ ố ượ ng thành

ể Dùng trình k t n i LINK (TLINH) đ  liên k t m t ho c nhi u t p tin đ i t ự file th c thi đ ế ố ượ c.

(cid:0) ự ệ ươ ừ ạ ặ Cho th c hi n ch ng trình *.exe ho c *.com v a t o ra.

ướ ươ ồ B ạ c 1: T o ra ch ng trình ngu n

ộ ể ạ ồ

ả Dùng m t trình so n th o văn b n (NC ch ng h n) đ  t o ra ch ướ ạ ở ộ ạ ầ ẳ ầ ậ ụ  ươ ng trình ngu n. Ví d ể   c   đ  Assembler  nh n ra

ươ ồ ả ở ộ ấ l y tên  là pgm1.asm.  Ph n m  r ng asm  là ph n m  r ng quy  ch ng trình ngu n.

ướ ị ươ B c 2: Biên d ch ch ng trình

ẽ ể ậ ồ pgm1.asm thành

Chúng ta s  dùng TASM (Turbo Asssembler) đ  chuy n t p tin ngu n  ố ượ ể ệ ằ ọ ữ ng ngôn ng  máy g i là ậ t p tin đ i t pgm1.obj b ng l nh DOS sau:

ề ả ồ ỗ

ỗ ẽ ể ắ ả ị ỗ ẽ ế ể i đó. N u không có l

i thì TASM s  in ra s  dòng b  l ộ ậ ố ượ ọ TASM PGM1; (cid:0) ề Sau khi in thông tin v  b n quy n TASM s  ki m tra file ngu n đ  tìm l ộ ố i và m t mô t ể ogm1.asm thành m t t p tin đ i t

ề ỗ  ng n v  l ữ ng ngôn ng  máy g i là   ộ ậ ố ạ ẽ ế ấ ả ớ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ệ ư ướ ấ ể ạ ộ ố ậ ủ ế   i cú pháp. N u ỗ i thì TASM   có l ấ   ấ ẽ pgm1.obj. D u ch m s  chuy n  ố ượ ệ   ph y sau l nh TASM PGM1 có nghĩa là chúng ta không mu n t o ta m t t p tin đ i t ng có tên ầ khác v i PGM1. N u không có d u ch m ph y sau l nh này thì TASM s  yêu c u chúng ta gõ   vào tên c a m t s  t p tin mà nó có th  t o ra nh   d i đây:

17

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Object file name [ PGM1.OBJ]:

Source listing [NUL.LIST]: PGM1

Cross­reference [NUL.CRF]: PGM1

ạ ị ươ ứ ườ ậ ừ ng  ng tr  khi ng i l p trình gõ

Tên m c đ nh là NUL có nghĩa là không t o ra file t ậ ặ vào tên t p tin.

ậ ộ ậ

ố ể ỡ ố ườ ươ ữ ậ ợ ồ T p tin danh sách ngu n (source listing file): là m t t p tin text có đánh s  dòng, trong đó ng trình ng dùng đ  g  r i ch

ồ ỗ ồ ạ ằ mã h p ng  và mã ngu n n m c nh nhau. T p tin này th ố i theo s  dòng. ngu n vì TASM thông báo l

ậ ấ ươ ệ ệ ấ ậ ố T p tin tham chi u chéo (cross reference file): là m t t p tin ch a danh sách các tên mà   ượ   c ộ ậ ấ ng trình kèm theo s  dòng mà tên  y xu t hi n. T p tin này đ

ươ ể ế ộ ớ ế chúng xu t hi n trong ch dùng đ  tìm các bi n và nhãn trong m t ch ng trình l n.

ướ ế ươ B c 3: Liên k t ch ng trình

ậ ạ ng t o ra

ố ượ T p tin đ i t ạ ư ư ơ ộ ậ ạ ế ợ c vì ch a có d ng thích h p c a m t file ch y. H n n a nó ch a bi ạ   ữ c 2 là m t t p tin ngôn ng  máy nh ng nó không ch y ượ   ộ c ng trình đ ư t ch

ữ ỉ ướ ạ ộ ố ị ộ ị ế ươ ể ị ở ướ  b ủ ớ ể ạ ượ đ ạ n p vào v  trí nào trên b  nh  đ  ch y. M t s  đ a ch  d i d ng mã máy có th  b  thi u.

ố ượ ẽ ặ ộ ng (*.obj) thành m t file

ế ộ ể ạ ề ớ ạ ậ ấ ộ Trình TLINK (linker) s  liên k t m t ho c nhi u file đ i t ch y duy nh t (*.exe). T p tin này có th  n p vào b  nh  và thi hành.

ể ế ươ Đ  liên k t ch ng trình ta gõ:

TLINK PGM1 [/t];

ế ự ẽ ấ ẩ ầ ậ N u không có d u ch m ph y thì ASM s  yêu c u chúng ta gõ vào tên t p tin th c thi.

ế ạ ậ ố ấ ẽ ạ N u có tham s  /t thì TLINK s  t o ra t p tin ch y là *.com.

ướ ạ ươ B c 4: Ch y ch ng trình

ể ạ ắ ệ ừ ấ ươ ồ ấ ằ T  d u nh c l nh có th  ch y ch ng trình b ng cách gõ tên nó r i  n ENTER.

1.8.1.

Xu t m t chu i ký t

ể ọ

ng trình PGM1 trên đây chúng ta đã dùng INT 21h, hàm 2 và 4 đ  đ c và ộ ự ể ể ấ ắ ấ ỗ Trong ch ự ộ xu t m t ký t ươ . Hàm 9, ng t 21h có th  dùng đ  xu t m t chu i ký t .

INT 21H, Function 9: Display a string Input: DX=offset address of string The string must end with a ‘$’ character

ở ỗ Ký t

ể ự ứ ẽ  cu i xâu s  không đ ứ ể ươ ố ề ự

ỗ ứ ự ề   ế ượ  đi u c in lên màn hình. N u chu i có ch a ký t ệ ươ   ộ ẽ ế ẽ ượ ng c th c hi n. Chúng ta s  vi ng  ng s  đ t m t ch ạ   ư ị ượ ệ c đ nh nghĩa nh  sau trong đo n

‘$’  khi n thì ch c năng đi u khi n t trình in lên màn hình chu i ‘Hello!’. Thông đi p Hello đ ố ệ s  li u:

Msg db ‘Hello!$’

ệ L nh LEA ( Load Effective Address)

LEA destnation, source

ấ ắ ự ỉ ệ ệ ề ị ụ    ra màn hình v i đi u ki n đ a ch  hi u d ng

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ẽ Ng t 21h, hàm 9 s  xu t m t xâu ký t ệ ế ộ ể ự ả ở ề ớ ở ệ ủ c a bi n xâu ph i trong dx. Có th  th c hi n đi u này b i l nh:

18

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ư ị ế ỉ lea dx, Msg ủ ; Đ a đ a ch  offset c a bi n Msg vào dx.

ầ ủ ầ ươ Program Segment Prefix (PSP): Ph n mào đ u c a ch ng trình.

ộ ạ ượ ớ Khi m t ch

ươ ứ ng trình đ ộ ố ộ ề ươ ượ ạ ể ớ ng trình đang đ

ươ ạ ủ ộ ố

ế ạ

ỏ ế ạ ữ ệ ặ ả ộ ướ ươ ươ ứ ề ể c n p vào b  nh  máy tính, DOS dành ra 256 byte cho cái ộ   c n p trong b  nh . Đ  cho ả  ữ  ả   ng trình có ch a đo n d  li u ph i

ệ ở ọ g i là PSP. PSP ch a m t s  thông tin v  ch ể ấ ớ ng trình có th  truy xu t t các ch i PSP, DOS đ t m t s  phân đo n c a nó (PSP) trong c ươ ự ng trình. K t qu  là thanh ghi DS không tr  đ n đo n d c khi th c thi ch DS và ES tr ụ ắ ệ ủ ng trình. Đ  kh c ph c đi u này, m t ch li u c a ch ượ ắ ầ đ c b t đ u b i 2 l nh sau đây:

mov mov ax, @Data ds, ax

Ở ữ ệ ượ ở ị đây   @Data   là   tên   c a   đo n  d   li u   đ c   đ nh   nghĩa   b i   Data.   Assembler   s ẽ

ủ ị ể ạ ố ạ ỉ chuy n @Data thành s  đo n (đ a ch ).

ươ ể ấ ỉ ự Sau đây là ch ng trình hoàn ch nh đ  xu t xâu ký t ‘Hello!’

Small 100h

TITLE PGM2: PRINT STRING PROGRAM .Model .Stack .Data

msg db ‘Hello!$’

.Code Main Proc

ax, @Data ds, ax

ah, 9 21h

; Initialize DS mov mov ; Display message lea dx, msg mov int ; Return to DOS mov int ề ah, 4ch ; Hàm thoát v  DOS ; exit to DOS 21h

Main End Endp Main

ươ

ữ ườ

1.8.2.

Ch

ổ ng trình đ i ch  th

ng sang ch  hoa

ầ ộ Chúng ta s  vi ự ằ    b ng

ườ ử ụ ồ ạ ở ữ ườ ươ ươ ộ ẽ ế t m t ch ng trình yêu c u ng ữ ự ổ  đó sang d ng ch  hoa r i in ra  ng trình đ i ký t i s  d ng gõ vào m t ký t ế  dòng ti p theo. ch  th ng. Ch

Small 100h

TITLE PGM3: CASE COVERT PROGRAM .Model .Stack .Data

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

cr equ lf equ msg1 0dh 0ah db ‘Enter a lower case letter: $’

19

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

msg2 char db db 0dh, 0ah, ‘In upper case it is: $’ ?, ‘$’

.Code Main Proc

ax, @Data ds, ax

; Thông báo s  1ố

ậ ổ ự hoa

ng và đ i nó thành ký t ự c trong al

ố ; L y thông báo s  2

ỗ ấ ự ứ ; Initialize DS mov mov ; Print Prompt user lea dx, msg1 ah, 9 mov 21h int ự ườ ộ  th ; Nh p vào m t ký t ộ ọ ; Hàm đ c m t ký t ah, 1 mov ự ọ ượ  đ c đ ; Ký t 21h int ổ ữ al, 20h ; Đ i ra ch  hoa sub ế ấ char, al;C t ký t  trong bi n char mov ế ự ấ  trên dòng ti p theo ; Xu t ký t ấ lea dx, msg2 mov int ah, 9 21h

ự ấ ế  th  2, vì msg2 không k t thúc  ế ế ụ  có trong bi n

; Xu t chu i k.t ở ; b i ‘$’ nên nó ti p t c xu t ký t ; char

; Return to DOS mov int 21h ah, 4ch ; Hàm thoát v  DOS ; exit to DOS

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Main End Endp Main

20

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ƯƠ

CH

Ử NG 2 TR NG THÁI C A VI X  LÝ VÀ CÁC THANH GHI C

ử ả ưở Trong ch ng này chúng ta s  xem xét các thanh ghi c  c a vi x  lý và  nh h

ạ ờ ủ ủ ươ ế ủ   ng c a ứ ể

ư ế ả ể ự ệ ẽ ờ ệ các l nh máy đ n các thanh ghi c  nh  th  nào. Tr ng thái c a các thanh ghi là căn c  đ ặ ch ệ ươ ng trình có th  th c hi n các l nh nh y, l p khác nhau.

ầ ủ ộ ươ ẽ ớ ươ ủ M t ph n c a ch ng này s  gi ệ i thi u ch ng trình Debug c a DOS.

2.1. Thanh ghi c  (Flag register)

ệ ọ

ể Đi m khác bi ộ ế ị t quan tr ng c a máy tính so v i các thi ạ ế ị ệ ử t b  đi n t ế ị ớ ể ệ ằ

ế ạ ủ ệ ặ ộ ủ t trong CPU có th  làm các quy t đ nh này b ng cách căn c t cho bi ả  khác là kh  năng cho   ứ  ủ   t tr ng thái c a CPU, đó là

11

10

15 x

14 x

13 x

12 9 x O D I

8 7 T S

6 Z

2 P

1 0 x C

5 3 4 x A x ờ ủ ộ      Các c  c a b  vi x  lý 8085 ử

ượ ị

(x: Không đ

c đ nh nghĩa (don't care), v i 8 bit th p là các c  c a b  vi x  lý 8085)

ặ các quy t đ nh. M t m ch đ c bi ệ ạ vào tr ng thái hi n hành c a CPU. Có m t thanh ghi đ c bi thanh ghi c :ờ

ờ ủ ộ Hình v : S  đ  thanh ghi c  c a 8088/86

ẽ ơ ồ ờ ủ

ụ ờ ạ ủ ờ ỉ

ạ ờ ế ủ ờ ề ả ự ể

ả ủ ả ỗ ạ   M c đích c a các thanh ghi c  là ch  ra tr ng thái c a CPU. Có hai lo i c  là c  tr ng thái ờ ạ ệ ệ   (status flags) và c  đi u khi n (control flags). C  tr ng thái ph n ánh các k t qu  th c hi n l nh ộ ạ ờ ủ c a CPU. M i bit trên thanh ghi c  ph n ánh m t tr ng thái c a CPU.

ờ ạ Các c  tr ng thái (status flags)

ệ ệ ờ ạ ả ủ ự ụ ả Các c  tr ng thái ph n ánh k t qu  c a các phép toán. Ví d , sau khi th c hi n l nh sub

ế ằ ờ ế ả ủ ax, ax thì c  ZF=1, nghĩa là k t qu  c a phép toán b ng 0 (zero).

(cid:0) ừ ị ệ ế ấ

ờ ự ừ ưở ờ ợ ị ộ ượ ườ ng h p khác CF=0. C  CF cũng b   nh h ớ  v  trí MSB trong khi ự ạ i MSB trong khi th c hi n phép ở ệ ị ả ng b i l nh d ch (Shift)

ớ C  nh  (Carry Flag ­ CF): CF=1 n u xu t hi n bit nh  (carry) t ặ ệ th c hi n phép c ng ho c có bit m n (borrow) t tr . Trong ác tr và quay (Rotate).

(cid:0) ả ổ ố

ấ ủ ế ượ ạ c l

ế ườ ộ ố ẻ ụ ế ế ả ổ ộ    (Parity Flag ­ PF): PF=1 n u byte th p c a k t qu  có t ng s  bit 1 là m t ấ ủ   ợ ng h p ng i (nghĩa là trong byte th p c a    (old parity)). Ví d , n u k t qu  phép toán là

ờ ẵ ẻ C  ch n l ẵ ố s  ch n (even parity). PF=0 trong tr ố ả ế k t qu  có t ng s  bit 1 là m t s  l 0fffeh thì PF=0.

(cid:0) ờ ớ ụ ế ấ

ự ố ớ ượ ừ ấ ặ ấ ố ớ ừ     nibble cao xu ng nibble th p) đ i v i các

C  nh  ph  (Auxiliary Carry Flag ­ AF): AF=1 n u trong byte th p có s  nh  t nibble th p lên nibble cao (ho c m n t ừ ộ phép c ng, tr .

(cid:0) ủ ế ế ế ả ả ố

ườ ờ ấ C  d u (Sign Falg ­ SF): SF=1 n u MSB c a k t qu  là 1 (k t qu  là s  âm). SF=0 trong tr ợ ng h p ng ượ ạ c l i.

(cid:0) ờ ố ự

ẽ ệ ự ệ ợ

ế ườ ế ố

ệ ượ ạ ố ậ ấ ở ễ

ễ ố ể ố ậ ễ ể ễ ế

ể ể ộ ế ả ố

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ằ ố ớ ộ ố ể ế ễ ả ủ ừ ế ế ộ ả   C  tràn (Overflow Flag ­ OF): OF=1 n u x y ra tràn s  trong khi th c hi n phép toán. ả ng h p x y ra tràn trong khi th c hi n phép Sau đây chúng ta s  phân tích các tr   ớ   ể ệ ng tràn s  liên quan đ n vi c bi u di n s  có d u trong máy tính v i toán. Hi n t ế   ấ ộ ố ữ m t s  h u h n các bits. Các s  th p phân có d u bi u di n b i 1 byte là: ­128 đ n   127. N u bi u di n b ng 1 word (16 bits) thì các s  th p phân có th  bi u di n là ấ   ­32768 đ n 32767. Đ i v i các s  không d u, d i các s  bi u di n trong m t byte là ế ừ    0 đ n 65535. N u k t qu  c a m t phép toán t 0 đ n 255 và trong m t word là t

21

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ể ể ố ế ả ố ự ự ễ ố ả

ả t ra ngoài d i s  có th  bi u di n thì x y ra s  tràn s . Khi có s  tràn s , k t qu ượ ẽ ị ượ v thu đ c s  b  sai.

2.2. Tràn (Overflow)

ạ ấ ấ ố

Có hai lo i tràn s : Tràn có d u (Sign overflow) và tràn không d u (unsigned overflow). ự ẽ ả ố ọ ữ ệ ẳ ả ộ ạ Khi th c hi n phép c ng s  h c ch ng h n, s  x y ra 1 trong nh ng kh  năng sau:

(cid:0) Không tràn.

(cid:0) ấ ỉ Ch  tràn d u.

(cid:0) ấ ỉ Ch  tràn không d u.

(cid:0) ả ấ ấ Tràn c  d u và không d u.

Ví d :ụ

mov mov add ax, 0ffffh bx, 0001h ax, bx

ả ướ ạ ế K t qu  d ị i d ng nh  phân là:

1111 1111 1111 1111   0000 0000 0000 0001 10000 0000 0000 0000

ế ả ế ả ấ i k t qu  d

ả ướ ạ ớ ộ ớ ủ ừ ế ả ả

t quá đ  l n c a t ư ế ằ

ế ấ ả ố

ự ế ườ ả ợ ự ả ậ ư   ế ễ N u di n gi i d ng không d u thì k t qu  là đúng (10000h=65536). Nh ng ớ ừ ị ượ ả ế  v  trí MSB) đã x y ra và k t qu  trên là  nh . Bit 1 (bit nh  t k t qu  đã v   ộ   ộ ế ấ ax=0000h là sai. S  tràn nh  th  là tràn không d u. N u xem r ng phép c ng trên là phép c ng ộ   hai s  có d u thì k t qu  trên ax=0000h là đúng, vì ffffh=­1 còn 0001=1 do đó k t qu  phép c ng ấ là 0. V y trong tr ng h p này s  tràn không d u không x y ra.

ấ ự Ví dụ: S  tràn d u

ả ử ệ ả ư ẽ ế Gi s  ax=bx=7fffh, l nh add ax, bx s  cho k t qu  nh  sau:

0111 1111 1111 1111 0111 1111 1111 1111 1111 1111 1111 1110 = fffeh

ấ ễ ể ấ ủ ố ớ

ư ậ ố ả ẫ ượ ế ấ

ộ t ngoài gi ấ ơ ữ ậ ự ể ể ộ ố ễ ấ ị

ấ   Bi u di n có d u và không d u c a 7fffh là 32767d. Nh  v y là đ i v i phép c ng d u ả   ư cũng nh  không d u thì k t qu  v n là 32767+32767=65534. S  này (65534) đã v i ả   giá tr  mà m t s  16 bits có d u có th  bi u di n. H n n a, fffeh=­2. Do v y s  tràn d u đã x y ra.

ườ ẽ ể ị ự ư ả ợ Trong tr ng h p x y ra tràn, CPU s  bi u th  s  tràn nh  sau:

(cid:0) ẽ ặ ả ấ ế CPU s  đ t OF=1 n u x y ra tràn d u.

(cid:0) ẽ ặ ế ả ấ CPU s  đ t CF=1 n u x y ra tràn không d u.

ươ ả

ẽ ẽ ượ ợ ng trình h p lý s  đ ặ ớ ờ ể ử ễ ệ ể ự ế ế ọ ấ ậ   c th c hi n đ  s a sai k t qu  ngay l p ủ   i c  OF ho c CF n u bi u di n c a h  là có d u hay

Sau khi có tràn, m t ch ườ ậ ứ t c. Ng ộ ấ không d u m t cách t ộ ỉ i l p trình s  ch  quan tâm t ươ ứ ng  ng.

ế ể ậ V y, làm th  nào đ  CPU bi ế ượ t đ c có tràn?

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

(cid:0) ấ ẽ ả ượ ặ ộ ớ ừ Tràn không d u s  x y ra khi có m t bit nh  (ho c m n) t MSB.

22

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

(cid:0) ấ ẽ ả ườ Tràn d u s  x y ra trong các tr ợ ng h p sau:

ộ ố ế ấ ả ấ

ự ư ấ ố ộ

ạ ư ế ố ớ ấ ủ   ả o Khi c ng hai s  cùng d u, s  tràn d u x y ra khi k t qu  có d u khác v i d u c a ố  ụ hai toán h ng ban đ u. Nh  trong ví d  trên, khi c ng hai s  7fffh+7fffh (hai s ươ d ầ ả ng) nh ng k t qu  là ffffh (s  âm).

ừ ế ả ấ ấ ả ố

ố ế ự ả ấ ả

ế ụ ấ   o Khi tr  hai s  khác d u (gi ng nh  c ng hai s  cùng d u) k t qu  ph i có d u ợ h p lý. N u k t qu  cho d u không nh  mong đ i thì có nghĩa là đã x y ra s  tràn   ấ d u. Ví d  8000h­0001h=7ffffh (s  d ố ư ộ ư ợ ố ươ ng). Do đó OF=1.

ế ể ậ ằ ỉ V y làm th  nào đ  CPU ch  ra r ng có tràn?

(cid:0) ế ấ OF=1 n u tràn d u.

(cid:0) ế ấ CF=1 n u tràn không d u.

(cid:0) ế ể ế Làm th  nào đ  CPU bi t là có tràn?

(cid:0) ượ ấ ặ ả ố ớ ừ Tràn không d u x y ra khi có s  nh  (carry) ho c m n (borrow) t MSB.

(cid:0) ấ ặ ấ ố

ộ ợ

ả ấ ự ế ế ể ả ố ố ộ ươ ế ố ặ

ớ ớ ư ặ ớ

ả ớ    2 s  khác d u) mà k t qu  v i ự  ớ   ng pháp sau: đ t OF=1 n u s  nh  vào và s  nh  ra ớ    MSB là không phù h p, nghĩa là có nh  vào nh ng không có nh  ra ho c có nh  ra ư ớ ừ ấ Tràn d u x y ra khi c ng hai s  cùng d u (ho c tr ấ ố ấ d u khác d u mong đ i. Phép c ng hai s  cùng d u khác nhau không th  x y ra s  CPU dùng ph tràn. Trên th c t ợ ừ t nh ng không có nh  vào.

ờ ề ể C  đi u khi n (control flags)

ờ ề ể Có 3 c  đi u khi n trong CPU, đó là:

(cid:0) ờ ướ C  h ng (Direction Flag ­ DF).

(cid:0) ờ ẫ C  b y (Trap Flag ­ TF).

(cid:0) ắ ờ C  ng t (Interrupt Flag).

ờ ề ể ượ ể ề ạ ộ ủ ể Các c  đi u khi n đ c dùng đ  đi u khi n ho t đ ng c a CPU.

ờ ướ ủ ụ ử

ể ỗ ủ ệ ỗ

ng (DF) đ ướ ể ư ỗ ẽ ỗ

ỗ ượ ử ớ ứ ừ ỉ ế ả ừ ị  trái sang ph i (t đ a ch  th p t

ệ c dùng trong các l nh x  lý chu i c a CPU. M c đích c a DF là C  h ử ể ề c x  lý. Trong các l nh x  lý chu i, hai thanh ghi dùng đ  đi u khi n h ử ệ ị ượ c dùng đ  l u đ a ch  b  nh  ch a chu i. N u DF=0 thì l nh x  lý chu i s  tăng DI và SI đ ỉ ộ ỉ ấ ớ ị ớ ị đ a ch  b  nh  sao cho chu i đ i đ a ch  cao). DF=1 ợ ườ ng h p ng trong tr ượ ộ ng mà m t chu i đ ỉ ộ ỗ ượ ử c x  lý t i. ượ ạ c l

ưở

ờ ư ế

ế

2.3. Các l nh  nh h

ng đ n các c  nh  th  nào

ờ ộ ạ ể ờ ầ ượ ệ ả T i m t th i đi m, CPU th c hi n m t l nh máy, các c  l n l

ự ộ ố ệ ộ ờ ổ

ỉ ộ ỉ ầ ờ ị

ờ ư ế ủ ệ ả ự   ế ộ ệ t ph n ánh k t qu  th c ổ ặ ệ ủ ệ   hi n c a l nh. Dĩ nhiên có m t s  l nh không làm thay đ i m t c  nào ho c thay đ i ch  m t vài ả   ặ ờ c  ho c làm cho m t vài c  có tr ng thái không xác đ nh. Trong ph n này chúng ta ch  xét  nh ướ ưở h ạ ộ ng c a các l nh (đã nghiên c u c) lên các c  nh  th  nào. ứ ở ươ  ch ng tr

ấ ả ả ưở ủ ế ệ B ng sau đây cho th y  nh h ờ ng c a các l nh đ n các c :

INSTRUCTION AFFECTS FLAGS

ả ằ ừ ế ế ế ả MOV/XCHG ADD/SUB INC/DEC NEG NONE ALL ALL tr  CFừ ALL (CF=1 tr  khi k t qu  b ng 0, OF=1 n u k t qu  là 8000H)

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ể ấ ả ưở ẽ ấ ủ ế ệ Đ  th y rõ  nh h ụ ờ ng c a các l nh đ n các c  chúng ta s  l y vài ví d :

23

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Ví d  1:ụ

; Trong đó ax=bx=0ffffh add

+

ax, bx FFFFh FFFFh 1FFFEh ả ứ ế

ấ ủ ế ả

MSB

ư ấ ủ ả ố ạ ầ K t qu  ch a trên ax là 0fffeh = 1111 1111 1111 1110 SF=1 vì MSB=1 ẻ PF=0 vì có 7 (l ) bits 1 trong byte th p c a k t qu ả ế ZF=0 vì k t qu  khác 0. ớ ừ CF=1 vì có nh  1 t ấ ủ ế OF=0 vì d u c a k t qu  gi ng nh  d u c a hai toán h ng ban đ u.

Ví d  2:ụ

add ; Trong đó al=bl=80h

ế

MSB. ạ ư ế ả ả ộ ố ươ ớ ừ al, bl 80h + 80h          100h ả K t qu  trên al=0. SF=0 vì MSB=0. ề ấ ả t c  các bits đ u b ng 0. PF=1 vì t ả ằ ế ZF=1 vì k t qu  b ng 0. ừ ớ CF=1 vì có nh  1 t ố OF=1 vì c  hai toán h ng là s  âm nh ng k t qu  là m t s  d ng (có nh  ra t MSB

ư ớ nh ng không nh  vào).

Ví d  3:ụ

sub ; Trong đó ax=8000h và bx=0001h

ax, bx 8000h 0001h

­ 7FFFh = 0111 1111 1111 1111b

ấ ủ ế

ế ả

ộ ố ươ ừ ộ ố ứ ộ ế ả ố SF=0 vì MSB=0. ả ẵ PF=1 vì có 8 (ch n) bits 1 trong byte th p c a k t qu . ZF=0 vì k t qu  khác 0. CF=0 vì không có m n.ượ OF=1 vì tr  m t s  âm cho m t s  d ng (t c là c ng hai s  âm) mà k t qu  là m t s ộ ố

ươ d ng.

Ví d  4:ụ

; Trong đó al=0ffh

ả ằ

ở ệ ưở MSB.

ượ ộ ừ ặ ng b i l nh inc m c dùng có nh  1 t ớ ớ ấ ớ ố ố inc al ả ế K t qu  trên al=00h=0000 0000b SF=0 vì MSB=0. ề ấ ả t c  các bits đ u b ng 0. PF=1 vì t ế ZF=1 vì k t qu  b ng 0. ị ả CF không b   nh h ố OF=0 vì hai s  khác d u đ ớ   c c ng v i nhau (có s  nh  vào MSB và cũng có s  nh  ra

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ừ t MSB).

24

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Ví d  5:ụ

ax, ­5 ả

ả ở ệ mov ế K t qu  trên bx=­5=0fffbh ưở ờ Không có c  nào  nh h ng b i l nh mov.

Ví d  6:ụ

ax ; Trong đó ax=8000h

ấ ủ ế

ả ằ

ế ệ ấ ủ ế ế ừ ớ ấ ủ ồ neg 8000h =1000 0000 0000 0000b = 0111 1111 1111 1111b bù 1 bù 2 = bù 1+1=1000 0000 0000 0000=8000h ả ế K t qu  trên ax=8000h SF=1 vì MSB=1 ả ẵ PF=1 vì có ch n bits 1 trong byte th p c a k t qu . ZF=0 vì k t qu  khác 0. CF=1 vì l nh beg làm cho CF=1 tr  khi k t qu  b ng 0. ạ ả ố OF=1 vì d u c a k t qu  gi ng v i d u c a hai toán h ng ngu n.

ươ

2.4. Ch

ng trình Debug

ộ ủ ươ ữ ng trình c a DOS cho phép ch y th  các ch

ể ươ Debug là m t ch ị ợ ng trình h p ng , th ể ạ ờ

ừ ươ ể ả ố ộ ừ ầ ế ng trình t ng l nh m t t

ệ ư ế ộ ế ổ ộ Debug cho phép nh p vào m t mã h p ng  tr c ti p, sau đó

ữ ể ộ

ứ ử  ạ   ườ ử ụ i s  d ng có th  cho ch y ể ấ    đ u đ n cu i, trong quá trình đó có th  th y n i dung các thanh ữ ự ậ ợ Debug  ớ Debug cung c p kh  năng xem n i dung c a ấ ủ   ộ ả ệ   ả ể  cách th c mà các l nh Debug đ  mô t

ờ ư ế ưở ế ử ệ l nh và ki m tra giá tr  các thanh ghi (k  c  thanh ghi c ). Ng ch ghi thanh đ i nh  th  nào.  ẽ ư s  chuy n thành mã máy và l u tr  trong b  nh .  ẽ ấ ả t c  các thanh ghi trong CPU. Sau đây chúng ta s  dùng  t ả nh h ng đ n các c  nh  th  nào.

ả ử ươ ữ Gi s  chúng ta có ch ợ ng trình h p ng  sau:

100h

TITLE PGM2_1: CHECK ­ FLAGS ể ể ;Dùng Debug đ  ki n tra các c .Model Small .Stack .Code

ở ề ; ax=4000h ; ax=8000h ; ax=8001h ; ax=7fffh ; ax=8000h ; Hàm tr  v  DOS

ax, 4000h ax, ax ax, 0ffffh ax ax ah, 4ch 21h

mov add sub neg inc mov int Main Endp

End Main

ả ử ạ ườ Sau khi d ch ch s  file ch y là ng d n checkfl.exe trên đ ẫ C:\ASM. Để ươ ng trình, gi ệ ị ch y ạ Debug chúng ta gõ l nh sau:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

C:\> DEBUG C:\ASM\CHECKFL.EXE

25

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ở ừ ấ ườ ử ụ ấ

ừ ấ ủ Debug (d u “_”), ng ể ể ư ằ ệ ộ i s  d ng có th  đ a vào các c h t, có  th  xem n i dung các thanh  ghi b ng l nh R

ắ T  lúc này tr  đi, d u nh c là c a  ế ắ  d u nh c này. Tr ộ ướ ư l nh  ệ Debug  t (Register), màn hình có n i dung nh  sau:

­R AX=0000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=0000 NV UP DI PL NZ NA PO NC 0EE6:0000 B80040 MOV AX, 4000

ủ ấ ộ ướ ạ ầ Chúng ta th y tên các thanh ghi và n i dung c a chúng (d i d ng Hexa) trên 3 dòng đ u.

ứ ư ụ ể ư ễ ủ ể ạ ờ Dòng th  t là tr ng thái các c  theo cách bi u di n c a Debug. C  th  nh  sau:

Flags Set (1) Symbol Clear (0) Symbol

CF CY (carry) NC ( no carry)

PF AF PE (even parity)  AC (auxiliary carry) PO ( odd parity)  NA ( no auxiliary carry)

ZF ZR ( zero) NZ ( non zero)

SF NG ( negative) PL ( plus)

OF OV ( overflow) NV ( no overflow)

DF DN ( down) UP ( up)

IF DI (disable interrupt)

ạ EI (enable interrupt ) B ngả Tr ng thái các c  c a ờ ủ Debug.exe

ế ỉ ủ ệ ị ệ ị

ươ ứ ỉ ố c th c hi n d

ẽ  ủ ủ ệ   i d ng đ a ch  logic), mã máy c a l nh và n i dung c a l nh t ng  ng. Khi ể ẽ ấ   ng trình này trên m t máy tính khác có th  s  th y m t đ a ch  đo n khác đi. Chúng ra ươ Dòng cu i cùng cho bi ự ị ệ ướ ạ ươ ệ ủ ừ ệ ượ đ ạ ch y ch ể ẽ s  dùng l nh T (Trace) đ  thi hành t ng l nh c a ch ủ ệ ạ ỉ  l nh ng trình b t đ u t t giá tr  hi n hành c a PC (Program counter, là đ a ch  c a l nh s ộ ộ ị ắ ầ ừ ệ mov ax, 4000h:

­T AX=4000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=0003 NV UP DI PL NZ NA PO NC 0EE6:0003 03C0 ADD AX, AX

ờ ổ ị ỉ ệ ệ mov ax, 4000h; các c  không b  thay đ i, ch  có ax=4000. Bây giờ

ự Sau khi th c hi n l nh  ệ ệ ự chúng ta th c hi n l nh add ax, ax:

­T AX=8000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=0005 OV UP DI NG NZ NA PE NC 0EE6:0005 2DFFFF SUB AX,FFFF

ả ủ ế ộ K t qu  c a phép c ng là 8000h, do đó SF=1 (NG), OF=1 (OV) và PF=1 (PE). Bây gi ờ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ệ ệ ự chúng ta th c hi n l nh sub ax, 0fffh:

26

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

­T AX=8001 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=0008 NV UP DI NG NZ AC PO CY 0EE6:0008 F7D8 NEG AX AX=8000H­FFFFH=8001H

ượ ừ ư ờ ấ ờ ỉ C  OF (NV) nh ng CF=1 (CY) vì có m n t MSB, c  PF=0 (PO) vì byte th p ch  có

ẽ ệ ệ ộ ế m t bit 1. L nh ti p theo s  là l nh neg ax:

­T AX=7FFF BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=000A NV UP DI PL NZ AC PE CY 0EE6:000A 40 INC AX

ủ ế ấ ả

ax l y bù 2 c a 8001h nên là 7fffh. CF=1 (CY) vì l nh neg cho k t qu  khác 0. OF=0 ự ệ ệ ệ ế ả ố (NV) vì k t qu  khác 8000h. Cu i cùng chúng ta th c hi n l nh inc ax:

­T AX=8000 BX=0000 CX=001F DX=0000 SP=000A BP=0000 SI=0000 DI=0000 DS=0ED5 ES=0ED5 SS=0EE5 CS=0EE6 IP=000B OV UP DI NG NZ AC PE CY 0EE6:000B B44C MOV AH, 4CH

ộ ố ộ ng mà k t qu  là m t s  âm. CF=1 (CY) vì l nh inc không

ố ươ OF=1 (OV) vì c ng hai s  d ệ ể ự ớ ờ ệ ả ưở ế ộ ươ i c  này. Đ  th c hi n toàn b  ch ả ệ ng trình chúng ta gõ l nh G (Go): ng t nh h

­G Program terminated normally

ể ỏ Đ  thoát kh i Debug, gõ Q (Quit):

­Q C:\>

ả ế ộ ố ệ ườ ỳ ọ ặ ố B ng sau cho bi t m t s  l nh Debug th ng dùng, các tham s  trong ngo c là tu  ch n:

COMMAND

ệ ộ ACTION ướ ạ D (start (end) (range)) Li t kê n i dung các byte d i d ng Hexa

ệ ắ ầ ừ D 100 Li t kê 80h bytes b t đ u t DS:100h

ệ ừ D CS:100 120 Li t kê các bytes t ế  DS:100h đ n DS:1120

ố D (DUMP)

ượ ể ớ ạ ệ ị ể ừ c hi n th  byte cu i cùng đã đ ừ ừ ị  b  trí Start v i các đi m d ng t i addr1, G (=start ) (addr1 ddr2...addrn)

ự ệ ế G ệ t kê 80h bytes t Li ạ Ch y (go) l nh t addr2, ..., addrn ừ Th c thi l nh t ế  CS:IP đ n h t

ự ệ ế G=100 ế Th c thi l nh là CS:100h đ n h t

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ự ệ ạ ừ G=100 150 Th c thi l nh t i CS:100h, d ng l ạ ạ i t i CS:150h

27

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Q Quit debug and return to DOS

ủ ổ ộ R (register)

ờ R R AX t c  các thnah ghi và c ủ

T (=start) (value) Xem/thay đ i n i dung c a thanh ghi ấ ả ộ Xem n i dung t ổ ộ Xem và thay đ i n i dung c a thanh ghi ax ừ ị  v  trí start Quét “value” t

ệ ạ T Trace l nh t i CS:IP

ệ ạ T=100 Trace l nh t i CS:100h

ắ ầ ừ ệ T=100 5 Trace 5 l nh, b t đ u t CS:100h

ắ ầ ừ ệ T 4 Trace 4 l nh b t đ u t CS:IP

ệ ỉ U (start) (value) ị Unassembler vùng đ a ch  thành l nh asm

ừ U CS:100 110 Unassembler t ế  CS:100h đ n CS:110h

ệ ừ U 200 L 20 Unassembler 20 l nh t CS:200h

ừ ượ U Unassembler 32 bytes t ố  byte cu i cùng đ ị ể c hi n th

ữ ư ặ ộ ợ ỉ ị A (start) ỉ ộ ị Đ a vào mã h p ng  cho m t đ a ch  ho c m t vùng đ a ch

ữ ạ ư ợ A Đ a vào mã h p ng  t i CS:IP

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ữ ạ ư ợ A CS:100h Đ a vào mã h p ng  t i CS:100h

28

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ƯƠ

CH

NG 3 CÁC L NH ĐI U KHI N

ươ ệ ầ ượ ườ

ứ ự t các l nh theo th  t ế ề ẽ ự ườ ể ầ ộ

ộ ng trình thông th M t ch ộ ế t ra. Tuy nhiên, trong m t vài tr ầ ng s  th c hi n l n l ả ợ ứ ẽ ể ệ ệ ặ ả

ệ  mà chúng   ầ   ng h p c n ph i chuy n đi u khi n đ n m t ph n ươ   ng trình. Trong ph n này chúng ta s  nghiên c u các l nh nh y và l nh l p có tính ủ ữ ậ ệ ượ c vi đ ủ khác c a ch ế ấ đ n c u trúc c a các l nh này trong ngôn ng  b c cao.

ả ụ ề ệ 3.1. Ví d  v  l nh nh y

ể ư ế ệ ế ươ c l nh nh y làm vi c nh  th  nào chúng ta hãy vi t ch ng trình in ra

ộ ậ ượ ệ Đ  hình dung đ ự màn hình toàn b  t p các ký t ả  IBM:

100h

ữ ự TITLE PGR3­1: IBM CHARACTER DISPLAY .Model Small .Stack .Code Main Proc mov mov mov mov xor ax, @Data ds, ax ah, 2 cx, 256 dl, dl ; Hàm xu t ký t ố ; S  ký t ; dl gi ự ấ ể ự ầ  c n hi n th ủ  mã ASCII c a ký t NUL

; Display character

ế ế ả ; Nh y đ n PRINT_LOOP n u cx<>0 21h dl cx PRINT_LOOP

PRINT_LOOP: int inc dec jnz ; Dos exit mov int ah, 4ch 21h

Main Endp End Main

ề ệ ả Trong ch

ể ỉ ộ ề ị ươ ự ớ ệ ươ ng trình chúng ta đã dùng l nh nh y có đi u ki n (l nh đi u khi n Jump if ấ ể   có   nhãn   đ a   ch   b   nh   là ệ ng   trình   xu t   ký   t ạ i   đo n   ch ở ạ   l

not   zero   (JNZ))   đ   quay   tr PRINT_LOOP.

3.2. Nh y có đi u ki n

ộ ệ ộ ệ ủ ệ ề ệ ề ệ ả ả L nh JNZ là m t l nh nh y có đi u ki n. Cú pháp c a m t l nh nh y có đi u ki n là:

Jxxx destination_label

ề ế ượ ả ự i destination_label s  đ

ệ ủ ệ ả ệ ẽ ượ ố ớ ệ ự ệ ệ   c th c hi n,   c th c hi n. Đ i v i l nh JNZ thì

N u đi u ki n c a l nh đ ề ệ ả ủ ệ ướ ế ệ ạ ả ẽ ượ ệ ế n u đi u ki n không tho  thì l nh ti p theo l nh nh y s  đ ề đi u ki n là k t qu  c a l nh tr c tho  mãn thì l nh t ệ ế ả ằ c nó ph i b ng 0.

ủ ệ ệ ề ạ ả Ph m vi c a l nh nh y có đi u ki n

ấ ủ ệ ế ề ệ ả ầ

C u trúc mã máy c a l nh nh y có đi u ki n yêu c u destination_label đ n (precode) ả ả ệ l nh nh y ph i không quá 126 bytes.

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ộ ệ ự ệ ề ế ể ả ệ Làm th  nào đ  CPU th c  hi n m t l nh nh y có đi u ki n?

29

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ệ ộ ệ ế ả ờ

ả ượ ể ờ ở

ự ệ

ượ ệ ế ẽ ệ ả ề ề   ệ Đ  th c hi n m t l nh nh y có đi u ki n, CPU ph i theo dõi thanh ghi c . N u đi u ộ ổ ợ ẽ ề   ạ  h p tr ng thái các c ) là đúng thì CPU s  đi u ế   ệ ỉ destination_label đ ạ ị c th c hi n. N u i đ a ch   ả ẽ ượ   ổ c

ệ ỉ ề ự ả ể ự ễ ệ c bi u di n b i m t t ki n cho l nh nh y (đ ế destination_lable sao cho l nh t ch nh IP đ n  ệ ả đi u ki n nh y không tho  thì IP s  không thay đ i, nghĩa là l nh ti p theo l nh nh y s  đ ệ th c hi n.

ệ ệ ằ Trong ch

ể ề ng trình trên đây, CPU th c hi n l nh  ượ ể ớ ự c chuy n t ế i PRINT_LOOP. N u ZF=1 thì l nh jnz PRINT_LOOP b ng cách xem xét   ệ mov ah,

ế ẽ ượ ự ệ ươ ờ c  ZF. N u ZF=0, thì đi u khi n đ c th c hi n. 4ch s  đ

ả ượ ệ ề ệ ệ ấ ả ạ ả B ng sau cho th y các l nh nh y có đi u ki n, các l nh nh y đ c chia thành 3 lo i:

(cid:0) ố ớ ế ả ấ ả ấ ị ễ Nh y có d u (dùng cho các di n d ch có d u đ i v i k t qu ).

(cid:0) ố ớ ế ấ ấ ả ả ị ễ Nh y không d u (dùng cho các di n d ch không d u đ i v i k t qu ).

(cid:0) ộ ờ ỉ ả ả ưở ộ ờ Nh y m t c  (dùng cho các thao tác ch   nh h ng lên m t c ).

ể ộ ư ả Opcode. Chúng ta có th  dùng m t trong hai ế   Opcode, nh ng k t

ộ ố ệ ệ ệ ả ự ư M t s  l nh nh y có hai  qu  th c hi n l nh là nh  nhau.

ả ấ

Nh y có d u SYMBOL DESCRITION CONDITION FOR JUMPS

ZF=0 and SF=OF JG/JNLE

SF=OF JGE/JNL

SF<>OF JL/JNGE

ZF=1 or SF<>OF JLE/JNG jump if greater than jump if not less than or equal jump if greater than or equal jupm if not less or equal jump if lees than jump if not greater or equal jump if less than or equal  jump if not greater

ả ệ ề ấ

Nh y có đi u ki n không d u SYMBOL DESCRITION CONDITION FOR JUMPS

CF=0 and ZF=0 JA/JNBE

CF=0 JAE/JNB

CF=1 JB/JNA

CF=1 or ZF=1 JBE/JNA jump if above  jump if not below or equal jump if above or equal  jump if not below jump if below  jump if not above or equal jump if below or equal  jump if not above

ộ ờ ả

Nh y m t c SYMBOL DESCRITION CONDITION FOR JUMPS

ZF=1 JE/JZ

ZF=0 JNE/JNZ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

jump if equal  jump if equal to zero jump if not equal  jump if not zero jump if carry jump if no carry jump if overflow CF=1 CF=0 OF=1 JC JNC JO

30

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

JNO JS JNS JP/JPE JNP/JPO jump if not overflow jump if sign negative jump if nonnegative sign jump if parity even jump if parity odd OF=0 SF=1 SF=0 PF=1 PF=0

ệ L nh CMP (compare)

ả ườ ả ủ ệ ư ề ệ ế ấ Các l nh nh y th ủ   ng l y k t qu  c a l nh Compare nh  là đi u ki n. Cú pháp c a

ệ ệ l nh CMP là:

CMP destination, source

ệ ế ạ ậ ờ ả ẽ ỉ ậ ữ ệ ố L nh này so sánh toán h ng ngu n và toán h ng đích b ng cách tính hi u Destinationn­ ư

ạ ượ ấ ệ ạ ằ ồ ư ậ  mà ch  c p nh t c . Nh  v y, l nh CPU cũng gi ng nh Source, k t qu  s  không đ c c t gi ổ ỉ lênh SUB, ch  khác là trong l nh CMP toán h ng đích không thay đ i.

ứ ệ Gi ả ử ươ  s  ch ng trình ch a các l nh sau:

; Trong đó: ax=7fffh và bx=0001h

cmp jg ax, bx Below

ượ ả c tho  mãn vì ZF=SF=OF=0 do đó jg đ

ế K t qu  c a l nh  ể ượ ả ủ ệ ể cmp ax, bx là 7ffeh. L nh ệ ế ể c chuy n đ n nhãn Below: đi u khi n đ

ề ệ ệ ễ ả ị Di n d ch l nh nh y có đi u ki n

ụ ể ả

ề ệ ấ ề ự ư ế ệ ệ ế ằ ể ệ ự ụ

ả ầ ể ế ạ ờ ờ

ệ ể ể ế ể ệ ả ộ ệ Ví d  trên đây v  l nh CMP cho phép l nh nh y sau nó chuy n đi u khi n đ n nhãn Below. Đây là ví d  cho th y CPU th c hi n l nh nh y nh  th  nào. Chúng th c hi n b ng cách ườ ậ i l p trình không c n quan tâm đ n các c , mà có th  dùng tên xem xét tr ng thái các c . Ng ề ủ c a các l nh nh y đ  chuy n đi u khi n đ n m t nhãn nào đó. Các l nh:

cmp jg ax, bx Below

ế ế ả có nghĩa là n u ax>bx thì nh y đ n nhãn Below.

ượ ế ế ể ứ ệ ệ ả ả ặ c thi ư t k  cho các l nh nh y nh ng l nh nh y có th  đ ng tr ướ   c

ộ ệ ạ ệ M c dù l nh CMP đ ẳ m t l nh khác, ch ng h n:

dec jl ax There

ể ượ ễ ế ề ị ị có nghĩa là n u ax trong di n d ch có giá tr  <0 thì đi u khi n đ ể c chuy n cho There.

ấ ấ ả ả ớ Nh y có d u so v i nh y không d u

ả ộ ệ ấ ươ ứ ả ả ấ

M t l nh nh y có d u t ệ ấ ị

ấ ụ ệ ễ ạ ỳ ụ ộ ộ ả ấ

ủ ử ụ ấ ạ ệ ả

ấ ả ễ ế ế ả ấ ợ

ấ   ớ ộ ệ ng  ng v i m t l nh nh y không d u. Ví d  l nh nh y có d u ấ ja. Vi c s  d ng jg hay ja là tu  thu c vào di n d ch có d u hay ệ ử ụ ả   jg  là l nh nh y không d u   ờ  ệ ả không d u. Theo b ng trên, ta th y các l nh nh y có d u ph  thu c vào tr ng thái c a các c ệ   ờ ộ ụ ZF, SF, OF. Các l nh nh y không d u ph  thu c vào tr ng thái các c  ZF và CF. S  d ng l nh ị ả ử ẳ ẽ ạ nh y không h p lý s  t o ra k t qu  sai. Gi    s  r ng chúng ta di n d ch có d u, n u ax=7fffh và bx=8000h thì các l nh:ệ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

cmp ja ax, bx Below

31

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ự ệ ễ ế ế ấ ả ị ệ   ẽ s  cho k t qu  sai m c dù 7fffh>8000h n u là di n d ch có d u (l nh ja không th c hi n

ượ ấ ị ặ ễ đ c vì 7fffh<8000h trong di n d ch không d u).

ạ ệ ử ụ ụ ể ẽ ấ ệ ả Sau đây chúng ta s  l y ví d  đ  minh ho  vi c s  d ng các l nh nh y.

ả ử ằ ấ ố ế ươ Ví dụ: Gi ứ  s  r ng ax và bx ch a các s  có d u. Vi ạ t đo n ch ể ặ ố ớ   ng trình đ  đ t s  l n

ấ nh t vào cx:

Gi i:ả

ặ mov cmp jle mov cx, ax bx, cx Next cx, bx ; ; bx>cx? ế ụ ; Không thì ti p t c ; Có, đ t bx vào cx

Next:

ệ 3.3. L nh JMP

ủ ệ ệ ệ ề ệ ả L nh Jmp (jump) là l nh nh y không đi u ki n. Cú pháp c a l nh JMP là:

JMP Destination

ớ ệ ạ ộ trong cùng m t đo n v i l nh

JMP. L nh ệ ể ừ ị ộ ệ ế ủ ề ệ JMP để  ủ    v  trí c a

Trong đó Destination là m t nhãn  ắ ả ụ ạ ề ệ ở ả dùng kh c ph c h n ch  c a các l nh nh y có đi u ki n (không quá 126 bytes k  t ệ l nh nh y có đi u ki n).

ạ ươ Ví d :ụ  Chúng ta có đo n ch ng trình sau:

Top:

ế ụ ặ ế ; N u cx>0 thì ti p t c l p

; Thân vòng l pặ cx dec Top jnz ax, bx mov

ượ ướ ệ t quá 126 bytes tr c l nh jnz Top. Có

ứ ả ử  s  thân vòng l p ch a nhi u l nh mà nó v ằ ế ề ệ ệ ạ ể ả ặ Gi i quy t tình tr ng này b ng các l nh sau: th  gi

Top:

ế ụ ặ ế ; N u cx>0 thì ti p t c l p

; Thân vòng l pặ cx dec Bottom jnz Exit jmp

Bottom:

jmp Top

Exit:

mov ax, bx

ữ ấ

3.4. C u trúc c a ngôn ng  c p cao

ể ự ệ ẽ ệ ấ ươ ự ư ả Chúng ta s  dùng các l nh nh y đ  th c hi n các c u trúc t ng t nh  trong ngôn ng ữ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ấ c p cao.

32

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

3.4.1.

C u trúc r  nhánh

ươ ấ Trong ngôn ng  c p cao, c u trúc r  nhánh cho phép m t ch

ữ ấ ỳ ẽ ề ộ ầ ệ ạ ộ

ế   ẽ ng trình r  nhánh đ n ẽ ữ nh ng đo n khác nhau tu  thu c vào các đi u ki n. Trong ph n này chúng ta s  xem xét ba   ấ c u trúc.

ấ 3.4.1.1. C u trúc If ­ Then

ể ễ ư ấ ạ C u trúc If ­ Then có th  di n đ t nh  sau:

If condition is true Then

execute true branch statements

End_if

ệ ố ủ ế ằ ị ị Ví d :ụ  Thay th  giá tr  trên thanh ghi ax b ng giá tr  tuy t đ i c a nó.

ư ậ Thu t toán nh  sau:

If ax<0 then

replace ax by ­ax

End_if

ư ể ậ ằ V y ta có th  mã hoá b ng assembly nh  sau:

End_if ; No, exit

; If ax<0 cmp ax, 0 jnl ; Then neg ax ; Yes, change sign

End_if:

ấ 3.4.1.2. C u trúc If ­ Then ­ Else

ấ ể ễ ư ạ

C u trúc If ­ Then ­ Else có th  di n đ t nh  sau: If condition is true Then execute true branch statements

Else execute false branch statements

End_if

ứ ủ ự ể ị . Hãy hi n th  ra màn hình các ả ử  s  al và bl ch a mã ASCII c a các ký t ứ ự ầ ự Ví dụ: Gi  trên theo th  t tăng d n. ký t

ậ ư

Thu t toán nh  sau: If al<=bl Then Display character in al Else Display character in bl End_if

ậ ể

ư ị ẩ ị ể ; Chu n b  hi n th  ký t

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ằ V y ta có th  mã hoá b ng assembly nh  sau: ự mov ah, 2 ; If al<=bl cmp al, bl jnbe Else ; al<=bl? ; No, display character in bl

33

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

; Then mov dl, al jmp Display Else: mov dl, bl Display: int 21h End_if:

ấ 3.4.1.3. C u trúc If ­ Then ­ Else

ộ ấ ướ ẽ ộ ể test m t thanh ghi

Case là m t c u trúc r  nhánh nhi u h ộ ể ng, có th  dùng đ   ị ụ ể ằ ứ ế ể ộ ộ ề ị hay m t bi n nào đó hay m t bi u th c mà giá tr  c  th  n m trong m t vùng giá tr .

ể ễ ư ạ ấ C u trúc If ­ Then ­ Else có th  di n đ t nh  sau:

Case expression

value_1: Statement_1 value_2: Statement_2 ... value_n: Statement_n

End_Case

Ví d :ụ

ế ế ế ặ ặ ặ N u ax<0 thì đ t ­1 vào bx N u ax=0 thì đ t 0 vào bx N u ax>0 thì đ t 1 voà bx

ậ Thu t toán:

CASE AX < 0 put ­1 in BX = 0 put 0 in BX > 0 put 1 in BX

ư ể ặ Ta có th  cài đ t nh  sau:

; Test ax ; ax<0 ; ax=0 ; ax>0 Negative Zero Positive

; Case ax cmp ax, 0 jl je jg Negative:

mov bx, ­1 jmp End_case

Zero:

; Xor bx, bx

mov bx, 0 jmp End_case

Positive:

mov bx, 1

End_case:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ớ ộ ổ ợ ề ệ ẽ R  nhánh v i m t t h p các đi u ki n

34

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ộ ổ ợ ề ệ ẽ ạ ầ Đôi khi tình tr ng r  nhánh trong các đi u ki n If, Case c n m t t ề    h p các đi u

ệ ướ ạ ki n d i d ng:

Condition_1 AND Condition_2 Condition_1 OR Condition_2

ụ ề ề ệ ọ ự ế ự Ví d  v  đi u ki n And: ộ  Đ c m t ký t và n u nó là ký t hoa thì in nó ra màn

hình.

ậ Thu t toán:

Read a character (into AL) If (‘A’<= character) And (charater <= ‘Z’) Then

display character

End_If

ệ ươ ứ Sau đây là mã l nh t ng  ng:

ự ủ ; Mã c a ký t

; Char>=’A’

; Char<=’Z’

; Read a character mov ah, 1 int  trong al 21h ; If (‘A’<= character) And (charater <= ‘Z’) cmp al, ‘A’ jnge End_If ; No, exit cmp al, ‘Z’ jnle End_If ; No, exit ; Then display mov dl, al mov ah, 2 21h Int

End_If:

ụ ề ề ệ ế ự ặ Ví d  v  đi u ki n OR: đó là ‘Y’ ho c ‘y’

ệ ế bàn phím, n u ký t ươ thì hi n nó lên màn hình, ng ọ ộ ự ừ  Đ c m t ký t  t ượ ạ i thì k t thúc ch c l ng trình.

ậ Thu t toán:

Read a charcter (into AL) If (character =‘Y’) OR (character=‘y’) Then

dispplay it

Else

terminate the program

End_If

ươ ứ ng  ng:

; Character in al

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ệ Sau đây là mã l nh t ; Read a character mov ah, 1 int 21h ; If (character =‘y’) OR (charater = ‘Y’) cmp al, ’y’ je Then cmp al, ’Y’ ; Char=‘y’? ; Yes, goto display it ; Char=‘Y’?

35

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

je Then jmp Else ; Yes, goto display it ; No, terminate

Then:

mov dl, al mov ah, 2 int 21h jmp End_If

Else:

mov ah, 4ch int 21h

End_If:

3.4.2.

C u trúc l p

ề ệ ặ ộ ượ ặ ặ ạ ố ầ ặ ệ ề ộ ồ M t vòng l p g m nhi u l nh đ c l p đi l p l ụ i, s  l n l p ph  thu c đi u ki n.

3.4.2.1. Vòng For

ể ự ủ ệ ể ệ ệ ặ L nh LOOP có th  dùng đ  th c hi n vòng l p FOR. Cú pháp c a l nh LOOP

ư nh  sau:

LOOP Destination_label

ệ ẽ ự L nh s  th c hi n l p l ể ừ Destination_label đ n l nh

ệ ặ ạ ủ ố ế

ị ủ ệ ự ả ộ ị c th c hi n thì cx s  t

ẽ ự ộ ệ ệ ự ệ ế ặ

ế ệ LOOP  ượ   ầ c ế    đ ng gi m đi 1. N u ệ c th c hi n ti p t c. N u cx=0 thì l nh ngay sau l nh LOOP   ể ượ ượ ệ ự ự ư ệ ạ ệ i đo n l nh k  t ặ Destination_label. S  đ m c a vòng l p là giá tr  c a thanh ghi cx mà ban đ u nó đ ượ gán m t giá tr  nào đó. Khi l nh LOOP đ ế ụ cx<>0 thì vòng l p đ ượ đ c th c hi n. Dùng l nh LOOP cho vòng FOR có th  đ ệ c th c hi n nh  sau:

ị ố ầ ặ ; Gán giá tr  s  l n l p cho cx

Top:

; Thân vòng l pặ loop Top

ặ ấ ộ Ví d :ụ  Dùng vòng l p in ra 80 d u ‘*’ trên m t dòng nàm hình

ị ự mov cx, 80 mov ah, 2 mov dl, ‘*’ ứ ố ầ ặ ; cx ch a s  l n l p ự ể ; Hàm hi n th  ký t ứ ; dl ch a ký t *

Top:

ặ ầ int 21h loop Top ; L p 80 l n

ầ ằ ư ệ ự ệ ấ

ầ ứ

ộ ầ ế ướ ạ ệ ặ c dùng tr ự ả ượ jcxz (Jump if cx is zero) ph i đ

ể ệ ư C n chú ý r ng vòng For cũng nh  l nh Loop th c hi n ít nh t là m t l n. Do đó ặ ẽ ế n u ban đ u cx==0 thì vòng l p s  làm cho cx=0ffffh, t c là th c hi n l p đ n 65535 ệ ầ c vòng l n. Đ  tránh tình tr ng này, l nh  ặ jcxz có cú pháp nh  sau: l p. L nh

JCXZ Destination_label

ế ề ệ ể c chuy n cho ẽ Destination_label. Các l nh sau đây s

N u cx=0, đi u khi n đ ả ể ự ượ ệ ế ặ ả đ m b o vòng l p không th c hi n n u cx=0.

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

jcxz Skip

36

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Top:

; Thân vòng l pặ loop Top

Skip:

3.4.2.2. Vòng WHILE

ự ụ ệ ệ ề ề ế ộ ệ   Vòng While ph  thu c vào m t đi u ki n. N u đi u ki n đúng thì th c hi n

ự ế ệ ệ ề ậ ộ ả vòng While. Vì v y n u đi u ki n sai thì vòng While không th c hi n gì c .

ể ế ệ ạ ố ậ ừ Ví d :ụ  Vi t đo n mã l nh đ  đ m s  ký t ự ượ  đ c nh p vào t ế    bàn phím cho đ n

ấ ế khi  n phím Enter.

dx, dx

ố ộ ể ế ; dx đ  đ m s  ký t ọ ; Hàm đ c m t ký t ằ ầ ự , ban đ u b ng 0 ự ừ  t  bàn phím

xor mov ah, 1 21h int

While:

End_While dx 21h ự ả  CR ; Đúng, thoát ; Không, tăng dx lên 1 ự ọ ; Đ c ký t

cmp al, 0dh ; Có ph i ký t je inc int jmp While

End_While:

3.4.2.3. Vòng REPEAT

ủ ư ấ ặ C u trúc c a vòng l p Repeat nh  sau:

Repeat

statements

Until condition

ệ ề ồ ờ ượ Trong c u trúc Repeat, m nh đ  đ c thi hành đ ng th i đi u ki n đ ể   c ki m

ệ ặ ấ ệ ế ề ề ượ ế tra. N u đi u ki n đúng thì vòng l p k t thúc.

ế ể ọ ệ ạ ự ế ặ Ví dụ: Vi t đo n mã l nh đ  đ c vào các ký t cho đ n khi g p ký t ự ố    tr ng

(space bar):

ộ mov a, 1 ọ ; Hàm đ c m t ký t ự ừ  t bàn phím

Repeat:

ự ọ ượ  đ c đ c trong al 21h ; Ký t

ủ ự ố tr ng (cmp al, ‘ ‘)

int ;Until cmp al, 20h ; 20h là mã c a ký t jne Repeat

ủ ỳ

Vi c s  d ng Repeat thay cho While là tu  theo ch  quan c a m i ng ườ ủ ự

ể ấ ằ ự ả ế ệ ầ ườ   ỗ ệ ử ụ i ấ   ệ ợ ng h p. Tuy nhiên, có th  th y r ng vòng Repeat ph i th c hi n ít nh t ề   ừ ầ  đ u đi u

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ộ ầ ệ ị L u ý:ư ề trong nhi u tr ể m t l n, trong khi đó vòng While có th  không th c hi n l n nào n u ngay t ki n đã b  sai.

37

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ớ ấ

3.5. L p trình v i c u trúc c p cao

ứ ự ố

ế t ch ự ế  vi ộ ươ ng trình nh c ng t hoa đ u tiên và ký t ươ ẽ Bài toán: Vi ế ti p theo, in ra ký t ườ ng i dùng gõ vào m t ký t ầ ự ườ  th ng thì ch ườ ả ộ i dùng gõ vào m t dòng văn b n. Trên hai dòng   ế   ự ế t hoa cu i cùng theo th  t  alphabetical. N u  vi ng trình s  thông báo: ‘No capitals’.

ả ạ ế ươ ư ầ K t qu  ch y ch ng trình yêu c u nh  sau:

Type a line of text: TRUONG DAi HOC KTCN First capital = A Last capital = U

ể ả ậ ậ ỹ Đ  gi i bài toán này ta dùng k  thu t phân tích là l p trình Top­Down, nghĩa là chia nh ỏ

ỏ ơ ư ể ề ỏ bài toán thành nhi u bài toán nh . Có th  chia bài toán trên thành 3 bài toán nh  h n nh  sau:

ự ườ ậ (thông báo cho ng ự i dùng nh p dòng ký t )

ể ọ ả

ỗ ị ộ (1) Hi n th  m t chu i ký t ộ ỗ ử (2) Đ c và x  lý chu i m t dòng văn b n. ả ế (3) In k t qu .

ướ ướ ư ể ệ ắ ấ B c 1: Hi n d u nh c. B c này có th  mã hoá nh  sau:

ể ỉ ị

ấ ể ị mov lea int ah, 9 dx, Prompt 21h ỗ ể ; Hàm hi n th  chu i ỗ ầ ị ; L y đ a ch  chu i c n hi n th ỗ ; Hi n th  chu i

ạ ữ ệ ư ể ấ ắ D u nh c có th  mã hoá trong đo n d  li u nh  sau:

Promptdb ‘Type a line of text: ‘, 0dh, 0ah, ‘$’

ướ ử ả ọ B c 2: ộ  Đ c và x  lý m t dòng văn b n

ướ ệ ủ ươ ự ệ ọ

ự ỗ ườ ự ầ ế B c này th c hi n h u h t công vi c c a ch ắ ự ầ  cu i, nh c nh  ng  đ u và ký t  bàn phím, tìm ra ký t ồ ng trình, bao g m: đ c các ký t ế ở i dùng n u ký t ậ   ự  nh p    gõ vào không

ự ừ vào t ả ph i là ký t hoa.

ể ể ễ ướ ằ ậ Có th  bi u di n b c này b ng thu t toán sau:

Read a character While character is not a carriage return Do

If character is a capital (*) Then

If character precedes first capital Then first capital=character

End_If If character follows last character Then last character=character

End_If

End_if Read a character

End_While

ể ệ ề ự ệ Trong đó: (*) có nghĩa là đi u ki n đ  ký t ề  là hoa là đi u ki n And:

If (‘A’<= character) And (character <= ‘Z’)

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ướ ư ể B c 2 có th  mã hoá nh  sau:

38

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

mov int ah, 1 21h ọ ; Đ c m t ký t ; Ký t ự ộ ự ọ ượ  đ c đ c trong al

While:

ự ự ệ ả gõ vào không ph i là CR thì th c hi n

; Char=CR? ; Yes, thoát

al, 0dh End_While  là hoa

ự ế ả hoa thì nh y đ n End_If

ự ế ả ự al, ‘A’ End_If al, ‘Z’ End_If ;Char>=’A’ ả ; Không ph i ký t ; Char<=’Z’ ả ; Không ph i ký t hoa thì nh y đ n End_If

ế ướ ầ ự n m tr sau ‘Z’)

ự ằ al, First Check_last ự ế  vi First, al ị c bi n First (giá tr  ban đ u là ‘[‘: ký t ; Char= ầ t hoa đ u tiên = ký t ; First = character (al)

; Trong khi ký t cmp je ế ; N u ký t cmp jnge cmp jnle ; Thì ế ; N u ký t cmp jnl ; Thì ký t mov ; End if

ế ầ ị  là sau bi n Last (giá tr  ban đ u là ‘@’: ký t ự ướ  tr c ‘A’)

; Char>Last ; <=

ự cu i cùng = ký t

ự al, Last End_If ự ố Last, al ; Last = character

Check_last: ế ; N u ký t cmp jng ; Thì ký t mov ; End if

End_If:

ự ọ

ộ 21h

; Đ c m t ký t int jmp While ự ; Ký t ặ ạ ; L p l trong al i

End_While:

ạ ữ ệ ư c đ nh nghĩa nh  sau trong đo n d  li u:

Các bi n First và Last đ First Last ‘[$’ ‘@$’ ế db db ượ ị ự ; ‘[‘ là ký t ; ‘@’ là ký t sau ‘Z’ ự ướ  tr c ‘A’

ướ ả B c 3: In k t quế

ư ậ Thu t toán nh  sau:

If no capital were typed Then

display ‘No capital’

Else

display first capital and last capital

End_If

ướ ẽ ả B c 3 s  ph i in ra các thông báo:

ữ ả

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ế ữ ữ ầ ố NOCAP_MSG: n u không ph i ch  in. CAP1_MSG: ch  in đ u tiên CAP2_MSG: ch  in cu i cùng

39

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ượ ị ạ ữ ệ ư Chúng đ c đ nh nghĩa trong đo n d  li u nh  sau:

Nocap_msg Cap1_msg First Cap2_msg Last db db db db db 0dh, 0ah, ‘No capitals $’ 0dh, 0ah, ‘First capital= ’ ‘[ $ ’ 0dh, 0ah, ‘Last capital=’ ‘@ $’

ướ ư ể B c 3 có th  mã hoá nh  sau:

ỗ ả ah, 9

ữ ị ; Hàm hi n th  chu i ký t ậ ượ ể ự c nh p thì First=’[‘

ả First, ‘[‘ Caps ; First=’[‘? ; Không, in k t quế

; In k t quế mov ; If không có ch  hoa nào đ cmp jne ; Then lea int dx, Nocap_msg 21h

Caps:

dx, Cap1_msg 21h dx, Cap2_msg 21h

lea int lea int ; End_If

ươ ể ế Ch ng trình có th  vi ư t nh  sau:

100h

TITLE PGM3­1: FIRST AND LAST CAPITALS .Model Small .Stack .Data

Promptdb Nocap_msg Cap1_msg First Cap2_msg Last ‘Type a line of text: ‘, 0dh, 0ah, ‘$’ db db db db db 0dh, 0ah, ‘No capitals $’ 0dh, 0ah, ‘First capital= ’ ‘[ $ ’ 0dh, 0ah, ‘Last capital=’ ‘@ $’

.Code Main Proc

ở ạ ạ ữ ệ

ỉ ể ị

ấ ể ; Option ỗ ể ; Hàm hi n th  chu i ỗ ầ ị ; L y đ a ch  chu i c n hi n th ỗ ; Hi n th  chu i

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

; Kh i t o đo n d  li u (ds) mov mov mov mov lea int ộ ọ ; Đ c và x  lý m t dòng văn b n mov int ax, @Data ds, ax es, ax ah, 9 dx, Prompt 21h ử ah, 1 21h ị ả ộ ự ự ọ ượ  đ c đ ọ ; Đ c m t ký t ; Ký t c trong al

40

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

While:

ự ự ệ ả gõ vào không ph i là CR thì th c hi n

; Yes, thoát

al, 0dh ; Char = CR? End_While  là hoa

ả ế ả hoa thì nh y đ n End_If

;Char>=’A’ ự ; Char<=’Z’ ự ả ế ả ự al, ‘A’ End_If ; Không ph i ký t al, ‘Z’ End_If ; Không ph i ký t hoa thì nh y đ n End_If

ế ướ ầ ự n m tr sau ‘Z’)

ự ằ al, First Check_last ự ế  vi First, al ị c bi n First (giá tr  ban đ u là ‘[‘: ký t ; Char= ầ t hoa đ u tiên = ký t ; First = character (al)

; Trong khi ký t cmp je ế ; N u ký t cmp jnge cmp jnle ; Thì ế ; N u ký t cmp jnl ; Thì ký t mov ; End if

ế ầ ị  là sau bi n Last (giá tr  ban đ u là ‘@’: ký t ự ướ  tr c ‘A’)

; Char>Last ; <=

ự cu i cùng = ký t

ự al, Last End_If ự ố Last, al ; Last = character

Check_last: ế ; N u ký t cmp jng ; Thì ký t mov ; End if

End_If:

ự ọ

ộ 21h

; Đ c m t ký t int jmp While ự ; Ký t ặ ạ ; L p l trong al i

End_While:

ỗ ả ah, 9

ữ ị ; Hàm hi n th  chu i ký t ậ ượ ự ể c nh p thì First=’[‘

ả First, ‘[‘ Caps ; First=’[‘? ; Không, in k t quế

; In k t quế mov ; If không có ch  hoa nào đ cmp jne ; Then lea int dx, Nocap_msg 21h

Caps:

dx, Cap1_msg 21h dx, Cap2_msg 21h

ở ề

lea int lea int ; End_If ; DOS exit mov int ah, 4ch 21h ; Hàm tr  v  DOS ề ; V  DOS

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Main Endp

41

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

End Main

42

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ƯƠ

CH

NG 4 CÁC L NH LOGIC, D CH VÀ QUAY

ể ươ Trong ch

ả ộ

ể ệ ườ  d  li u. Kh  năng qu n lý đ n t ng bit th ữ ẫ ẽ ộ ừ ữ ệ ừ ả ạ ợ ổ ừ   ng này chúng ta s  xem xét các l nh mà chúng ta có th  dùng đ  thay đ i t ng ặ ế ừ   ng là không có trong ấ   i sao h p ng  v n đóng vai trò quan C) và đây là ký do gi ả i thích t

ậ ọ bit trên m t byte ho c m t t ữ các ngôn ng  cao c p (t tr ng trong khi l p trình.

4.1. Các l nh logic

ể ể ặ Chúng ta có th  dùng các l nh logic đ  thay đ i t ng bit trên byte ho c trên m t t d

ổ ừ ạ ể ệ ộ

ộ ừ ữ  ệ ụ ặ ụ c áp d ng cho toán h ng 8 ho c 16 bit thì có th  áp d ng phép   ượ ế ừ ể ả ố c k t qu  cu i cùng. ượ li u. Khi m t phép toán logic đ toán logic đó trên t ng bit đ  thu đ

ự ệ Ví d :ụ  Th c hi n các phép toán sau:

1. 10101010 AND 1111 0000 2. 10101010 OR 1111 0000 3. 10101010 XOR 1111 0000 4. NOT 10101010

Gi i:ả

1. 1010 1010 AND 1111 0000        = 1010 0000 1010 1010 2. OR 1111 0000        = 1111 1010 3. 1010 1010 XOR 1111 0000        = 0101 1010 4. NOT 1010 1010        = 0101 0101

4.1.1.

L nh And, Or và Xor

ọ ủ ư ự ệ ứ Các l nh And, Or và Xor th c hi n các ch c năng đúng nh  tên g i c a nó. Cú pháp

ệ ủ c a chúng là:

AND OR XOR Destination, Source Destination, Source Destination, Source

ữ ả ạ c l u tr

ượ ư K t qu  c a l nh đ ồ ố ằ ể ặ ặ ớ ị

ế ớ ạ ớ ả ủ ệ  trong toán h ng đích, do đó chúng ph i là thanh ghi ằ ạ ho c ô nh . Toán h ng ngu n có th  là h ng s , h ng giá tr , thanh ghi ho c ô nh . Dĩ nhiên, ượ c phép. hai toán h ng cùng là ô nh  thì không đ

Ả ưở ế nh h ờ ng đ n các c :

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

(cid:0) ờ ế ả (cid:0) ị (cid:0) ả Các c : SF, ZF và PF ph n ánh k t qu . AF không xác đ nh. CF=OF=0.

43

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ể ự ể ạ ồ ố

ổ ừ ị ặ ạ ủ ể ấ

ặ   Đ  thay đ i t ng bit theo ý mu n chúng ta xây d ng toán h ng ngu n theo ki u m t ử ụ ạ   n  (mask). Đ  xác đ nh m t n , chúng ta s  d ng các tính ch t sau c a các phép toán And, Or và Xor:

a AND 1 = a; a AND 0 = 0; a OR 0 = a; a OR 1 = 1; a XOR 0 = a a XOR 1 = not a

(cid:0) ệ ể ể ế ạ ị ươ ứ   ng  ng

L nh And có th  dùng đ  xoá (clear) toán h ng đích n u v  trí bit t ặ ạ trên m t n  = 0.

(cid:0) ệ ể ặ ế ạ ị ươ ứ   ng  ng

ể L nh Or có th  dùng đ  đ t (set) 1 cho toán h ng đích n u v  trí bit t ặ ạ trên m t n  = 1.

(cid:0) ể ể ấ ế ạ ả ị

ệ ể ộ ộ

ặ ạ  ệ L nh Xor có th  dùng đ  l y đ o toán h ng đích n u các v  trí trên m t n ớ   ể ằ b ng 1. L nh này cũng có th  dùng đ  xoá n i dung m t thanh ghi (Xor v i chính nó).

ấ ủ ổ

Ví d :ụ  Xoá bit d u c a al trong khi các bit khác không thay đ i. ặ ạ ớ

ủ ấ ấ i:ả  Dùng l nh And v i m t n  là 0111 1111 = 7fh ; Xoá bit d u (d u +) c a al ệ al, 7fh Gi And

ủ ổ Ví d :ụ  Set 1 cho các bit MSB và LSB c a al, các bits khác không thay đ i.

ệ ớ i:ả  Dùng l nh Or v i m t n  là 1000 0001 = 81h

Gi Or ặ ạ al, 81h ; Set 1 cho MSB và LSB c a alủ

ấ ủ ổ Ví d :ụ  Thay đ i bit d u c a dx

ặ ạ ệ ớ i:ả  Dùng l nh Xor v i m t n  1000 0000 0000 0000 = 8000h

Gi Xor dx, 8000h

ệ ặ ệ ụ ự ệ Các l nh logic là đ c bi ệ t có ích khi th c hi n các nhi m v  sau:

ổ ộ ự ố ướ ạ ị ố Đ i m t ký t s  d i d ng mã ASCII thành giá tr  s  đó

ả ử ằ ủ s  r ng chúng ta đ c đ ộ c m t ký t ự ừ  t

Gi ứ ằ ự ủ ế , đi u này cũng đúng n u ký t

ọ ượ ề ự ố

ệ ệ ả ắ  bàn phím b ng hàm 1 c a ng t 21h. Khi ự ố ộ  s  (digital  đó là m t ký t đó al ch a mã ASCII c a ký t ị ể ứ ụ ế character). Ví d , n u chúng ta gõ s  5 thì al=35h (ASCII code for ‘5’). Đ  ch a giá tr  5 trên ự al chúng ta ph i th c hi n l nh sau:

sub al, 30h

ủ ử ệ ệ ể ể Có m t cách khác đ  làm vi c này là dùng l nh And đ  xoá n a cao c a al (high

ủ ộ nibble = 4 bits cao) c a al:

and al, 0fh

ự ừ ể ổ ọ Vì các ký t ‘0’­‘9’ có mã ASCII t 30h­39h, nên cách này dùng đ  đ i m i ký t ự ố   s

ASCII ra giá tr .ị

ươ ữ ổ ợ ượ ư ộ Ch ộ ố ậ ng trình h p ng  đ i m t s  th p phân thành mã ASCII đ c xem nh  m t bài

t p.ậ

ữ ườ ổ ữ Đ i ch  th ng thành ch  hoa

ự ừ ừ ủ Mã ASCII c a các ký t A­Z là t a­z là t ng t

ả ử ứ hoa t ủ ể ổ s  dl ch a mã ASCII c a ký t ừ ự ườ  th ự ườ  th  41h­5ah và các ký t ự ng, đ  đ i nó thành ký t ừ  ệ    hoa ta dùng l nh

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

61h­7ah. Gi sau:

44

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

sub dl, 20h

ủ ứ ị ự ng và ký t ấ    hoa thì th y

ế N u chúng ta so sánh mã nh  phân t ỉ ầ ẽ ổ ứ ự ằ r ng ch  c n xoá bit th  5 thì s  đ i ký t ươ ự ườ  th ng  ng c a ký t ng sang ký t ự ườ  th  hoa.

Code

Character a b ... z Code (61h) 0110 0001 (62h) 0110 0010 ... (7ah) 0111 1010 Character A B ... Z (41h) 0100 0001 (42h) 0100 0010 ... (5ah) 0101 1010

ặ ạ ủ ứ ệ ể ằ ớ Có th  xoá bit th  5 c a dl b ng cách dùng l nh And v i m t n  là 1001 1111 (=

0dfh).

ự and dl, 0dfh ổ ; Đ i ký t ự ườ  th ng trong dl sang ký t hoa

ộ Xoá m t thanh ghi

ể ệ ể Chúng ta có th  dùng l nh sau đ  xoá thanh ghi ax:

ax, 0

ax, ax

mov ho c:ặ sub xorax, ax

ứ ấ ầ ỉ ầ ư ệ ệ ệ ả   L nh th  nh t c n 3 bytes trong khi 2 l nh sau ch  c n 2 bytes. Nh ng l nh Mov ph i

ượ ể ộ đ ớ c dùng đ  xoá m t ô nh .

ộ ể ằ Ki m tra m t thanh ghi có b ng 0?

Thay cho l nh:ệ

cmp ax, 0

ệ ể ta có th  dùng l nh:

or cx, cx

ổ ờ ế ằ ể ể đ  ki m tra xem cx có b ng 0 hay không vì nó làm thay đ i c  ZF (ZF=0 n u cx=0).

4.1.2.

L nh NOT

ể ấ ệ ạ ả L nh NOT dùng đ  l y bù 1 (đ o) toán h ng đích. Cú pháp là:

NOT Destination

ị ả ưở ở ệ ờ Không có c  nào b   nh h ng b i l nh NOT.

ủ ấ Ví dụ: L y bù 1 c a thanh ghi ax

Not ax

4.1.3.

L nh TEST

ệ ữ ự ệ ạ ạ ồ

ủ ệ ụ ả

ổ ủ ệ ế ờ ạ ậ ư   L nh TEST th c hi n phép And gi a toán h ng đích và toán h ng ngu n nh ng ể ậ   ạ ư không l u k t qu  (không làm thay đ i toán h ng đích). M c đích c a l nh TEST là đ  c p nh t các c  tr ng thái. Cú pháp c a l nh TEST là:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

TEST Destination, Source

45

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ưở ủ ệ ờ ị ả Các c  b   nh h ng c a l nh TEST:

(cid:0) ế (cid:0)

(cid:0) ả ả SF, ZF và PF ph n ánh k t qu . ị AF không xác đ nh. CF=OF=0.

ặ ạ ể ả ạ ộ ộ

ệ ạ ị ả ủ ệ ể ầ ằ ứ   ể ể L nh TEST có th  dùng đ  ki m tra m t bit trên m t toán h ng. M t n  ph i ch a ế i v  trí c n ki m tra, các bit khác b ng 0. K t qu  c a l nh: bit 1 t

TEST Destination, mask

ứ ể ầ ạ ạ ế   i bit test. N u

ứ ế ạ ế ư ạ ẽ s  là khác 0 (1 t i bit c n ki m tra) n u nh  toán h ng đích ch a 1 t ả ẽ ằ ạ i bit test thì k t qu  s  b ng 0 và do đó ZF=1. toán h ng đích ch a 0 t

ả ớ ộ ố ẵ ế Ví d :ụ  Nh y t i nhãn Below n u al là m t s  ch n.

ố ẵ ứ ằ ố Gi i:ả  S  ch n là s  có bit th  0 b ng 0.

ố ẵ ả test jz al, 1 Below ; al là s  ch n? ế ; Đúng, nh y đ n nhãn Below

ệ 4.2. L nh SHIFT

ị ệ ẽ ị ộ ị

ặ ị ệ ị

ị ừ ộ ầ ủ ạ ề  ch : các bits b  d ch ra (trong l nh d ch) s  m t đ u c a toán h ng s  đ

ị ế ố ớ ệ ủ ị ạ ặ   L nh d ch và quay s  d ch các bit trên toán h ng đích m t ho c nhi u v  trí sang trái ho c ệ ẽ  ở ỗ ủ ệ ả ị sang ph i. Khác nhau c a l nh d ch và l nh quay là  ị ấ ẽ ượ ư   ị ố ớ ệ c đ a b  m t. Trong khi đó đ i v i l nh quay, các bits b  d ch ra t ở ạ ầ t đ i v i l nh d ch và quay: tr  l i đ u kia c a nó. Có hai cách vi

OPCODE OPCODE Destination, 1 ; (1) Destination, cl ; (2)

ứ ế Trong cách vi

ứ ố ầ ớ ể ộ ộ

ể   ạ ị t th  hai, thanh ghi cl ch a s  l n d ch hay quay. Toán h ng đích có th  là ệ ườ ị ặ ng dùng đ  nhân   ị ạ ộ ậ ố ị ặ m t thanh ghi 8 bits ho c 16 bits, ho c m t ô nh . Các l nh d ch và quay th ấ ượ và chia các s  nh  phân. Chúng cũng đ c dùng cho các ho t đ ng nh p/xu t nh  phân và hexa.

4.2.1.

L nh d ch trái (Left Shift)

ủ ệ ư ệ ạ ị L nh SHL d ch toán h ng đích sang trái. Cú pháp c a l nh nh  sau:

ứ ị ị SHL SHL Destination, 1 ; D ch trái Destination 1 bit Destination, cl ; D ch trái Destination N bits (cl ch a N)

ứ ỗ ầ ộ ị ượ C  m i l n d ch trái, m t bit 0 đ c thêm vào LSB

ưở ờ ị ả Các c  b   nh h ng:

(cid:0) ế ả ả SF, PF, ZF ph n ánh k t qu .

(cid:0) ố ượ ị CF = bit cu i cùng đ c d ch ra.

(cid:0) ế ế ả ầ ố ị ổ ấ OF = 1 n u k t qu  thay đ i d u vào l n d ch cu i cùng.

(cid:0) ị AF không xác đ nh.

ả ử ệ ệ ị ủ ự ỏ Ví dụ: Gi s  dh=8ah, cl=3. H i giá tr  c a dh và CF sau khi th c hi n l nh:

ế shl dh, cl ả K t qu : dh=0101 0000 = 50h, CF=0

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ệ ằ Nhân b ng l nh SHL

46

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ế ố ị

ệ ị ứ ế ả ộ

ự Chúng ta hãy xét s  235 (decimal). N u th c hi n d ch trái 235 m t bit và thêm  bit 0   ệ   ng  ng v i vi c ớ ả ố ớ ố ớ ộ ị ộ ớ ẽ ươ vào bên ph i thì k t qu  là 2350. Nói cách khác, khi d ch trái m t bit s  t ị chúng ta nhân v i 10. Đ i v i s  nh  phân, khi d ch trái m t bit có nghĩa là nhân nó v i 2.

Ví d :ụ  al=00000101=5d

ệ ệ ự ế shl al, 1 shl al, cl ; al=00001010=10d ; N u cl=2 thì al=20d sau khi th c hi n l nh

ố ọ ệ ị L nh d ch trái s  h c (SAL ­ Shift Arithmetic Left)

ớ ệ ố ể ộ

ệ L nh SHL có th  dùng đ  nhân m t toán h ng v i h  s  2. Tuy nhiên trong tr ườ ể ấ ạ ố i ta mu n nh n m nh đ n tính ch t s  h c c a phép toán thì l nh SAL s  đ

ạ ấ ố ọ ủ ộ ệ ộ ố ế ệ ề ạ ế ả ườ   ng ẽ ượ   c ể

ằ ị ợ h p ng dùng thay th  cho SHL. C  hai l nh đ u t o ra cùng m t mã máy. M t s  âm cũng có th ượ đ c nhân 2 b ng cách d ch trái.

ế ầ ị Ví d :ụ  n u ax=0ffffh=­1 thì sau khi d ch trái 3 l n: ax=0fff8h=­8

Tràn

ị ố ớ ệ ể ả ự ể

ộ ầ ệ ả ấ ấ

ả ế ả ở ị ị

ề ầ ờ ề ầ ả ế ộ ầ ự ế ế ầ ậ ỉ

ố ị ị Khi chúng ta dùng l nh d ch trái đ  nhân thì có th  x y ra s  tràn. Đ i v i l nh d ch   ờ  ự trái m t l n, CF và OF ph n ánh chính xác s  tràn d u và tràn không d u. Truy nhiên các c ấ   ẽ s  không ph n ánh chính xác k t qu  n u d ch trái nhi u l n b i vì d ch nhi u l n th c ch t ả  ị ỗ ộ là m t chu i các l n d ch m t l n liên ti p và vì v y các c  CF và OF ch  ph n ánh k t qu ủ ầ c a l n d ch cu i cùng.

Ví d :ụ  bl=80h, cl=2

ự ế ặ ấ ả ả shl bl, cl ẽ s  làm cho CF=OF=0 m c dù trên th c t ấ  đã x y ra c  tràn d u và tràn không d u.

ế ạ ớ ả ử ằ Ví d :ụ  Vi t đo n mã nhân ax v i 8. Gi s  r ng không có tràn.

ị cl, 3

mov shl ax, cl ố ầ ; S  l n d ch = 3 ; ax*8

4.2.2.

ả L nh d ch ph i (Right Shift)

ệ ả ạ ặ ầ ị L nh SHR d ch ph i toán h ng đích đi 1 ho c N l n

ứ ả ả ị ị SHR SHR Destination, 1 ; D ch ph i Destination 1 bit Destination, cl ; D ch ph i Destination N bits (cl ch a N)

ứ ỗ ầ ị ượ C  m i l n d ch, bit 0 đ c thêm vào MSB.

ưở ư ố ớ ệ ố ờ ị ả Các c  b   nh h ng gi ng nh  đ i v i l nh SHL.

ả ử Ví d :ụ  Gi s  dh=8ah, cl=2

ế shr dh, cl ả K t qu : dh=22h, CF=1

ạ ộ ư ệ ư ố ị ỉ

Cũng nh  l nh SAL, l nh SAR (d ch ph i s  h c) ho t đ ng gi ng nh  SHR, ch  có ề ệ ữ ẫ ộ ị ả ố ọ ữ ấ ị  nguyên giá tr  (bit d u gi nguyên) sau khi d ch. m t đi u khác là MSB v n gi

ằ ị ả ệ Chia b ng l nh d ch ph i

ệ ị ủ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ố ớ ố ẻ ệ ả ẽ ị ả ẽ ề ố ầ ấ ố ị Còn đ i v i s  l ẵ   ố ớ ố ạ L nh d ch ph i s  chia 2 giá tr  c a toán h ng đích. Đi u này đúng đ i v i s  ch n. , l nh d ch ph i s  chia 2 và làm tròn xu ng s  nguyên g n nó nh t.

47

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ế ả ị Ví d :ụ  N u bl=0000 0101=5 thì khi d ch ph i bl đi 1 bit, bl=0000 0010=2.

ấ ấ Chia có d u và không d u

ệ ể ự ệ ằ ả ả ị

ệ Đ  th c hi n phép chia b ng l nh d ch ph i, chúng ta ph i phân bi ế ế ễ ệ ố

ữ ấ ữ ố ấ   t gi a s  có d u ị ễ ấ ấ   và s  không d u. N u di n d ch là không d u thì dùng l nh SHR, còn n u di n d ch là có ấ d u thì dùng SAR (bit d u gi ị  nguyên).

ả ể ệ ấ ố ị ươ Ví d :ụ  Dùng l nh d ch ph i đ  chia s  không d u 55143 cho 4. Th ố ặ ng s  đ t trên

ax:

mov mov shr ax, 65143 cl, 2 ax, cl

ế ế ệ ệ ự ị Ví d :ụ  N u al=­15, cho bi t giá tr  al sau khi th c hi n l nh

al, 1

ệ ệ ự sar Gi i:ả  al=­15=1111 0001, sau khi th c hi n l nh trên ta có al=1111 1000=­8.

4.3. L nh quay (Rotate)

ẽ ượ ế ằ   c thay th  b ng

ẽ Quay trái (rotate to left) ­ ROL s  quay các bits sang trái, LSB s  đ ư ủ MSB, còn CF=MSB. Cú pháp c a ROL nh  sau:

ROL Destination, 1 ROL  Destination, cl

ẽ ượ ả ả ẽ Quay ph i (rotate to right) ­ ROR s  quay các bits sang ph i, MSB s  đ ằ   c thay b ng

ủ ư LSB, còn CF=LSB. Cú pháp c a ROR nh  sau:

ROR Destination, 1 ROR Destination, cl

ệ ứ ị

ụ ổ ộ ả ặ ể ộ

Trong các l nh quay trái và quay ph i, CF ch a bit b  quay ra ngoài. Ví d  sau đây cho ủ   ấ th y cách ki m tra các bits trên m t byte ho c moot word mà không làm thay đ i n i dung c a nó.

ổ ộ ể ế ủ ố ế   Ví d :ụ  Dùng ROL đ  đ m s  bits 1 trên bx mà không làm thay đ i n i dung c a nó. K t

ả ấ qu  c t trên ax.

Gi i:ả

ố ầ ặ ệ ị xor mov ax, ax cx, 16 ; Xoá thanh ghi ax ; S  l n l p cho vi c d ch 1 word

Top:

ế ặ ố

rol jnc inc bx, 1 Next ax ; CF = bit quay ra ế ả ; N u CF=0 thì nh y đ n cu i vòng l p ượ ạ i (CF=1), tăng ax c l ; Ng

Next:

loop Top

ệ ờ ố

ư ệ ủ ệ ớ ẵ ớ ữ ủ ờ

Quay trái qua c  nh  (rotate through carry to left) ­ RCL. L nh này gi ng nh  l nh ROL, ỉ ch  khác là c  nh  n m gi a MSB và LSB trong vòng kín c a các bits. Cú pháp c a l nh RCL ư nh  sau:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

RCL Destination, 1

48

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

RCL Destination, cl

ả ệ ớ ố

ờ ớ ằ ữ ủ ờ

ỉ ư ư ệ   Quay ph i qua c  nh  (rotate through carry to right) ­ RCR. L nh này gi ng nh  l nh ủ ệ   ROR, ch  khác là c  nh  n m gi a MSB và LSB trong vòng kín c a các bits. Cú pháp c a l nh RCR nh  sau:

RCR Destination, 1 RCR Destination, cl

ả ử ệ ệ ị ủ ự Ví d :ụ  Gi s  dh=8ah, CF=1 và cl=3. Tìm giá tr  c a dh, CF sau khi th c hi n l nh:

rcr dh, cl.

Gi i:ả

ầ L n quay ị Giá tr  ban đ u Sau khi quay l n 1ầ Sau khi quay l n 2ầ Sau khi quay l n 3ầ CF 1 0 1 0 dh 1000 1010 1100 0101 0110 0010 1011 0001=b1h

Ả ưở ủ ệ nh h ờ ng c a l nh lên các c :

ế ượ ị ả ổ ấ ế ế ầ ố ả ả SF, PF và ZF ph n ánh k t qu . ố CF=bit cu i cùng đ c d ch ra. OF=1 n u k t qu  đ i d u vào l n quay cu i cùng.

Ứ ụ ả ượ ặ ộ ộ ng d ng: Đ o ng c các bits trên m t byte ho c m t word.

ả ượ Ví dụ: al=1010 1111, thì sau khi đ o ng c: al=1111 1010.

ể ặ ầ ể

ệ ệ ự ệ ạ ể ị Có th  l p 8 l n công vi c sau, dùng SHL đ  d ch bit MSB ra CF, sau đó dùng RCR đ ư ư đ a nó vào bl. Đo n mã th c hi n công vi c này nh  sau:

mov cx, 8 ố ầ ặ ; S  l n l p Reverse:

ị ư ; D ch MSB ra CF ; Đ a CD (MSB) và bl

ứ ả shl al, 1 RCR bl, 1 loop Reverse mov al, bl ; al ch a các bits đã đ o ng ượ c

ấ ố ị 4.4. Nh p/xu t s  nh  phân và s  Hexa

ệ ườ ượ ử ụ ạ ộ ấ ố ậ ị ị Các l nh d ch và quay th ng đ c s  d ng trong các ho t đ ng nh p/xu t s  nh  phân

ố và s  hexa.

ậ ố

4.4.1.

Nh p s  nh  phân

ậ ộ ố ố Gi

ả ử ầ ỗ ộ ấ ổ ị ỗ ế ộ ừ  gõ vào ph i đ

ế ả ượ ậ ộ ố ẽ ọ ồ ị  ị  ị

ấ bàn phím, k t thúc khi  n phím Enter. S  nh phân là m t chu i các bits 0 và 1. M i ký t c bi n đ i thành m t bits giá tr ặ ỹ (0 ho c 1) r i tích lu  chúng trong thanh m t thanh ghi. Thu t toán sau đây s  đ c m t s  nh ừ phân t s  c n nh p m t s  nh  phân t ự ộ  bàn phím và c t nó trên thanh ghi bx.

Clear bx Input a character (‘0’ or ‘1’) While character<>CR Do

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Convert character to binary value Left shift bx

49

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Insert a character

End_While

ư ự ệ ậ ạ Đo n mã th c hi n thu t toán trên nh  sau:

; Xoá thanh ghi bx

ah, 1 21h ộ ọ ; Hàm đ c m t ký t ự ọ ượ  đ c đ ; Ký t ự c trên al

xorbx, bx mov int While:

ự ừ

ế

al, 0dh ; Ký t End_While al, 0fh ậ  v a nh p = CR? ; Đúng, k t thúc ; Không, convert to binary value

ặ ị ; Đ t giá tr  vào bx

bl, al 21h

cmp je and shl bx, 1 or int End_While:

ấ ố

4.4.2.

Xu t s  nh  phân

ả ử ầ ấ ố ể ế ậ ị Gi s  c n xu t s  nh  phân trên thanh ghi bx. Thu t toán có th  vi ư t nh  sau:

For 16 times Do

Rotate left bx (put MSB into CF) If CF=1 Then

output ‘1’

Else

output ‘0’

End_If

End_For

ư ộ ự ệ ậ ậ ạ Đo n mã th c hi n thu t toán trên coi nh  m t bài t p.

ậ ố

4.4.3.

Nh p s  Hexa

ồ ế ả Nh p s  hexa bao g m các s  t 0 đ n 9 và các ký t ự ừ  t ứ   ế  a­f (A­F). K t qu  ch a

ả ậ ố ể ơ trong bx. Đ  đ n gi n, chúng ta gi ố ừ ả ử ằ  s  r ng:

(cid:0) ỉ ượ Ch  có ký t ự ườ  th ng đ c dùng.

(cid:0) ườ ậ ự Ng i dùng nh p vào không quá 4 ký t hexa.

ư ậ Thu t toán nh  sau:

Clear bx Input character While character<>CR Do

Convert character to binary value (4 bit) Left shift 4 times Insert value into lower 4 bits of bx Input character

End_While

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ể ế ạ Đo n mã có th  vi ư t nh  sau:

50

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

cl, 4 ah, 1 ; Clear bx ; Counter for 4 shift ; Input character

21h ; Input a chracter al

xorbx, bx mov mov ; Function int While:

; Character <>CR? ; Yes, exit

; a character? ; No, a letter

al, 0dh cmp End_While Je ; Convert character to binary value al, 39h cmp Letter jg ; input is a digit and jmp al, 0fh Shift ; convert digit to binary value ; go to insert bx

al, 37h ; convert letter to binary value Letter: sub

Shift:

; make room for new value

; put value into low 4 bits of bx ; input a character

bl, al 21h While

shl bx, cl ; insert value into bx or int jmp End_While:

ấ ố Xu t s  Hexa

ể Đ  xu t s  Hexa trên bx (4 digits hexa) có th  b t đ u t ể    4 bits bên trái, chuy n

ấ ố ộ ố ư ể ậ ồ ể ắ ầ ừ ị chúng thành m t s  hex r i hi n th  ra màn hình. Thu t toán nh  sau:

For 4 times Do

move bh to dl Shift dl 4 times to right If dl<10 Then

convert to character in ‘0’ ...’9’

Else

convert to character in ‘A’..’F’

ủ ắ

End_If output character (Hàm 2 c a ng t 21h) rotate bx left 4 times

End_For

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ư ộ ầ ậ ậ Ph n code cho thu t toán này xem nh  m t bài t p.

51

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ƯƠ

Ủ Ụ

CH

Ế NG 5 NGĂN X P VÀ TH  T C

ế ạ ươ ể ấ ữ ạ Đo n ngăn x p (stack segment) trong ch t m th i s

ị ươ ng trình đ ẽ ng này chúng ta s  xem xét cách t ờ ố  ượ c dùng đ  c t gi ể ự   ử ụ ổ ứ  ch c stack và s  d ng nó đ  th c

ệ ệ ỉ li u và đ a ch . Trong ch ủ ụ hi n các th  t c (procedure).

5.1. Ngăn x pế

ữ ệ ố ệ ề ề ấ ộ Ngăn x p là c u trúc d  li u m t chi u. Đi u đó có nghĩa là s  li u đ

ị ượ ư ế ạ ắ ạ ầ i đ u cu i c a stack theo nguyên t c LIFO (Last In First Out). V  trí t ấ   c đ a vào và l y ố ệ   i đó s  li u

ố ủ ọ ủ ế ấ ỏ ra kh i stack t ỉ ượ ư c đ a vào hay l y ra g i là đ nh c a ngăn x p (top of stack). đ

ể ồ ẽ ằ Có th  hình dung stack nh  m t ch ng đĩa, chi c đĩa đ c đ a vào sau cùng s  n m t ạ   i

ủ ấ ồ ư ộ ế ế ẽ ượ ấ ướ ỉ đ nh c a ch ng đĩa. Khi l y ra thì chi c đĩa trên cùng s  đ ượ ư c l y ra tr c.

ươ ỉ ẫ ế ả ộ ớ ộ M t ch ng trình ph i dành ra m t vùng nh  cho ngăn x p. Chúng ta dùng ch  d n:

.Stack 100h

ướ ể đ  khai báo kích th c vùng stack là 256 bytes.

ươ ượ ạ ớ ộ ị Khi ch ng trình đ ẽ ứ ị   c d ch và n p vào b  nh , thanh ghi ss (stack segment) s  ch a đ a

ẽ ứ ị ỉ ủ ỉ ạ ủ ế ỉ ch  đo n c a stack. Còn sp (stack pointer) s  ch a đ a ch  c a đ nh ngăn x p.

ề ậ ị 100h trên đây, sp nh n giá tr  100. Đi u này có nghĩa là stack

Trong khai báo: .Stack ỗ ố tr ng r ng.

Hình v :ẽ

5.1.1.

L nh PUSH và PUSHF

ầ ử ể ộ ệ ớ Đ  thêm m t ph n t (word) m i vào stack, chúng ta dùng l nh:

ư ặ ộ ộ ớ Source ; Đ a m t thanh ghi ho c m t word nh  vào stack PUSH

Ví d :ụ

push ax

ệ ượ ự ệ Khi l nh trên đ c th c hi n thì:

(cid:0) ỉ ấ ủ ộ ể ớ ả ề sp gi m đi 2 (stack phát tri n v  phía đ a ch  th p c a b  nh ).

ồ ượ ể ế ỉ ị ị (cid:0) M t b n copy c a toán h ng ngu n đ ủ c chuy n đ n đ a ch  ss:sp, còn toán

ồ ạ ộ ả ổ ạ h ng ngu n không thay đ i.

ể ấ ộ ệ ạ ờ L nh PUSHF không có toán h ng, nó dùng đ  c t n i dung thanh ghi c  vào stack.

Hình v :ẽ

5.1.2.

L nh POP và POPF

ể ấ ố ệ ạ ỉ ệ ỏ Đ  l y s  li u t i đ nh stack ra kh i stack, chúng ta dùng l nh:

ấ ố ệ ạ ỉ POP Destination ; L y s  li u t i đ nh stack ra Destination

ể ặ ộ ớ Destination có th  là m t thanh ghi ho c word nh .

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Ví d :ụ

52

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ấ ố ệ ạ ỉ ế pop bx ; L y s  li u t i đ nh ngăn x p ra thanh ghi bx

ệ ệ ự Khi th c hi n l nh POP:

(cid:0) ộ ủ ỉ ỉ ị ượ ế c sao chép đ n đích. (cid:0) N i dung c a đ nh stack (đ a ch  ss:sp) đ sp tăng thêm 2.

ẽ ấ ư ệ ỉ ờ L nh POPF s  l y đ nh stack đ a vào thanh ghi c .

ệ ớ ộ ộ ệ ạ ỉ ậ    Các l nh PUSH và POP ch  làm vi c v i toán h ng có đ  r ng 2 bytes. Vì v y

ệ L u ý:ư các l nh sau:

push push dl 2

là không h p l ợ ệ .

ứ ữ ố ệ ư ườ ử ụ ng trình do ng i s  d ng vi

ỉ ủ ữ ạ ị ể ư ở ệ ề ượ ủ ươ Ngoài ch c năng l u tr  s  li u và đ a ch  c a ch c dùng b i h  đi u hành đ  l u tr ươ  tr ng thái c a ch ế   t,   ng trình chính khi có

stack còn đ ng t.ắ

5.2.

ng d ng c a stack

ượ ấ

ậ ự ư ắ i v i tr t t ỏ c l y ra kh i stack có ng đ   ộ   ẽ ọ ng trình sau đây s  đ c m t

ố ượ ở ệ ủ B i vì nguyên t c làm vi c c a stack là LIFO nên các đ i t ượ ươ ượ ạ ớ ậ ự c l tr t t c đ a vào stack. Ch  mà chúng đ  ng ớ ớ ậ ự ượ ạ ự ồ ỗ i.  ng chu i ký t ộ  r i in chúng trên m t dòng m i v i tr t t c l

ậ ươ ư Thu t toán cho ch ng trình nh  sau:

Display a ‘?’ Initialize count to 0 Read a character While character is not CR Do

Push chracter onto stack Incremet count Read a character

End_While Goto a new line For count times Do

Pop a chracter from the stack Display it ;

End_For

ươ Sau đâu là ch ng trình:

100h

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ể TITLE PGM5­1: REVERSE INPUT .Model Small .Stack .Code Main Proc mov mov mov mov ax, @Data ds, ax ah, 2 dl, ‘?’ ở ạ ạ ữ ệ ; Kh i t o đo n d  li u ị ộ ự ể ; Hàm hi n th  m t ký t ắ ị ấ ; Hi n th  d u nh c

53

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

21h cx, cx ah, 1 21h ự c trong al

int ế ế ; Xoá bi n đ m cx xor ộ ọ ; Hàm đ c m t ký t mov ự ọ ượ  đ c đ int ; Ký t ả ; Trong khi character không ph i là CR

While:

ế

ọ ; C t al vào stack ế ; và tăng bi n đ m ự ộ ; Đ c m t ký t al, 0dh End_While ax cx 21h

cmp je push inc int jmp While

End_While:

ế ự ượ ; Thoát n u cx=0 (không có ký t nào đ ậ c nh p)

ớ ; Xu ng dòng m i ah, 2 mov dl, 0dh mov 21h int dl, 0ah mov 21h int Exit jcxz ầ ặ ; L p cx l n

Top:

stack

ự ừ ấ ; L y ký t  t ị ể ; Hi n th  nó

dx 21h Top

pop int loop ; End_For

Exit:

ở ề

mov int ah, 4ch 21h ; Hàm tr  v  DOS ề ; V  DOS

Main Endp End Main

ề ươ ng trình: Vì ký t t vì v y dùng thanh ghi cx đ

i thích thêm v  ch ự ậ ự ậ  nh p là không bi ự ể ậ ứ ự ượ ạ ấ nh p. cx cũng dùng cho vòng  For đ  xu t các ký t c l

ả ẩ ư ả ấ

ủ ộ ọ ự ở trên dl, sau đó g i ng t ể  ặ   i. M c dù  ng ệ   , chúng ta dùng l nh ắ int 21h để

ể ấ ự ể ị ả ế Gi ố ế đ m s  ký t  theo th  t ự ự ỉ ký t  ch  trong al nh ng ph i đ y c  thanh ghi ax vào stack. Khi xu t ký t pop dx đ  l y n i dung trên stack ra. Mã ASCII c a ký t hi n th  ký t .

ủ ụ

5.3. Th  t c (procedure)

ưở ế ậ ng l p trình top­down. Ý t

Trong ch ộ ng 3 chúng ta đã đ  c p đ n ý t ỷ ượ ỗ

ưở ề ậ c chia thành các bài toán con, m i bài toán con l ủ ơ ỗ ỏ ơ ế ế

ế ươ nghĩa là m t bia toán nguyên thu  đ ượ đ ả gi ng này có ể  ạ i có th ể  ả c chia ti p thành các bài toán nh  h n, chia cho đ n khi m i bài toán con là đ  đ n gi n đ i quy t.

ườ ấ ữ ậ Trong các ngôn ng  l p trình c p cao ng ng dùng các ch i ta th

ng trình con đ  gi ộ ươ ư ậ ế

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ườ ư ậ ủ ụ ợ ữ ủ ụ ọ ể ượ ủ ụ ữ ự ằ ợ ộ quy t các bài toán con và chúng ta cũng làm nh  v y trong h p ng . Nh  v y là m t ch trình h p ng  có th  đ ể ả   i ươ   ng ẽ ứ   c xây d ng b ng các th  t c. M t th  t c g i là th  t c chính s  ch a

54

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ủ ế ủ ươ ọ

ể ự ể ọ ủ ụ ọ ộ ệ ng trình. Đ  th c hi n m t công vi c nào đó, th  t c chính g i (Call)   ủ

ủ ụ ủ ụ ủ ụ ọ ủ ụ ượ ọ ẽ ả ề ệ ộ n i dung ch  y u c a ch ộ ủ ụ ộ m t th  t c con. Th  t c con cũng có th  g i m t th  t c con khác. Khi th  t c con g i m t th ể ụ t c con khác, th  t c đ ộ ủ ụ c g i s  tr  đi u khi n (return control) cho th  t c g i nó.

ủ ế Trong ngôn ng  c p cao, l p trình viên không bi

t và không th  bi ữ ể ế ơ ấ ủ ụ ậ ủ ụ ủ ụ ể

ả ề ể ấ ữ ơ ấ ữ ệ   ữ ấ t c  c u c a vi c ư ể   chuy n và tr  đi u khi n gi a th  t c chính và th  t c con (hãy gi a các th  t c), nh ng trong ợ h p ng  có th  th y rõ c  c u này (xem 5.4).

ủ ệ ủ ụ ư ạ ộ ủ ụ Cú pháp c a l nh t o m t th  t c nh  sau: Khai báo th  t c:

Name Proc type

; body of procedure ret

Name Endp

Trong  đó:

(cid:0) ườ ậ ự ị ủ ụ ủ Name do ng i l p trình t đ nh nghĩa, là tên c a th  t c.

(cid:0) ể ặ ể Type có th  là NEAR (có th  không khai báo) ho c FAR.

(cid:0) ủ ụ ủ ụ ạ ớ ọ   ộ c g i n m trong cùng m t đo n v i th  t c g i.

ượ ẽ ỉ ọ ằ ả ủ ụ ầ NEAR có nghĩa là th  t c đ Trong ph n này chúng ta s  ch  mô t th  t c NEAR.

(cid:0) ủ ụ ọ ả ế ấ ả ụ ể ở ret tr  đi u khi n cho th  t c g i. T t c  các thru t c ph i k t thúc b i ret

ừ ủ ụ L nh ệ ả ề tr  th  t c chính.

ủ ụ ể ườ ọ ễ ể ủ ụ ườ ườ i đ c d  hi u th  t c, ng i ta th ử ụ   ng s  d ng

Chú thích cho th  t c: Đ  ng ủ ụ ướ ạ i d ng sau: chú thích cho th  t c d

ả ủ ụ ệ ; Mô t các công vi c mà th  t c thi hành.

ả ố ươ ; Input: Mô t các thám s  có tham gia trong ch ng trình.

ế ế ủ ụ ả ; Output: Cho bi t k t qu  sau khi thi hành th  t c.

ệ ủ ụ ọ ; Uses: Li t kê sanh sách các th  t c mà nó g i.

ủ ụ ở ề ẽ ọ Hình v  5­1: G i th  t c và tr  v

5.4. Call và Return

ệ ượ ọ ự ế ể ọ ủ ụ ủ ụ ọ ộ ộ L nh Call đ c dùng đ  g i m t th  t c. Cso hai cách g i m t th  t c là g i tr c ti p và

ế ọ g i gián ti p.

ủ ụ ; G i tr c ti p th  t c có thên là Name ủ ụ ọ ự ế ế ọ Call Name Call Address_expression ; G i gián ti p th  t c.

ộ ị ặ ớ ộ ị ỉ ứ ị   Trong đó: Address_expression ch  đ nh m t thanh ghi ho c m t v  trí nh  mà nó ch a đ a

ủ ụ ỉ ủ ch  c a th  t c.

ệ ượ Khi l nh Call đ c thi hành thì:

(cid:0) ủ ụ ọ ượ ấ ị ủ   ỉ c c t vào stack. Đ a ch  này chính là offset c a

ỉ ế ệ ề ủ ị Đ a ch  quay v  c a th  t c g i đ ệ l nh ti p theo sau l nh Call.

(cid:0) ị ủ ệ ủ ụ ủ ầ ỉ ượ ọ ề   c g i, có nghĩa là đi u

ể ấ IP l y đ a ch  offset c a l nh đ u tiên c a th  t c đ ủ ụ ể ượ khi n đ ế c chuy n đ n th  t c.

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ể ả ề ủ ụ ể ệ Đ  tr  đi u khi n cho th  t c chính, l nh:

55

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ret pop_value

ượ ử ụ ố ớ ủ ụ ệ đ

c s  d ng. pop_value (m t s  nguyên N) là tu  ch n. Đ i v i th  t c NEAR, l nh ret ị ỳ ọ ộ ố ư ộ ố ế ẽ ấ s  l y giá tr  trong SP và đ a vào IP. N u pop_value là m t s  N thì IP=SP+N.

ườ ỉ ở ề ứ ợ ị ươ ề ọ ng h p thì CS:IP ch a đ a ch  tr v  ch ể   ng trình g i và đi u khi n

ượ ẽ ọ ả Trong c  hai tr ươ ả c tr  cho ch đ ng trình g i (xem hình v  5­2).

ẽ Hình v  5­2:

ụ ề ủ ụ 5.5. Ví d  v  th  t c

ươ ố ươ ủ ằ ậ t ch ng trình tính tích c a hai s  d ộ   ng A và B b ng thu t toán c ng Chúng ta s  vi

ẽ ế ị (ADD) và d ch (SHIFT).

ư ậ Thu t toán nh  sau:

Product = 0 Repeat

If lsb of B is 1 Then

product=product+A

End_If shift left A shift right B

Until B=0

ươ ủ ụ ẽ Trong ch ng trình sau đây chúng ta s  mã hoá th  t c nhân v i tên là Multiply. Ch ươ   ng

ể ấ ấ ậ ớ ậ trình chính không có nh p/xu t, thay vào đó chúng ta dùng Debug đ  nh p/xu t:

100h

ạ ữ ệ ở ạ ; Kh i t o đo n d  li u

ax, @Data ds, ax ệ ặ

TITLE PGM5­1: MULTIPLICATION BY ADD AND SHIFT .Model Small .Stack .Code Main Proc mov mov ằ ự ; Th c hi n b ng Debug: Đ t a=ax, b=bx call Multiply ; dx ch a k t qu mov int ứ ế ah, 4ch 21h ề ; V  DOS

Main Endp

Proc

ả ị

ứ ế ả Multiply ; Input:ax=a, bx=b, ax và bx có giá tr  trong kho ng 0..0ffh ; Output:

dx ch a k t qu  a*b ax bx dx, dx push push xor

Repeat:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ủ ế ; N u LSB c a B=1

56

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

; LSB=1?

bx, 1 End_if

dx, ax ; dx=dx+ax test jz ; Thì add

End_if:

ị ị ; D ch trái ax 1 bit ả ; D ch ph i bx 1 bit

i bx i ax

ấ ạ ấ ạ ả ề ể ươ ax, 1 shl bx, 1 shr ế ; Cho đ n khi bx=0 Repeat jnz bx pop ax pop ret ; L y l ; L y l ; Tr  đi u khi n cho ch ng trình chính

Multiply Endp

End Main

ị ươ ử ể ể ấ ằ ạ ng trình, có th  dùng Debug đ  ch y th  nó b ng cách cung c p giá tr ị

ầ Sau khi d ch ch ban đ u cho ax và bx.

ớ ươ ủ ệ ộ ộ ứ ệ ớ ể Dùng l nh U (Unassembler) đ  xem n i dung c a b  nh  t ợ   ng  ng v i các l nh h p

ng .ữ

ể ệ ằ ộ Có th  xem n i dung stack b ng l nh D (Dump):

ủ D ss:f0ff ; Xem 16 byte trên cùng c a stack

ể ạ ừ ệ ệ ừ Dùng l nh G (Go) offset đ  ch y t ng nhóm l nh t ệ  CS:IP hi n hành:

CS: offset

ư ặ ạ Trong quá trình ch y Debug, có th  ki m tra n i dung các thanh ghi. L u ý đ c bi ệ ế   t đ n

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ả ề ủ ụ ể ể ệ ể ộ ể ể ọ ộ ự IP đ  xem cách chuy n và tr  đi u khi n khi g i và th c hi n m t th  t c.

57

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ƯƠ

CH

NG 6 L NH NHÂN VÀ CHIA

ươ ể ể ị

ươ ệ ế ế ẽ Trong ch ớ ệ ố v i h  s  2. Trong ch ng 5 chúng ta đã nói đ n các l nh d ch mà chúng có th  dùng đ  nhân và chia ộ ố ấ ỳ ệ ng này chúng ta s  nói đ n các l nh nhân và chia m t s  b t k .

ử ấ ấ ố

ố ớ ố Quá trình x  lý c a l nh nhân và chia đ i v i s  có d u và s  không d u là khác nhau do ệ ủ ệ ệ ấ ấ đó có l nh nhân có d u và l nh nhân không d u.

ộ ự ứ ụ ệ

ữ M t trong nh ng  ng d ng th ươ ậ ấ ườ ấ ủ ệ ng này, chúng ta s  vi

ậ ừ ạ ộ ế ị ề ấ ạ ậ ấ ậ tác nh p/xu t th p phân. Trong ch ượ ử ụ mà chúng đ ẽ ế c s  d ng nhi u trong các ho t đ ng xu t nh p t ng dùng nh t c a l nh nhân và chia là th c hi n các thao ậ ủ ụ t th  t c cho nh p/xu t th p phân  thi t b  ngo i vi.

6.1. L nh MUL và IMUL

ấ ấ Nhân không d u và nhân có d u

ị ả ượ ấ ấ ố ố Trong phép nhân nh  phân s  không d u và s  có d u ph i đ c phân bi

ộ ị ố ố

ố ủ ễ ị

ấ ệ t m t cách rõ ễ ràng.  Ví d :ụ  chúng ta mu n nhân hai s  8 bit 1000 0000 và 1111 1111. Trong di n d ch không ấ d u, chúng là 128 và 255, tích s  c a chúng là 32640 = 0111 1111 1000 0000b. Trong di n d ch ủ có d u, chúng là ­128 và ­1, do đó tích c a chúng là 128 = 0000 0000 1000 0000b.

ệ ế ế ấ ẫ ấ ả Vì nhân không d u và có d u d n đ n các k t qu  khác nhau nên có 2 l nh nhân:

MUL (Multiply): nhân không d u.ấ IMUL (Integer Multiply): nhân có d u.ấ

ệ ế ạ ạ ặ ượ Các l nh này nhân hai toán h ng byte ho c word. N u hai toán h ng byte đ

ượ ớ ế ế ả ạ ộ c nhân v i nhau thì k t qu ớ   c nhân v i ả  ế

ủ ộ nhau thì k t qu  là m t word (16 bits). N u hai toán h ng word đ là m t double word (32 bits). Cú pháp c a chúng là:

MUL IMUL Source ; Source ;

ạ ặ ớ ồ ượ Toán h ng ngu n là thanh ghi ho c ô nh , không đ ố ộ ằ c là m t h ng s .

ể Phép nhân ki u byte:

ố ớ ể ạ Đ i v i phép nhân mà toán h ng là ki u byte thì: ax=al*Source

ể ừ Phép nhân ki u t :

ố ớ ể ừ ạ Đ i v i phép nhân mà toán h ng là ki u t thì: dxax=ax*Source

Ả ưở ủ ệ nh h ờ ng c a các l nh nhân lên các c :

(cid:0) ị SF, ZF, AF, PF: Không xác đ nh.

(cid:0) ệ ủ ế ế ả ặ Sau l nh MUL: CF/OF =0 n u byte cao (ho c word cao) c a k t qu  = 0.

ườ ợ =1 trong các tr ng h p khác.

(cid:0) ệ ặ ủ ế ả =0 n u byte cao (ho c word cao) c a k t qu  có bit

ấ ủ ế ấ ư ấ ặ ố Sau l nh IMUL: CF/OF ấ d u gi ng nh  bit d u c a byte th p (ho c word th p).

ườ ợ =1 trong các tr ng h p khác.

Các ví d :ụ

ả ử ằ Ví d  1:ụ  Gi s  r ng ax=1 và bx=0ffffh

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

INSTRUCTION Dec product Hex Product DX AX CF/OF

58

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

MUL BX IMUL BX 65535 ­1 0000FFFF FFFFFFFF 0000 FFFF FFFF FFFF 0 0

ả ử Ví d  2:ụ  Gi s  ax=0ffffh và bx=0ffffh

INSTRUCTION MUL BX IMUL BX Dec product 4294836225 1 Hex Product FFFE0001 00000001 DX FFFE 00000 AX 0001 0001 CF/OF 1 0

ả ử ằ Ví d  3:ụ  Gi s  r ng ax=0fffh

INSTRUCTION MUL AX IMUL AX Dec product 16769025 16769025 Hex Product 00FFE001 00FFE001 DX 00FF 00FF AX E001 E001 CF/OF 1 1

ả ử ằ Ví d  4:ụ  Gi s  r ng ax=0100h và cx=0ffffh

INSTRUCTION  MUL CX  IMUL CX Dec product  16776960  ­256 Hex Product  00FFFF00  FFFFFF00 DX  00FF  FFFF AX  FF00  FF00 CF/OF  1  0

ả ử ằ Ví d  5:ụ  Gi s  r ng al=80h và bl=0ffh

INSTRUCTION  MUL BL  IMUL BL Dec product  128  128 Hex Product  7F80  0080 AH  7F  00 AL  80  80 CF/OF  1  1

ả ủ ệ

ơ

6.2.

ng d ng đ n gi n c a l nh MUL và IMUL

ạ ệ ử ụ ộ ố ẽ ấ ụ ệ Sau đây chúng ta s  l y m t s  ví d  minh ho  vi c s  d ng l nh MUL và IMUL trong

ươ ch ng trình.

ể ệ ữ ấ ữ ợ Ví d  1:ụ  Chuy n l nh sau trong ngôn ng  c p cao thành mã h p ng : a=5*a­12*b.

ư ạ Gi i:ả  Đo n mã nh  sau:

mov imul mov mov imul sub ax, 5 a a, ax ax, 12 b a, ax ; ax=5 ; ax=5*a ; a=5*a ; ax=12 ; ax=12*b ; a=5*a­12*b

ủ ụ ế ộ ố ươ ủ ụ ả t th  t c Factorial đ  tính n! cho m t s  nguyên d ứ   ng. Th  t c ph i ch a n

ả ử Ví d  2:ụ  Vi ả ề trên cx và tr  v  n! trân ax. Gi ể  s  không có tràn.

ủ ị Gi i:ả  Đ nh nghĩa c a n! là:

n!

ế ế =1 n u n=1 =n*(n­1)*(n­1)*...*1 n u n>1

ư ậ ậ V y, thu t toán tính n! nh  sau:

Product =1 Term = n For n times Do

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Product = Product*Term Term=Term­1

59

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

End_for

ư ạ ệ Và đo n mã l nh nh  sau:

Factorial Proc

; ax=1 ; cx=n ; Computes n! ; Input: cx=n ; Output: ax=n! mov mov ax, 1 cx, n

Top:

; Product=Product*Term

cx Top

mul loop ret

Factorial Endp

6.3. L nh DIV và IDIV

ư ệ ệ ấ ấ ố ố

Cũng nh  l nh nhân, có hai l nh chia: DIV và IDIV cho s  không d u và s  có d u. Cú ủ pháp c a chúng là:

DIV Divisor IDIV Divisor

ạ Toán h ng byte

ệ ố ị ạ ố

ố ở ươ ặ ớ ộ ộ L nh chia toán h ng byte s  chia s  b  chia 16 bits (sividend) trên ax cho s  chia (divisor)   ố ư trên al còn s  d ng s

ẽ là 1 byte. Divisor pahri là m t thanh ghi 8 bits ho c m t byte nh . Th trên ah.

ạ Toán h ng word

ệ ố ị ẽ ạ

ươ ả ặ ớ ộ ộ L nh chia toán h ng word s  chia s  b  chia 32 bits (dividend) trên dxax cho s  chia ố ở ố ng s

ộ ố ư (divisor) là m t word. Divisor ph i là m t thanh ghi 16 bits ho c m t word nh . Th trên ax còn s  d  trên dx.

Ả ưở ờ ạ ủ ờ ị nh h ng c a các c : Các c  tr ng thái không xác đ nh.

Divide Overflow:

ự ứ ể ế ế ặ

ế ố ệ ệ ớ ố ị ườ ẽ ề ấ ợ Khi th c hi n phép chia, k t qu  có th  không ch a h t trên al ho c ax n u s  chia bé ng h p này trên màn hình s  xu t hi n thông báo:

ả ơ ấ h n r t nhi u so v i s  b  chia. Trong tr “Divide overflow”.

ả ử Ví d  1:ụ  Gi s  dx=0000h, ax=0005h và bx=0002h

INSTRUCTION DIV BX  IDIV BX Dec Quotient  2  2 Dec Remainder  1  1 AX  0002  0002 DX  0001  0001

ả ử Ví d  2:ụ  Gi s  dx=0000h, ax=0005h và bx=0fffeh

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

INSTRUCTION DIV BX  IDIV BX Dec Quotient  0  ­2 Dec Remainder  5  1 AX  0000  FFFE DX  0005  0001

60

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ả ử Ví d  3:ụ  Gi s  dx=0ffffhh, ax=0fffbh và bx=0002h

Dec Remainder  ­1 AX  FFFE DX  FFFF

INSTRUCTION IDIV BX  DIV BX Dec Quotient  ­2  OVERFLOW

ả ử Ví d  3:ụ  Gi s  dx=0ffffhh, ax=0fffbh và bx=0002h

Dec Remainder  251 AX  FB DX  00

INSTRUCTION DIV BL  IDIV BL Dec Quotient  0  OVERFLOW

ấ ủ ố ị

ở ộ

6.4. M  r ng d u c a s  b  chia

ớ ạ Phép chia v i toán h ng word

ố ị ố ị ặ ả Trong phép chia v i toán h ng word, s  b  chia pahri đ t trên dxax ngay c  khi s  b  chia

ể ặ ạ ợ ườ ư ử ầ ạ ớ có th  đ t trên ax. Trong tr ng h p này, c n pahir s a so n nh  sau:

(cid:0) ố ớ ệ ả ị Đ i v i l nh DIV, dx ph i b  xoá.

(cid:0) ấ ủ ở ộ ố ớ ệ ệ c m  r ng d u c a ax. L nh CWD (Convert Word

ả ượ ệ ệ Đ i v i l nh IDIV, dx ph i đ ẽ ự to Doubleword) s  th c hi n vi c này.

Ví d :ụ  Chia ­1259 cho 7.

ax, ­1250

ố ư ế ả mov cwd mov idiv bx, 7 bx ; ax=­1250 ấ ủ ở ộ ; M  r ng d u c a ax vào dx ; bx=7 ; Chia dxax cho bx, k t qu  trên ax, s  d  trên dx

ớ ạ Phép chia v i toán h ng byte

ố ị ả ạ Trong phép chia v i toán h ng byte, s  b  chia ph i đ t trên ax ngay c  khi s  b  chia có

ả ặ ư ầ ạ ợ ể ặ ố ị ớ ả ử ườ ng h p này, c n ph i s a so n nh  sau: th  đ t trên al. Trong tr

(cid:0) ố ớ ệ ả ị Đ i v i l nh DIV, ah ph i b  xoá.

(cid:0) ố ớ ệ ở ộ ả ấ ệ c m  r ng d u c u al. L nh CBW (Convert Byte

ẽ ự ệ ệ ả ượ Đ i v i l nh IDIV, ah ph i đ to Word) s  th c hi n vi c này.

ộ ố ế ấ Ví d :ụ  Chia m t s  có h u trong bi n byte xbyte cho ­7

ữ ố ị al, xbyte

ở ộ

ố ư ế mov cbw mov idiv bl, ­7 bl ; al gi  s  b  chia ấ ủ ; M  r ng d u c a al vào ah ; bl=­7 ả ; Chia ax cho bl, k t qu  trên al, s  d  trên ah

ị ả ưở ở ệ ờ Không có c  nào b   nh h ng b i l nh CWD và CBW.

ấ ố ậ

ủ ụ

6.5. Th  t c nh p/xu t s  th p phân

ướ ạ ệ

ượ t c  s  li u đ ơ c bi u di n d ườ ầ ể ễ ẽ ế i dùng. Trong ph n này chúng ta s  vi ễ   ư i d ng binary nh ng vi c bi u di n   t các

ấ ả ố ệ ể ặ M c dù trong PC, t ậ ố ướ ạ ệ ậ ẽ s  d i d ng th p phân s  thu n ti n h n cho ng ấ ố ậ ậ ủ ụ th  t c nh p/xu t s  th p phân.

ế ạ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ự ị ươ ươ ượ ủ ế ổ ị ự ậ ố ệ . Bên trong PC, chúng đ ỗ   ấ ẳ Khi nh p s  li u, n u chúng ta gõ 21543 ch ng h n thì th c ch t là chúng ta gõ vào chu i   ng c a 21543. c bi n đ i thành các giá tr  nh  phân t ng đ ký t

61

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ộ ị ả ượ i khi xu t s  li u, n i dung nh  phân c a thanh ghi ho c ô nh  ph i đ ổ   ế c bi n đ i

ượ ạ c l ộ ấ ố ệ ự ể ộ ố ậ ễ ỗ ướ ượ Ng thành m t chu i ký t ủ  bi u di n m t s  th p phân tr ặ c khi chúng đ ớ c in ra.

ấ ố ậ Xu t s  th p phân (Decimal Ouput)

ộ ủ ụ ộ Chúng ta s  vi

ậ ẽ ế t m t th  t c Outdec đ  in n i dung c a m t thanh ghi ax nh  là m t s ấ ộ ộ ế

ể ẽ ổ ấ ừ ấ

ị ậ ườ ẽ ợ ộ ố  ư ế   ướ ạ i d ng th p phân. N u ồ ng này sau   ủ   ươ ng c a ậ ố ươ ng) r i in s  d ươ ng đ ng h p, Outdec s  in giá tr  th p phân t

ả ậ ủ ủ nguyên th p phân có d u. N u ax>0, Outdec s  in n i dung c a ax d ẽ ố ươ ax<0, Outdec s  in d u tr  (­), thanh ax=­ax (đ i d u thành s  d ư ậ ừ ấ d u tr . Nh  v y là trong c  hai tr ộ ố ươ ng. Sau đây là thu t toán: m t s  d

Algorithm for Decimal Output:

(1) If ax < 0 /ax hold output value/ Then

Print a minus sign (2)

Replace ax by its two’s complement (3)

(4) End_if

(5) Get the digits in ax’s decimal representation

(6) Convert these digits to characters and print them .

ể ể ủ ệ ầ Đ  hi u chi ti

ế ướ t b ụ ả ể ấ ộ ằ ậ

ủ ụ ư ả ử ằ  s  r ng n i dung c a ax là   c (5) c n ph i làm vi c gì, chúng ta gi ộ ố ậ ặ   ủ m t s  th p phân, ví d  24618d. Có th  l y các digits th p phân c a 24618 b ng cách chia l p ạ i cho 10d theo th  t c nh  sau: l

Divide 24618 by 10 . Qoutient = 2461, remainder = 8 Divide 2461 by 10 . Qoutient = 246, remainder = 1 Divide 246 by 10 . Qoutient = 24, remainder = 6 Divide 24 by 10 . Qoutient = 2, remainder = 4 Divide 2 by 10 . Qoutient = 0, remainder = 2

ậ ượ ằ ố ư ấ Các digits nh n đ c b ng cách l y các s  d  theo tr t t ậ ự ượ ạ  ng c l i.

ướ ể ự ủ ư ệ ậ ằ ặ B c (6) c a thu t toán có th  th c hi n b ng vòng l p For nh  sau:

For count times Do

pop a digit from the stack convert it to a character output the character

End_for

ủ ụ ư ệ Mã l nh cho th  t c Outdec nh  sau:

Outdec Proc

None

; Save registers

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

; Print ax as a signed decimal integer ; Input:ax ; Output: ax push bx push cx push push dx ; If ax<0 or ; If ax<0 ax, ax

62

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

End_if1

; Save ax ; Get ‘­‘

jge ; then push mov mov int pop neg ax dl, ‘­‘ ah, 2 21h ax ax ; Print ‘­‘ ; Get ax back ; ax=­ax

End_if:

; get decimal digits cx, cx xor bx, 10 mov ; Clear cx for counts digits ; bx has divisor

Repeat:

; Clear dx ; ax/bx, ax=qoutient, dx=remainder ẻ ; push remaind  onto stack ; increment count dx, dx bx dx cx

ax, ax Repeat1

; Print character function

xor div push inc ; Until ; qoutient=0? or jne ; No, keep going ; Convert digits to characters and print mov ah, 2 ; For count times do

; digit in dl ; convert digit to character ; Print digit

dx dl, 30h 21h Print_loop

; Restore registers

Print_loop: pop or int loop ; End_for dx pop cx pop bx pop ax pop ret

Outdec Endp

Toán t ử ả  gi INCLUDE

ể ặ ổ ươ

ể ư ươ ắ ầ ng trình trong Debug. Đ  đ a th  t c Outdec vào trong ch ộ ng trình ng t và ng trình mà không c n gõ

ư ằ Chúng ta có th  thay đ i Outdec b ng cách đ t nó bên trong m t ch ủ ụ ươ ớ  INCLUDE v i cú pháp nh  sau: ạ ch y ch nó, chúng ta dùng toán t ử ả  gi

INCLUDE filespec

ả ườ ụ ậ ẫ ủ Ở ạ đây filespec dùng đ  nh n d ng t p tin (bao g m c  đ ng d  c a nó). Ví d : t p tin

ứ ể ch a Outdec là PGM6_1.ASM ồ ậ ậ ể ế ở ổ    A:. Chúng ta có th  vi t:

INCLUDE A:\PGM6_1.ASM

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ươ ủ ụ ể Sau đây là ch ng trình đ  test th  t c Outdec:

63

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

100h

ạ ữ ệ ở ạ ; Kh i t o đo n d  li u

TITLE PGM6_2: DECIMAL OUTPUT .Model Small .Stack .Code Main Proc mov mov call mov int ax, @Data ds, ax Outdec ah, 4ch 21h ề ; V  DOS

Main Endp

include A:\PGM6_1.ASM

End Main

ậ ố ệ ạ ị ươ Sau khi d ch, chúng ta dùng Debug nh p s  li u và ch y ch ng trình.

ậ ậ Nh p th p phân (Decimal input)

ế ể ầ

ậ ố ậ ộ ố ỗ ủ ụ ể ủ ệ ậ ị ễ   ộ ổ Đ  nh p s  th p phân chúng ta c n bi n đ i m t chu i các digits ASCII thành bi u di n ể ẽ ế t th  t c Indec đ  làm vi c này. nh  phân c a m t s  nguyên th p phân. Chúng ta s  vi

ủ ụ ủ ụ ẽ ặ ặ ớ Trong th  t c Outdec chúng ta chia l p cho 10d. Trong th  t c Indec s  nhân l p v i 10d.

ư ủ ậ Thu t toán c a Indec nh  sau:

Decimal Input Algorithm

Total = 0 Read an ASCII digit Repeat

convert character to a binary value total=10*total+value read a chracter

Until chracter is a carriage return

ư ử ế ậ Ví d :ụ  N u nh p 123 thì x  lý nh  sau:

Total = 0 Read ‘1’ Convert ‘1’ to 1 Total=10*0+1=1 Read ‘2’ Convert ‘2’ to 2 Total=10*1+2=12 Read ‘3’ Convert ‘3’ to 3 Total=10*12+3=123

ẽ ượ ự ậ ậ ủ ụ Sau đây chúng ta s  xây d ng th  t c Indec sao cho nó c p nh n đ

ươ ừ ế ẽ

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ủ ụ ẽ ườ ự ả ộ ố ậ   c các s  th p phân ắ   ể ấ ộ ấ ng trình s  in ra m t d u ‘?’ đ  nh c có d u trong vùng t ỗ ự ế ườ  CR. ng   i dùng gõ vào d u + ho c ­, theo sau đoa là m t chu i các digits và k t thúc là ký t ố   ự ố ế  s  (‘0’..’9’) thì th  t c s  nh y xu ng N u ng ­32768 đ n +32767 (1 word). Ch ấ i dùng gõ vào m t ký t ộ ả  không ph i là ký t

64

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ắ ầ ạ ừ ầ ủ ụ ữ ư ậ ậ ầ ớ ả    đ u. V i nh ng yêu c u nh  trên đây, th  t c nh p th p phân ph i i t

ớ dòng m i và b t đ u l ư i nh  sau: vi ế ạ t l

Print a question mask Total=0 Negative=false Read a character Case character of ‘­’:

‘+’: Negative=true read a chracter read a charcter

End_case Repeat

If character not between ‘0’ and ‘9’ Then

goto beginning

Else

Convert character to a binary value Total=10*Total+value

End_if Read a character

Until character is a carriage return If Negative=true Then

Total=­Total

End_if

ủ ụ ư ể ớ Th  t c có th  mã hoá nh  sau (ghi vào đĩa a: v i tên PGM6_2.ASM):

Indec Proc

ax=binary equvalent of number ; Save registers

; Read a number in range ­32768 to +32767 ; Input:None ; Output: bx push cx push push dx ; Print prompt

Begin:

ah, 2 dl, ‘?’ 21h ; Print ‘?’

bx, bx ; bx holds Total

cx, cx ; cx holds sign

; Character in al

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

mov mov int ; Total=0 xor ; Negative=false xor ; Read a character ah, 1 mov int 21h ; CASE character of al, ‘­‘ cmp ; Minus sign

65

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

; Plus sign

; Start processing characters je cmp je jmp Minus al, ‘+’ Plus Repeat2

Minus:

mov cx, 1

Plus:

int 21h

Repeat:

al, ‘0’

al, ‘9’ Not_digit

; Convert to digit ; Save digit on stack al, 0fh ax

; ax=Total*10 ; Retrieve digit ; Total=Total*10+digit

ax, bx ; Restore total in ax

cx, cx Exit ; Negative number ; No exit

ax

; If character is between ‘0’ to ‘9’ cmp jnge Not_digit cmp jnle ; Then convert character to digit and push ; Total=10*Total+digit ax, 10 mov bx mul bx pop add bx, ax ; Read a character ah, 1 mov 21h int al, 0dh cmp Repeat jne ; Until CR mov ; If negative or je ; Then neg ; End_if

Exit:

; Restore registers

dx cx bx

pop pop pop ret ; Here if illegal character entered

Not_digit:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

mov mov int mov ah, 2 dl, 0dh 21h dl, 0ah

66

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

int jmp 21h Begin

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Indec Endp

67

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Test Indec

ể ằ ạ ộ ươ ậ Có th  test th  t c Indec b ng cách t o ra m t ch ậ   ng trình dùng Indec cho nh p th p ư ủ ụ ấ phân và Outdec cho xu t th p phân nh  sau:

100h

ạ ữ ệ ở ạ ; Kh i t o đo n d  li u ax, @Data ds, ax

; Save number Indec ax

; Get number

ậ TITLE PGM6_4.ASM .Model Small .Stack .Code Main Proc mov mov ; Input a number call push ; Move cursor to a new line ah, 2 mov dl, 0dh mov 21h int dl, 0ah mov int 21h ; Output a number ax pop Outdec call ah, 4ch mov 21h int ề ; V  DOS Main Endp

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

include A:\PGM6_1.ASM include A:\PGM6_2.ASM End Main

68

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ƯƠ

Ế Ộ Ị

CH

Ỉ NG 7 M NG VÀ CÁC CH  Đ  Đ A CH

ậ ử ả ộ ỹ Trong ch

ẽ ề ậ ươ ề ế ộ ị ế ẽ ạ ủ trong assembly. Ph n còn l ả   ươ ng này chúng ta s  đ  c p đ n m ng m t chi u và các k  thu t x  lý m ng ỉ ầ ng này s  trình bày các ch  đ  đ a ch . i c a ch

7.1. M ng m t chi u

ộ ạ cùng lo i và có tr t t

ả th  hai, ph n t ậ ự ầ ử ậ ự . Có tr t t  có nghĩa ộ ế ọ  th  ba, ... Trong toán h c, n u a là m t m ng thì

ộ ề M ng m t chi u là m t danh sách các ph n t ầ ử ứ ầ ử ứ ầ ử ứ ấ  th  nh t, ph n t ượ ị ầ ử ủ ả ả là có ph n t các ph n t c a m ng đ c đ nh nghĩa là: A[1], A[2], A[3], ...

ươ ể ể ả ng 1 chúng ta đã s  d ng toán t ử ả  gi DB và DW đ  khai báo m ng ki u Byte

Trong ch ể ự ụ ả ộ ử ụ ỗ và m ng ki u Word. Ví d , m t chu i ký t có tên là Msg:

Msg db ‘abcde’

ả ừ ầ ủ ồ ố ị có tên là W_a g m 6 s  nguyên mà giá tr  ban đ u c a chúng là 10,

ộ ặ Ho c là m t m ng t 20, 30, 40, 50 và 60:

W_a dw 10, 20, 30, 40, 50, 60

ị ủ ế ọ ỉ

ỉ ơ ở ủ Đ a ch  (offset) c a bi n m ng g i là đ a ch  c  s  c a m ng (base address of the array). ả ớ ả ầ ử ẽ ư ị ộ ủ ế ỉ ị ả N u đ a ch  offset c a W_a là 0200h thì trong b  nh , m ng 6 ph n t nói trên s  nh  sau:

Symbolic address

Offset address 0200h 0202h 0204h 0206h 0208h 020Ah W_a W_a+2h W_a+4h W_a+6h W_a+8h W_a+Ah Decimal content 10 20 30 40 50 60

ử Toán t DUP (Duplicate)

ầ ử ủ ầ ả ộ ị ộ Có th  đ nh nghĩa m t m ng mà các ph n t ằ    c a nó có cùng m t giá tr  ban đ u b ng

ể ị ư phép DUP nh  sau:

ặ ạ Repeat_count DUP(value) ầ ộ ố i m t s  (value) n l n (n=Repeat_count) L p l

Ví d :ụ

Gamma dw 100 dup(0)

ị ỗ ả ể ầ ử ồ là 1 word) có tên là Gamma g m

ầ ử ầ

ả ồ ầ ử ị mà giá tr  các

ộ  mà giá tr  ban đ u là 0. db ộ ứ ị ; Đ nh nghĩa m t m ng ki u word (m i ph n t ị ; 100 ph n t 210 dup(?) Delta ị ể ; Đ nh nghĩa m t m ng ki u byte có tên là Delta g m 210 ph n t ầ ử  là ch a xác đ nh. ; ph n t

ử ể ử ụ ư ồ Toán t DUP có th  s  d ng l ng nhau nh  sau:

Line db 5, 4, 3 dup(2, 3 dup(0), 1)

ươ ớ ươ t ng đ ng v i:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Line db 5, 4, 2, 0, 0, 0, 1, 2, 0, 0, 0, 1, 2, 0, 0, 0, 1

69

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ầ ử ủ ả ị V  trí các ph n t ộ  c a m t m ng:

ầ ử ủ ả ằ ị Đ a ch  c a m t ph n t c xác đ nh b ng cách công m t h ng s

ỉ ủ ỉ ơ ở ố ộ ỉ

ố ớ ủ ủ ể ể ố  ầ ử ủ    c a ầ ử ủ    c a

ộ  c a m ng có th  đ ả ộ ả ử  s  A là m t m ng có N ph n t ả ư ể ượ ộ ằ ị ầ ử ớ ị v i đ a ch  c  s . Gi  và S ch  ra s  bytess c a m t ph n t ố ớ ả ị ả m ng (S=1 đ i v i m ng ki u byte và S=2 đ i v i m ng ki u word). V  trí c a các ph n t ể ả m ng A có th  tính nh  sau:

1 A 2 A+1*S 3 A+2*S ... ... N A+(N­1)*S Position Location

ầ ử ứ ầ ử ứ ả ổ ừ Ví d :ụ  Trao đ i ph n t th  10 và ph n t ủ  th  25 c a m ng t W_a.

ầ ử ứ ầ ử ứ ị ị ỉ ỉ Ph n t Ph n t th  10 là W_a[10] có đ a ch  là W_a+9*2=W_a+18  th  25 là W_a[25] có đ a ch  là W_a+24*2=W_a+48

ư ể ậ ổ Vì v y có th  trao đ i chúng nh  sau:

mov ax, W_a+18 xchg W_a+48, ax mov W_a+18, ax ; ax=W_a[10] ; ax=W_a[25] ; Complete exchange

ế ộ ị

7.2. Các ch  đ  đ a ch  (Addressing modes)

ế ộ ị ế ộ ị ứ ệ ạ ỉ ỉ ọ Cách th c ch  ra toán h ng trong l nh g i là ch  đ  đ a ch . Các ch  đ  đ a ch  th ỉ ườ   ng

dùng là:

(cid:0) ế ộ ị ỉ ứ ạ ằ ố Ch  đ  đ a ch  t c thì (immediate mode): Toán h ng là h ng s .

(cid:0) ỉ ự ế ế ộ ị ế ạ ặ ị ị ỉ Ch  đ  đ a ch  tr c ti p(direct mode): Toán h ng là bi n ho c là giá tr  đ a ch .

(cid:0) ế ộ ị ạ ỉ Ch  đ  đ a ch  thanh ghi (register mode): Toán h ng là thanh ghi.

Ví d :ụ

mov add ax, 0 alpha, ax ; ax là register mode còn 0 là immediate mode ; alpha là direct mode

ế ộ ị ỉ Ngoài ra còn có 4 ch  đ  đ a ch  khác là:

(cid:0) ế ộ ị ế ỉ Ch  đ  đ a ch  gián ti p qua thanh ghi (register indirect mode).

(cid:0) ế ộ ị ỉ ơ ở Ch  đ  đ a ch  c  s  (based mode).

(cid:0) ế ộ ị ỉ ỉ ố Ch  đ  đ a ch  ch  s  (indexed mode).

(cid:0) ỉ ơ ở ỉ ố ế ộ ị Ch  đ  đ a ch  c  s  ch  s  (based indexed mode).

ế ộ ị

ế

7.2.1.

Ch  đ  đ a ch  gián ti p qua thanh ghi

ỉ ế ộ ị ủ ạ ị

ượ ạ ế ằ ỉ ỏ ớ

ủ ố ớ

ạ ứ   Trong ch  đ  đ a ch  gián ti p qua thanh ghi, đ a ch  offset c a toán h ng đ c ch a ộ   trong m t thanh ghi. Chúng ta nói r ng thanh ghi là con tr  (pointer) c a ô nh . D ng toán ạ   h ng là [register]. Trong đó regiser là các thanh ghi bx, si, di, bp. Đ i v i các thanh ghi bx, si, ạ ủ di thì thanh ghi đo n là ds, còn thanh ghi đo n c a bp là ss.

ả ử ằ ớ ạ ị ộ ỉ Ví d :ụ  Gi s  r ng si=100h và word nh  t i đ a ch  ds:0100h có n i dung là 1234h.

L nh:ệ

mov ax, [si]

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ẽ s  copy 1234h vào ax.

70

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ả ử ằ ủ ộ ớ ươ ứ ư ộ ộ Gi s  r ng n i dung các thanh ghi và n i dung c a b  nh  t ng  ng nh  sau:

ộ ớ ộ

Thanh ghi AX SI DI ộ N i dung 1000h 2000h 3000h offset 1000h 2000h 3000h N i dung b  nh 1BACh 20FFh 031Dh

ế ệ ệ ồ ợ ế   t l nh nào trong các l nh sau đây là h p lý, offset ngu n và k t

ả ủ ợ Ví d  1:ụ  Hãy cho bi ệ qu  c a các l nh h p lý đó.

bx, [bx] cx, [si] bx, [ax] [si], [di] [di] a. mov b. mov c. mov d. add inc e.

Gi i:ả

Result 1bach 20ffh (must be bx, si, di)

illegal source register illegal memory­memory add

Source offset a. 1000h b. 2000h c. d. e. 3000h 031eh

ế ể ộ ầ ử ủ ả ạ ộ ượ ị Ví d  2:ụ  Vi t đo n mã đ  c ng vào ax 10 ph n t c a m t m ng W đ c đ nh nghĩa

ư nh  sau:

W dw 10, 20, 30, 40, 50, 60, 70, 80, 90, 100

Gi i:ả

ủ ả

ỉ ơ ở ầ ử ủ ả si, W cx, 10 ; Xoá ax ỏ ớ ị ; si tr  t ứ ố ; cx ch a s  ph n t i đ a ch  c  s  (base) c a m ng W.  c a m ng

ầ ử ứ ấ  th  nh t ỏ

xorax, ax lea mov Addition: add add loop ax, [si] si, 2 Addition ; ax=ax+ph n t ; tăng con tr  lên 2 ; L pặ

ế ả

ượ ầ ử ứ ầ ử     th  n­1, .... Chúng ta th  n, ph n t

ộ  th  hai s  thành ph n t ả ứ ố ẽ ầ ử ủ ả ủ ụ ể ả Ví d  3:ụ  Vi t th  t c đ  đ o ng ầ ử ứ ấ ẽ ổ ứ th  nh t s  đ i thành ph n t ỏ ủ ư ẽ s  dùng SI nh  là con tr  c a m ng còn BX ch a s  ph n t ề c m t m ng n word. Đi u này có nghĩa là ph n t ầ ử ứ  c a m ng (n word).

ớ ằ ố ầ ầ ử ứ ủ ầ ầ ổ ị Gi i:ả  S  l n trao đ i là n/2 l n. C n nh  r ng ph n t ả  th  n c a m ng có đ a ch ỉ

A+2*(n­1).

ư ạ Đo n mã nh  sau:

Reverse Proc

reverse array ấ ; C t các thanh ghi

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

; input: si= offset of array ; bx= number of elements ; output: push push ax bx

71

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ầ ử ứ th  n i ph n t

ỏ ớ ứ ấ i word th  nh t

ố ầ ử

ủ ả ỏ ớ ầ ử ứ i ph n t th  n

; di tr  t ; cx=bx=n: s  ph n t ; bx=n­1 ;bx=2*(n­1) ; di=2*(n­1)+offset c a m ng: tr  t ổ ố ầ ; cx=cx/2: s  l n trao đ i

ầ ử cx push si push di push ỏ ớ ; di tr  t di, si mov cx, bx mov bx dec bx, 1 shl di, bx add cx, 1 shr ổ ; Trao đ i các ph n t

ấ ư

ả ả ấ ủ ầ ử ở ử ộ  n a th p c a m ng ; L y m t ph n t   ả ủ ử ; đ a nó lên n a cao c a m ng ; Hoàn thành trao đ iổ ủ ầ ử ế ỏ ớ  ti p theo c a m ng ; si tr  t ủ ầ ử ướ ỏ ớ c đó c a m ng  tr ; di tr  t i ph n t i ph n t

ấ ạ ; L y l ấ i các thanh ghi đã c t

ax, [si] ax, [di] [si], ax si, 2 di, 2 xchg_loop di si cx bx ax

xchg_loop: mov xchg mov add sub loop pop pop pop pop pop ret

Reverse Endp

ế ộ ị

ỉ ố

ơ ở

7.2.2.

ỉ Ch  đ  đ a ch  ch  s  và c  s

ủ ạ ỉ ượ ằ ộ   c b ng cách c ng

ế ộ ị ọ ỉ ớ ộ ủ ộ ộ ị ị Trong các ch  đ  đ a ch  này, đ a ch  offset c a toán h ng có đ m t giá tr  nguyên (g i là Displacement) v i n i dung c a m t thanh ghi.

Displacement có th  là:ể

ụ ế ộ ị ỉ ủ o Đ a ch  offset c a m t bi n, ví d : A

ộ ằ ặ ươ ị ụ ng), ví d : ­2 o M t h ng giá tr  (âm ho c d

ế ộ ộ ằ ụ ủ ộ ớ ố ỉ ị o Đ a ch  offset c a m t bi n c ng v i m t h ng s , ví d : A+4

ể ươ ủ ể ạ ộ ộ ươ Cú pháp c a m t toán h ng có th  là m t trong các ki u t ng đ ng sau:

[register+displacement] [displacement+register] [register]+displacement [displacement]+register displacement[register]

ả ả ỉ ị ạ Các thanh ghi ph i là bx, si, di (đ a ch  đo n ph i là thanh ghi ds) và bp (thanh ghi ss

ứ ị ạ ỉ ch a đ a ch  đo n).

ỉ ượ ơ ở ế ặ ọ c g i là c  s  (based) n u thanh ghi bx (base register) ho c bp

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ế ộ ị Ch  đ  đ a ch  đ ượ c dùng. (base pointer đ

72

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ế ộ ị ỉ ố ế ặ ọ Ch  đ  đ a ch  đ c g i là ch  s  (indexed) n u thanh ghi si (source index) ho c di

ượ (destination index) đ ỉ ượ c dùng.

ả ử ằ ứ ệ ả ị Ví d :ụ  Gi s  r ng W là m ng word và bx ch a giá tr  4. Trong l nh:

mov ax, W[bx]

ủ ẽ ỉ ị  có đ a ch ỉ

ế ệ Displacement là đ a ch  offset c a bi n W. L nh này s  di chuy n ph n t ể ế ướ ị ệ ươ ươ ạ W+4 vào thanh ghi ax. L nh này cũng có th  vi ầ ử ng sau: i các d ng t ể ng đ t d

mov mov mov mov ax, [W+bx] ax, [bx+W] ax, W+[bx] ax, [bx]+W

ấ ả ử ằ ứ ị ỉ ủ ệ ả ụ L y ví d  khác, gi s  r ng SI ch a đ a ch  c a m ng word W. Trong l nh:

mov ax, [si]

ủ ừ ẽ ể ộ ớ ớ Displacement là 2. L nh này s  di chuy n n i dung c a t nh  W+2 t ệ i ax. L nh này

ể ế ướ ư ệ ạ cũng có th  vi t d i các d ng khác nh  sau:

mov mov mov mov ax, [2+si] ax, 2+[si] ax, [si]+2 ax, 2[si]

ỉ ơ ở ể ế ạ ệ ổ t l i mã l nh cho bài toán tính t ng 10 ph n t ầ ử

V i ch  đ  đ a ch  c  s  có th  vi ả ế ộ ị ư ớ ủ c a m ng nh  sau:

ax, ax bx, bx cx, 10 ; Xoá ax ơ ở ; Xoá bx (thanh ghi c  s ) ầ ử ố ; cx: s  ph n t (10)

ỏ ; sum=sum+element ầ ử ế ; tr  vào ph n t ti p theo

xor xor mov Addition: add add loop ax, W[bx] bx, 2 Addition

ả ử ằ ượ ư Ví d :ụ  Gi s  r ng Alpha đ c khai báo nh  sau:

Alpha dw 0123h, 0456h, 0789h, 0adcdh

ạ ượ ị ả ử ằ trong đo n đ ỉ ở c đ a ch  b i DS và gi s  r ng:

bx=2[0002]=1084h si=4[0004]=2BACh di=1

ợ ệ ị ố ượ ệ ồ ỉ ỉ ể Hãy ch  ra các l nh nào sau đây là h p l , đ a ch  offset ngu n và s  đ c chuy n:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

1. mov 2. mov 3. mov 4. mov 5. mov 6. mov 7. mov ax, [Alpha+bx] bx, [bx+2] cx, Alpha[si] ax, ­2[si] bx, [Alpha+3+di] ax, [bx]2 bx, [Alpha+ax]

73

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Gi i:ả

Source offset

Number moved 0456h 2bach 0789h 1084h 0789h

ượ L nhệ 1 2 3 4 5 6 7 Alpha+2 2+2 Alpha+4 ­2+4=+2 Alpha+3+1=Alpha+4 illegal form source operand ...[bx]2 illegal; thanh ghi ax là không đ c phép

ụ ấ ả ộ ượ ử ế ộ ị ư ế ỉ Ví d  sau đây cho th y m t m ng đ ở c x  lý nh  th  nào b i ch  đ  đ a ch  ch  s ỉ ố

ơ ở và c  s :

ườ ỗ ổ Ví d :ụ  Đ i các ký t ự ế  vi t th ng trong chu i sau thành ký t ự ế  vi t hoa:

db ‘Co non xanh tan tran troi’ Msg

Gi i:ả

ự ủ cx, 25

ỗ  c a chu i ự mov xorsi, si ố ; S  ký t ỉ ố ; si ch  s  cho ký t

Top:

; blank?

ữ cmp je and Msg[si], ‘ ‘ Next ổ Msg[si], 0dfh ; Đ i thành ch  hoa

Next:

ế inc loop si Top ỉ ố ; Ch  s  ký t ặ ạ ; L p l ự ế  ti p theo ỗ ế i cho đ n h t chu i

7.2.3.

Toán t

PTR và toán t

ử ả  gi

LABEL

ử Toán t PTR

ươ ả Trong các ch ng tr c, chúng ta đã bi

ằ ộ ệ ố ạ ạ ộ ủ ế ằ t r ng các toán h ng c a m t l nh ph i cùng   ẽ  ế

ạ ươ ứ ạ ứ ể ạ ớ lo i, t c là cùng là byte ho c cùng là word. N u m t toán h ng là h ng s  thì ASM s chuy n chúng thành lo i t ướ ặ ng  ng v i toán h ng kia.

ư ụ ể ạ ẽ ự Ví d : ASM s  th c hi n l nh ệ ệ ệ mov ax, 1 nh  là l nh toán h ng ki u word.

ươ ự ẽ ự ệ ạ T ng t , ASM s  th c hi n l nh ư ệ ệ mov bh, 5 nh  là l nh toán h ng byte.

ợ ệ Tuy nhiên, l nh ệ mov [bx], 1  là không h p l ắ ể ế  vì ASM không bi ằ ề ụ ạ PTR nh

ỉ ở   ạ t toán h ng ch  b i ư  ử thành ghi bx là toán h ng byte hay word. Có th  kh c ph c đi u này b ng toán t sau:

ạ ạ ạ ạ mov mov byte ptr [bx], 1 word ptr [bx], 1 ; Toán h ng đích là toán h ng byte ; Toán h ng đích là toán h ng word

ự ự ỗ ượ ị ở Ví d :ụ  Thay ký t ‘t’ thành ký t ‘T’ trong chu i đ c đ nh nghĩa b i:

db ‘this is a message’ Msg

Gi i:ả

ế ộ ị ế ỉ Cách 1: Dùng ch  đ  đ a ch  gián ti p qua thanh ghi

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ỏ ớ lea si, Msg ; si tr  t i Msg

74

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ằ mov byte ptr [si], ‘T’ ; Thay ‘t’ b ng ‘T’

ế ộ ị ỉ ỉ ố Cách 2: Dùng ch  đ  đ a ch  ch  s :

ằ xor si, si mov Msg[si], ‘T’ ; Xoá si ; Thay ‘t’ b ng ‘T’

Ở ầ ử ế ể cách 2 này, không c n dùng toán t PTR vì Msg là bi n ki u byte.

ử ượ ủ ể ạ ạ PTR đ c dùng k  khai báo lo i (type) c a toán h ng. Cú pháp

Nói chung toán t ủ ư chung c a nó nh  sau:

Type PTR address_expression Trong đó: Type: byte, word, Dword, ...

ế ượ ở Address_expression: là các bi n đã đ c khai báo b i db, dd, dw, ...

ư ế Ví d :ụ  Chúng ta có 2 khai báo bi n nh  sau:

Dollarsdb Cents db 1ah 52h

ộ ệ ỉ ằ ể ố và chúng ta mu n di chuy n Dollars vào al, Cents vào ah ch  b ng m t l nh mov duy

ư ể ệ ấ nh t. Có th  dùng l nh nh  sau:

mov ax, word ptr Dollars ; al=Dollars, ah=Cents

Toán t ử ả  gi Label

ộ ư ề ạ Có m t cách khác đ  gi ộ ề ạ ủ i quy t v n đ  xung đ t v  lo i c a toán h ng nh  trên

ằ b ng cách dùng toán t ử ả  gi ế ấ ể ả ư  LABEL nh  sau:

Money label word Dollarsdb Cents 1ah db 52h

ệ ế ầ ớ Các l nh trên khai báo bi n Money là bi n word v i 2 thành ph n là Dollars và Cents.

ệ ị ế ỉ ớ Trong đó Dollars có cùng đ a ch  v i Money. L nh:

mov ax, Money

ươ ệ ớ ươ t ng đ ng v i 2 l nh:

mov mov al, Dollars ah, Cents

ả ử ằ ố ệ ượ ư Ví d :ụ  Gi s  r ng s  li u đ c khai báo nh  sau:

.Data

1234h a dw byte b label dw 5678h label word

c c1 db c2 db 9ah 0bch

ế ợ ệ ệ ệ ả ủ ệ ế Hãy cho bi t trong các l nh sau đây, l nh nào là h p l và k t qu  c a l nh:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ax, b ah, b cx, c 1. mov 2. mov 3. mob

75

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

4. mov 5. mov 6. mov bx, word ptr b dl, word prt c ax, word ptr c1

Gi i:ả

1. Không h p lợ ệ ợ ệ 2. H p l ợ ệ 3. H p l ợ ệ 4. H p l ợ ệ 5. H p l ợ ệ 6. H p l , 78h , 0bc9ah , 5678h , 9ah , 0bc9ah

ế

7.2.4.

Chi m đo n (segment override)

ế ộ ị ế ặ ỏ ỉ

ể ạ ạ ộ ỉ ỉ ỉ

Trong ch  đ  đ a ch  gián ti p qua thanh ghi, cách thanh ghi con tr : BX, SI ho c DI ị ch  ra đ a ch  offset còn thanh ghi đo n là DS. Cũng có th  ch  ra m t thanh ghi đo n khác theo cú pháp sau:

segment_register: [ pointer_register]

Ví d :ụ

mov

ax, es:[si] ị ỉ ủ ế ạ ồ N u si=0100h thì đ a ch  c a toán h ng ngu n là es:0100h.

ế ộ ị ế ộ ị ỉ ố ệ ể ế ạ ớ ỉ ỉ ơ ở Vi c chi m đo n cũng có th  dùng v i ch  đ  đ a ch  ch  s  và ch  đ  đ a ch  c  s .

ế

7.2.5.

Truy xu t đo n ngăn x p (stack)

ư ỉ ỉ

ế ộ ị ể ộ ị ề ấ ố ệ ế ẽ ạ Nh  chúng ta đã nói trên đây, khi BP ch  ra m t đ a ch  offset trong ch  đ  đ a ch  gián ể

ỉ ti p qua thanh ghi, SS s  dung c p s  hi u đo n. Đi u này có nghĩa là có th  dùng BP đ ấ truy xu t stack.

ể ạ ỉ ổ ộ Ví d :ụ  Di chuy n 3 word t i đ nh stack vào ax, bx, cx mà không làm thay đ i n i dung

ủ c a stack.

i đ nh stack ạ ỉ i đ nh stack vào ax ứ ứ mov mov mov mov bp, sp ax, [bp] bx, [bp+2] cx, [bp+4]; ỏ ớ ỉ ; bx tr  t ; copy word t ; copy word th  hai trên stack vào bx ; copy word th  ba trên stack vào cx

ắ ế ố ệ

7.3.

S p x p s  li u trên m ng

ế ộ

ế ệ Vi c tìm ki m m t ph n t ể ắ ư ả ể ế ấ ộ ượ ắ ả ế   c s p x p ậ ổ   i thu t n i

ả ộ ả (sort). Đ  s p x p m t m ng A g m N ph n t ọ b t (bubble sort, n i dung gi ả ầ ử ơ ở i thu t không trình bày ẽ ễ ầ ử ữ ệ  d  li u trên m ng s  d  dàng n u nh  m ng đ ả ồ , đ n gi n nh t là ta có th  dùng gi ậ  đây).

ả ử ằ ầ ử ứ ả ư ố Ví d :ụ  Gi s  r ng m ng A ch a 5 ph n t là các s  nguyên nh  sau:

ứ ự ế ả ầ ắ A={21, 5, 16, 40, 7}, hãy s p x p m ng A theo th  t tăng d n.

ậ Thu t toán:

i=n; For n­1 l n Do

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ỗ ổ ầ ả Tìm k tho  A[k]=max{A[1]..A[i]}; Đ i ch  (A[i], A[k]);

76

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

i=i­1

End_for

ụ ớ ướ ư ả ự ệ ướ V i ví d  đã cho thì n=5, các b c th c hi n nh  b ng d i đây:

Position  initial  ướ c 1  b ướ c 2  b ướ c 3  b ướ c 4  b 1  21  21  7  7  5 2  5  5  5  5  7 3  16  16  16  16  16 4  40  7  21  21  21 5  7  40  40  40  40

ươ ầ ử ả ng trình đ  s p x p các ph n t trong m t m ng. Chúng ta s  dùng th

ẽ ế ầ ử ẽ ọ ể ắ ể ắ ả ế ủ ụ ộ ủ ụ trên m ng, th  t c Select s  g i th  t c Swap đ  s p x p. Ch ủ  ươ   ng

Sau đây là ch ể ọ ụ t c Select đ  ch n ph n t ẽ ư trình chính s  nh  sau:

100h

TITLE PGM7_3: TEST SELECT .Model Small .Stack .Data

a db 21, 5, 16, 40, 7

ạ ữ ệ

ầ ử ủ ố ứ ả ; ở ạ ; Kh i t o đo n d  li u ỳ ọ ; Tu  ch n ỏ ; si tr  vào m ng a ; S  ph n t ả  c a m ng ch a trong bx

ở ề ủ ắ

ax, @Data ds, ax es, ax si, a bx, 5 Select ax, 4c00h 21h ; Hàm tr  v  DOS c a ng t 21h ề ; V  DOS .Code Main Proc mov mov mov lea mov Call mov int

Main End

Include C:\ASM\Select.asm

End Main

ủ ụ ứ ậ ượ ế ủ ụ T p tin Select.asm ch a th  t c Select và th  t c Swap đ c vi ư t nh  sau:

Select Proc

ả ể

ủ ụ ắ ị

ả ả ủ  (n) c a m ng

ế ắ ả ủ ầ ử ỉ ố bx=s  ph n t ủ ị si=đ a ch  offset c a m ng đã s p x p

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ế ; Th  t c s p x p m ng ki u byte ỉ ; Input:si=đ a ch  offset c a m ng ; ; Output: ; Uses: Swap push push push push dec je bx cx dx si bx End_sort ; n=n­1 ế ; N u n=1 thì thoát

77

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ấ ị ủ ả ỉ ; C t đ a ch  offset c a m ng vào dx

dx, si mov ầ ặ ; L p n­1 l n

Sort_loop:

ứ ấ  (th  nh t)

dx, si al, [di] ầ ử mov mov ; Tìm ph n t ả ỏ ; si tr  vào m ng a ầ ử ứ ; al ch a ph n t ấ  lpns nh t

đang xét?

ti p theo

ầ ử ế ấ  l n nh t

ầ ử ế  ti p theo ; si tr  vào ph n t ầ ử ầ ử ế  ti p theo>ph n t ; ph n t ớ ế ụ ; Không, ti p t c so sánh v i ph n t ầ ử ớ ỉ ủ ứ ị ; di ch a đ a ch  c a ph n t ấ ầ ử ớ ứ  l n nh t ; al ch a ph n t Find_big: inc cmp jng mov mov si [si], al Next di, si al, [di]

Next:

ầ ử ớ ầ ử ố ấ ớ  l n nh t v i ph n t cu i cùng

; n=n­1 ế ặ ;L p n u bx<>0

Find_big loop ỗ ổ ; Đ i ch  ph n t Swap Call bx dec Sort_loop jne End_sort:

si dx cx bx

pop pop pop pop ret

Select Endp

Swap Proc

ể d  li u ki u byte

ỗ ầ ử ữ ệ ỗ ầ ử ứ ấ i ph n t  th  nh t ỏ ớ i ph n t di tr  t Các ph n t ầ ử ứ  th  hai ổ  đã đ i ch

ầ ử

ầ ử ; C t axấ ấ  a[i] ; L y ph n t ặ ; Đ t nó trên a[k] ặ ; Đ t a[k] trên a[i]

ủ ụ ổ ; Th  t c đ i ch  hai ph n t ỏ ớ ; Input:si tr  t ; ; Output: ax push al, [si] mov al, [di] xchg [si], al mov pop ax ret

Swap Endp

ị ươ ể ươ ể ạ ử ế Sau khi d ch ch ng trình, có th  dùng ch ả ng trình Debug đ  ch y th  và test k t qu .

7.4. M ng hai chi u

ủ ề ả ả ả ỗ ộ M ng hai chi u là m ng c a m t m ng, nghĩa là m ng m t chi u mà m i ph n t ầ ử ủ    c a

ạ ể ề ả ả ộ ề ộ ả ề ộ ư ả nó l i là m t m ng m t chi u. Có th  hình dung m ng hai chi u nh  b ng sau:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Row/Column 1 1 B[1,1] 2 B[1,2] 3 B[1,3] 4 B[1,4]

78

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

2 3 B[2,1] B[3,1] B[2,2] B[3,2] B[2,3] B[3,3] B[2,4] B[3,4]

ề ậ ộ ớ

ở ề ượ ư ế ố ế ầ ử ủ ượ ữ ộ ớ ỉ ị B i vì b  nh  là m t chi u (đánh đ a ch  tuy n tính) vì v y các ph n t ể ầ ượ t (n i ti p nhau). Có hai cách đ ộ c l u tr  trên b  nh  theo ki u l n l ả  c a m ng hai c dùng: chi u đ

(cid:0) ầ ử ủ ư ữ ả ứ ự dòng: trên m ng l u tr  các ph n t ồ    c a dòng 1, r i

ư ầ ử ủ ấ ứ Cách th  nh t là l u tr  theo th  t ế đ n các ph n t ữ  c a dòng 2, ...

(cid:0) ứ ự ộ ẩ ử ủ ộ ữ ả ữ ư  c t: trên m ng l u tr  các ph n t ồ ế    c a c t 1, r i đ n

ư ứ Cách th  hai là l u tr  theo th  t ầ ử ủ ộ  c a c t 2, ... các ph n t

ả ử ả Gi s  m ng B ch a:

ứ 10, 20, 30, 40 trên dòng 1 50, 60, 70, 80 trên dòng 2 90, 100, 110, 120 trên dòng 3

ậ ự ượ ị ữ ư Theo tr t t hàng, chúng đ ư c đ nh nghĩa và l u tr  nh  sau:

B

dw dw dw 10, 20, 30, 40 50, 60, 70, 80 90, 100, 110, 120

ậ ự ộ ượ ị ữ ư Theo tr t t c t, chúng đ ư c đ nh nghĩa và l u tr  nh  sau:

B

dw dw dw dw 10, 50, 90 20, 60, 100 30, 70, 110 40, 80, 120

ầ ữ ấ ả ị H u h t các ngôn ng  c p cao biên d ch m ng hai chi u theo tr t t

ậ ự ữ ư ế ậ ự ể chúng ta có th  dùng m t trong hai cách. N u các thành ph n c a m t hàng đ ư thì dùng cách l u tr  theo tr t t ề ầ ủ ữ i, cách l u tr  theo tr t t ế ượ ạ c l ộ ậ ự ộ ượ  c t đ dòng. Trong ASM, ầ ượ   ượ ử c x  lý l n l t c dùng. hàng. Ng

ầ ử ộ ị ề ả Xác đ nh m t ph n t trên m ng hai chi u

ả ử ằ ả ậ ự

ầ ử ồ ế ầ ử ế ể s  r ng m ng A g m mxn ph n t ầ ử ả  m ng (s=1 n u ph n t

ầ ầ ử ư ữ  l u tr  theo tr t t ể  là ki u byte, s=2 n u ph n t ầ ử ứ th  A[i,j] thì c n tìm: hàng i và ph n t ộ ớ   ọ  hàng (dòng). G i s là đ  l n ể    là ki u word, ...). Đ  tìm ả ế ư ậ    th  j trên hàng này. Nh  v y, ph i ti n hành qua

Gi ộ ủ c a m t ph n t ầ ử ứ ph n t c:ướ hai b

ỗ ầ ử ướ B c 1: , do đó:

ắ ầ ạ ị ắ ầ ạ ắ ầ ạ i v  trí A. Vì m i hàng có n ph n t i A+n*s i A+2*n*s

i A+(i­1)*n*s

ầ ộ Hàng 1 b t đ u t Hàng 2 b t đ u t Hàng 3 b t đ u t ... Hàng i b t đ u t ầ ử ứ Ph n t ướ B c 2: ắ ầ ạ ị  th  j trên m t hàng cách v  trí đ u hàng (j­1)*s byte

ầ ử ằ ướ ượ ư mà chúng đ c l u tr ữ

ầ ử ư ị ị ừ T  hai b ậ ự theo tr t t ả c trên, suy ra r ng trong m ng hai chi u nxm ph n t ỉ ượ  A[i,j] có đ a ch  đ ề c xác đ nh nh  sau: hàng thì ph n t

A+((i­1)*n+(j­1))*s (1)

ươ ự ế ư ậ ự ộ ầ ử ỉ ượ ị ị ng t ữ ả , n u l u tr  m ng  theo tr t t c t thì ph n t A[i,j] có đ a ch  đ c xác đ nh

T ư nh  sau:

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

A+((i­1)+(j­1)*m)*s (2)

79

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ả ử ả ầ ử ể ượ ư ữ ậ ự Ví d :ụ  Gi s  m ng A có nxm ph n t ki u word (s=2) đ c l u tr theo tr t t hàng.

H i:ỏ

(cid:0) ắ ầ ạ ị Hàng i b t đ u t ỉ i đ a ch  nào?

(cid:0) ắ ầ ạ ị ộ C t j b t đ u t ỉ i đ a ch  nào?

(cid:0) ầ ử ộ Hai ph n t trên c t cách nhau bao nhiêu byte:

ả ờ Tr  l i:

(cid:0) ắ ầ ạ ứ ị ỉ Hàng i b t đ u t i A[i, 1] theo công th c (1) thì nó có đ a ch  là: A+(i­1)*n*2.

(cid:0) ắ ầ ạ ộ ứ ị ỉ C t j b t đ u t i A[1, j] theo công th c (1) thì nó có đ a ch  là: A+(j­1)*2.

(cid:0) ầ ử ộ ộ ộ Vì nó n c t nên 2 ph n t trên cùng m t c t cách nhau 2*n byte.

ỉ ố ơ ở

ế ộ ị

7.5. Ch  đ  đ a ch  ch  s  c  s

ế ộ ủ ủ ạ ổ ị ỉ Trong ch  đ  này, đ a ch  offset c a toán h ng là t ng c a:

ơ ở ủ ặ ộ 1. N i dung c a thanh ghi c  s  (BX ho c BP).

ỉ ố ủ ặ ộ 2. N i dung c a thanh ghi ch  s  (SI ho c DI).

ỳ ọ ủ ế ộ ị ỉ 3. Đ a ch  offset c a m t bi n (tu  ch n).

ộ ằ ặ ươ ố ị ể ỳ ọ 4. M t h ng s  d ch chuy n âm ho c d ng (tu  ch n).

ế ứ ố ệ ủ N u thanh ghi BX đ

ượ ứ ố ệ ỉ ượ ị ạ ạ ị ạ ỉ ạ ế ạ c dùng thì DS ch a s  hi u đo n c a đ a ch  toán h ng. N u BP ế t theo 4 cách c vi

ượ ướ ủ c dùng thì SS ch a s  hi u đo n c a đ a ch  toán h ng. Toán h ng đ i đây: đ d

1. variable[base_register][index_register]

2. [base_register+index_register+variable+constant]

3. variable[base_register+index_register+constant]

4. constant[base_register+index_register+variable]

ậ ự ủ ầ ấ ặ ỳ Tr t t c a các thành ph n trong d u ngo c là tu  ý.

ả ử ế ể ệ Ví d :ụ  Gi s  W là bi n ki u word, bx=2 và si=4. L nh:

mov ax, W[bx][si]

ả ộ ạ ị ệ ỉ i đ a ch  W+2+4 (=W+6) vào thanh ghi ax. L nh này

ể ế ủ ẽ s  sao chép n i dung c a m ng t t theo 2 cách sau: cũng có th  vi

mov mov ax, [W+bx+si] ax, W[bx+si]

ỉ ố ơ ở ườ ế ộ ị ượ ể ử ư ụ ề ả ỉ Ch  đ  đ a ch  ch  s  c  s  th ng đ c dùng đ  x  lý m ng 2 chi u nh  ví d  sau:

ầ ử ể ượ ư ậ ự ữ Gi ki u word, đ c l u tr  theo tr t t hàng. Hãy vi ế   t

ả ử ằ ệ ả  s  r ng A là m ng 5x7 ph n t ế ộ ị ạ ỉ ỉ ố ể đo n mã l nh dùng ch  đ  đ a ch  ch  s  đ :

(cid:0) Xoá dòng 3.

(cid:0) Xoá c t 4.ộ

Gi i:ả

(cid:0) ắ ầ ạ i (A+(2­1)*7*2= A+28. Có

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ư ậ ắ ầ ạ i A+(i­1)*n*2. Nh  v y, dòng 3 b t đ u t ư ể Dòng i b t đ u t th  xoá dòng 3 nh  sau:

80

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

mov xor mov bx, 28 si, si cx, 7 ỏ ế ; bx tr  đ n đ u dòng 3 ẽ ỏ ụ ộ ; si s  tr  m c c t ầ ử ủ ố ; cx=s  ph n t ộ  c a m t hàng

Clear:

ế ộ ế ; Đ n c t ti p theo

mov A[bx][si], 0 add si, 2 loop Clear:

(cid:0) ậ ộ ỉ ỉ i đ a ch  A+(j­1)*2. V y, c t 4 b t đ u t

ắ ầ ạ ị ầ ử ắ ầ ạ ị ộ ộ  trên m t c t cách nhau n*2 bytes (n=7) nên 2 ph n t i đ a ch  A+(4­1)*2=A+6. Hai ể   cách nhau 14 bytes. Có th

ư ộ C t j b t đ u t ầ ử ph n t ộ xoá c t 4 nh  sau:

i c t 4

ầ ử mov xor mov si, 6 bx, bx cx, 5 ỏ ớ ộ ; si tr  t ỏ ế ; bx tr  đ n hàng ố ; cx=s  ph n t ộ ộ  trên m t c t

Clear:

ế ế ; Đ n dòng ti p theo

mov A[bx][si], 0 add bx, 1 loop Clear

7.6.

ng d ng đ  tính trung bình

ả ử ộ ớ ế ả ả ồ ở

s  m t l p Sinh viên g m 5 Sinh viên và có 4 môn thi. K t qu  cho b i m ng Score ư ề Gi (2 chi u) nh  sau:

Tên Sinh viên

MARY  SCOTT  GEORGE  BETH  SAM TEST1 67 70 82 80 78 TEST2 45 56 72 67 76 TEST3 98 87 89 95 92 TEST4 33 44 40 50 60

ể ể ề ỗ ộ t m t ch ng trình tính đi m trung bình cho m i bài thi. Đ  làm đi u này

ẽ ế Chúng ta s  vi ộ ồ ể ổ ươ có th  t ng theo c t r i chia cho 5.

ậ Thu t toán:

j=4; Repeat

ộ (*)

ổ ổ ể ấ ộ

Tính t ng theo c t j; Chia t ng cho 5 đ  l y trung bình theo c t; j=j­1

Until j=0

ướ ể ự ư ệ Trong đó, b c (*) có th  th c hi n nh  sau:

sum[j]=0; i=1; ầ For 5 l n Do sum[j]=sum[j]+Score[i,j] i=i+1

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

End_for

81

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ươ ể ế Ch ng trình có th  vi ư t nh  sau:

100h

TITLE PGM7_4: CLASS AVERAGE .Model Small .Stack .Data

Five db Score dw dw dw dw dw dw Avg 5 67, 45, 98, 33 ; MARY 70, 56, 87, 44 ; SCOTT 82, 72, 89, 40 ; GEORGE 80, 67, 95, 50 ; BETH 78, 76, 92, 60 ; SAM 5 Dup(0)

ở ạ ạ ữ ệ

.Code Main Proc mov mov mov ax, @Data ds, ax es, ax ; Kh i t o đo n d  li u ; Tuỳ

Repeat:

mov xor xor si, 6 bx, bx ax, ax ỏ ế ộ ; si tr  đ n c t th  4 ứ ấ ỏ ế ; bx tr  đ n hàng th  nh t ộ ứ ổ ; ax ch a t ng theo c t

For:

ỏ ế ứ ; bx tr  đ n hàng th  2

ax, score[bx+si] bx, 8 For

ủ ố ị

ầ ; Xoá ph n cao c a s  b  chia (dxax) ; ax=ax/5 ấ ế ả ; C t k t qu  trên m ng Avg ế ộ ế ; Đ n c t ti p theo

ủ ắ

add add loop ; Tính trung bình c t jộ dx, dx xor div Five mov Avg[si], ax si, 2 sub Repeat jnl ax, 4c00h mov 21h int ề ; Hàm v  DOS c a ng t 21h ề ; V  DOS

Main Endp End Main

ị ươ ể ươ ế ng trình có th  dùng ch ể ạ ng trình Debug đ  ch y và xem k t qu ả

Sau khi biên d ch ch ệ ằ b ng l nh DUMP.

ệ 7.7. L nh XLAT

ụ ộ ố ứ ụ ạ

ể ố ệ ừ ạ ạ  nh ng IBM Mainframes l

ể ộ ỗ đã đ

ả ư ể ả i dùng EBCDIC ( ượ ự ươ ng trình ph i thay mã ASCII c a t ng ký t d ng này sang d ng khác. Ví d  IMB   Extended Binary  ằ   c mã hoá b ng ASCII ỗ    trong chu i thành mã

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ươ ứ ầ Trong m t s   ng d ng c n ph i chuy n s  li u t ự PC dùng ASCII code cho các ký t ự Coded  Decimal  Interchange  Code). Đ  chuy n m t chu i ký t ủ ừ thành EBCDIC, m t ch EBCDIC t ộ ng  ng.

82

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ệ ạ ượ ể ể ộ ổ ị ộ c dùng đ  chuy n đ i m t giá tr  byte thành m t giá

L nh XLAT (không toán h ng) đ ộ ả ứ ị tr  khác ch a trong m t b ng.

ứ ế ầ ả ổ AL ph i ch a byte c n bi n đ i

ủ ả ứ ị ế ầ ổ ỉ DX ch a đ a ch  offset c a b ng c n bi n đ i.

ẽ ự ệ ệ L nh XLAT s  th c hi n:

ộ ả ỉ ị ỉ

ể ạ ả ủ ị ả ộ ế ấ ớ ớ ị 1. C ng n i dung c a AL v i v i đ a ch  trên BX đ  t o ra đ a ch  trong b ng. ị ớ 2. Thay th  giá tr  c u AL v i giá tr  tìm th y trong b ng.

ừ ế ộ ố Ví d :ụ  Gi

ươ ươ ứ ằ ả ử ằ ủ  s  r ng n i dung c a AL là trong vùng t ố ủ ng   đ 0 đ n 0fh và chúng ta mu n thay nó   ằ   ng   nó,   t c   là   thay   6h   b ng   36h=’6’,   thay   0bh   b ng

ế ả ổ ằ b ng   mã   ASCII   c a   s   hex   t 42h=’B’. B ng bi n đ i là:

Table db db 30h, 31h, 32h, 33h, 34h, 35h, 36h, 37h, 38h, 39h 41h, 42h, 43h, 44h, 45h, 46h

ụ ể ế ự ệ ệ ổ Ví d , đ  bi n đ i 0ch thành ‘C’, chúgn ta th c hi n các l nh sau:

ố ầ

ủ ả al, 0ch bx, Table

ổ ế ; S  c n bi n đ i ỉ ứ ị ; bx ch a đ a ch  offset c a b ng ứ ; al ch a ‘C’ mov lea xlat

ứ ế ế ở đây, XLAT tính Table+ch=Table+12 và thay th  al b i 43h. N u AL ch a m t s ộ ố

Ở ằ ẽ ả ộ ị không n m trong kho ng 0..15 thì XLAT s  cho m t giá tr  sai.

ả ộ Ví d :ụ  Mã hoá và gi i mã m t thông báo.

ươ ẽ ự ệ Ch ệ ng trình này s  th c hi n các công vi c sau:

(cid:0) ườ ử ụ ậ ộ ự i s  d ng nh p vào m t dòng ksy t .

ướ ạ ậ ắ Nh c ng (cid:0) Mã hoá nó d i d ng không nh n bi ế ượ t đ c.

(cid:0) ở In chúng ra ế  dòng ti p theo.

(cid:0) ả ở ạ ạ ầ ở Gi i mã tr  l i tr ng thái ban đ u và in ế  dòng ti p theo.

ư ậ Thu t toán nh  sau:

Print prompt Read and encode message Go to anew line Print encoded message go to a new line translate and print message

ươ ư Và ch ng trình nh  sau:

100h

TITLE PGM7_5: SECRET MESSAGE .Model Small .Stack .Data

; Alphabet Code_key

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Code_d ABCDEFGHIJKLMNOPQRSTUVWXYZ db db db 65 dup(‘ ‘), ‘XQPOGHZBCADEIJUVFMNKLRSTWY’ ự ủ ả  c a b ng mã ASCII 37 dup(‘ ‘) ự ượ  đ 80 dup(‘$’) ; 128 ký t ; 80 ký t c gõ vào

83

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Decode_key

65 dup(‘ ‘), ‘JHIKLQEFMNTURSDCBVWXOPYAZG’ 37 dup(‘ ‘)

Promptdb crlf db db ‘Enter a message: ‘, 0dh, 0ah, ‘$’ db 0dh, 0ah, ‘$’

;Tuỳ

ể ắ ị ấ ; Hi n th  d u nh c

.Code Main Proc mov mov mov mov lea int mov lea lea ax, @Data ds, ax es, ax ah, 9 dx, Prompt 21h ah, 1 bx, Code_key di, Code_d ỏ ớ ; bx tr  t ỏ ớ ; di tr  t i Code_key ự i dòng ký t đã má hoá

While:

ự vào al

ế 21h al, 0dh End_while

ọ ; Đ c ký t ; Enter? ả ; Ph i, k t thúc ; Không, mã hoá ký tự ự ấ ; C t ký t ử ; X  lý ký t trong Code_d ự ế  ti p theo

ố ; Xu ng dòng

ể ự đã mã hoá

; Xu ng dòng ị ể ự i mã dòng ký t ố  đã mã hoá và hi n th  nó

ứ ị i mã

ỏ ớ ự int cmp je xlat [di], al mov jmp While ah, 9 mov End_while: dx, crlf lea 21h int ị ; Hi n th  dòng ký t dx, Code_d lea 21h int dx, crlf lea int 21h ả ; Gi mov lea lea ah, 2 bx, Decod_key si, Code_d ; bx ch a đ a ch  b ng gi ; si tr  t ỉ ả i dòng ký t ả  đã mã hoá

While1:

ộ ấ ự đã mã hoá

ố ự ừ  dòng ký t  t ỗ

al, [si] al, ‘$’ End_while1

ủ ắ

; L y m t ký t ế ; Đã đ n cu i chu i? ế ả ; Ph i, k t thúc ả i mã ; Không, gi ự ặ  vào dl ; Đ t ký t ằ ể ị ; và hi n th  nó b ng hàm 2 c a ng t 21h ự ế ỏ  ti p theo ; si tr  vào ký t

mov cmp je xlat mov dl, al int 21h si inc jmp While1

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

End_while1: mov ah, 4ch

84

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

int 21h ề ; V  DOS

Main Endp End Main

ươ ạ ố ệ ớ ị Trong ch ng trình có đo n s  li u v i các đ nh nghĩa sau:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

ế ả ữ ế ; Alphabet ; cho bi t b ng ch  cái ti ng Anh

Code_key

db db ; 128 ký t

c a b ng mã ASCII ự ứ ự ự ủ ả 65 dup(‘ ‘), ‘XQPOGHZBCADEIJUVFMNKLRSTWY’ ự ủ ả 37 dup(‘ ‘)  c a b ng mã ASCII, trong đó th  t ỳ  là tu  ý. các ký t ; Khai báo 128 ký t

80 dup(‘$’) ự ượ  đ

c gõ vào ắ ; 80 ký t ị ằ db ầ ể ể ể Code_d ị ; Giá tr  ban đ u là ‘$’ đ  có th  hi n th  b ng hàm 9, ng t 21h

Decode_key

ầ ả ượ ế ậ db db c thi

65 dup(‘ ‘), ‘JHIKLQEFMNTURSDCBVWXOPYAZG’ 37 dup(‘ ‘) t l p theo cách mã hoá, nghĩa là trong ph n mã hoá chúng ả ự ả i mã ph i thành ‘A’. ... Các ký t gõ vào

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ả ể ự ố ; B ng mã đ ; ta đã mã hoá ‘A’ thành ‘X’ vì v y khi gi ự ; không ph i là ký t ậ ẽ ề ượ  hoa s  đ u đ c chuy n thành ký t tr ng.

85

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Ụ Ụ

PH  L C 1: INTEL 80X86 INSTRUCTION SET

Intel 8086 Family Architecture

General Purpose Registers

AH/AL AX (EAX) BH/BL BX (EBX) CH/CL CX (ECX) DH/DL DX (EDX) Accumulator Base Counter Data

(Exx) indicates 386 + 32 bit register Segment Registers Code Segment Data Segment Stack Segment Extra Segment 386 and newer 386 and newer CS DS SS ES (FS) (GS)

Pointer Registers Stack Registers

SP (ESP) BP (EBP) Stack Pointer Base Pointer Source Index Destination Index Instruction Pointer

SI (ESI) DI (EDI)  IP      Status Registers

FLAGS Status Flags (see FLAGS)

Special Registers (386+ only)

CR0 CR2 CR3 Control Register 0 Control Register 2 Control Register 3

DR0 Debug Register 0 DR1 Debug Register 1 DR2 Debug Register 2 DR3 Debug Register 3 DR6 Debug Register 6 DR7 Debug Register 7

TR4 TR5 TR6 TR7 Test Register 4 Test Register 5 Test Register 6 Test Register 7

Register

BP SI or DI DI strings SI strings Default Segment SS DS ES DS Valid Overrides DS, ES, CS ES, SS, CS None ES, SS, CS

­ see CPU  DETECTING Instruction Timing

Instruction Clock Cycle Calculation

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Some instructions require additional clock cycles due to a "Next Instruction Component"  identified by a "+m" in the instruction clock cycle listings. This is due to the prefetch queue  being purge on a control transfers. Below is the general rule for calculating "m": ­ 88/86 not applicable ­ 286 "m" is the number of bytes in the next instruction ­ 386 "m" is the number of components in the next instruction (the instruction coding (each  byte), plus the data and the displacement are all considered components)

86

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

8088/8086 Effective Address (EA) Calculation

Description

Clock Cycles 6 5 9 7 8 11 12

Displacement Base or Index (BX,BP,SI,DI) Displacement+(Base or Index) Base+Index (BP+DI,BX+SI) Base+Index (BP+SI,BX+DI) Base+Index+Displacement (BP+DI,BX+SI) Base+Index+Displacement (BP+SI+disp,BX+DI+disp) ­ add 4 cycles for word operands at odd addresses ­ add 2 cycles for segment override ­ 80188/80186 timings differ from those of the 8088/8086/80286

Task State Calculation

"TS" is defined as switching from VM/486 or 80286 TSS to one of the following: New Task

486 TSS (VM=0) 486 TSS (VM=1)

386 TSS (VM=0) 309 314 307 386 TSS (VM=1) 226 231 224

199 177 286 TSS (VM=1) 282 287 280 180 Old Task 386 TSS (VM=0) 386 TSS (VM=1) 386 CPU/286 TSS 486 CPU/286 TSS

Miscellaneous

­ all timings are for best case and do not take into account wait states, instruction alignment,  the   state   of   the   prefetch   queue,   DMA   refresh   cycles,   cache   hits/misses   or   exception  processing. ­   to   convert   clocks   to   nanoseconds   divide   one   microsecond   by   the   processor   speed   in  MegaHertz: (1000MHz/(n MHz)) = X nanoseconds ­ see  8086 Architecture

FLAGS ­ Intel 8086 Family Flags Register

MSW ­ Machine Status Word (286+ only)

PE Protection Enable, switches processor between protected and real mode.

EM Emulation, indicates whether coprocessor functions are to be emulated. TS Task Switched, set and interrogated by coprocessor on task switches and

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Bit 0 Bit 1 MP Math Present, controls function of the WAIT instruction. Bit 2 Bit 3 when interpretting coprocessor instructions.

87

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

ET

Extension Type, indicates type of coprocessor in system. Reserved. Paging, indicates whether the processor uses page tables to translate linear PG

Bit 4 Bits 5­30 bit 31 addresses to physical addresses. ­ see SMSW LMSW.

8086/80186/80286/80386/80486 Instruction Set

AAA ­ Ascii Adjust for Addition

Usage: AAA Modifies flags: AF, CF (OF, PF, SF, ZF undefined)

Changes contents of AL to valid unpacked decimal. The high order nibble is zeroed.

Clocks Size Bytes

Operands None 808x 8 286 3 386 4 486 3 1

AAD ­ Ascii Adjust for Division

Usage: AAD Modifies flags: SF, ZF, PF (AF, CF, OF undefined)

Used before dividing unpacked decimal numbers. Multiplies AH by 10 and the adds result

into AL. Sets AH to zero. This instruction is also known to have an undocumented behavior.

AL:= 10*AH+AL AH:= 0 Clocks Size Bytes

Operands none 808x 60 286 14 386 19 486 14 2

AAM ­ Ascii Adjust for Multiplication

Usage: AAM Modifies flags: PF, SF, ZF (AF, CF, OF undefined)

AH:= AL/10 AL:= AL mod 10

Used after multiplication of two unpacked decimal numbers, this instruction adjusts an  unpacked decimal number. The high order nibble of each byte must be zeroed before using this  instruction. This instruction is also known to have an undocumented behavior. Clocks Size Bytes

Operands none 808x 83 286 16 386 17 486 15 2

AAS ­ Ascii Adjust for Subtraction

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Usage: AAS Modifies flags: AF, CF (OF, PF, SF, ZF undefined)

88

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Corrects result of a previous unpacked decimal subtraction in AL. High order nibble is

zeroed. Clocks Size Bytes

808x 8 286 3 386 4 486 3 1 Operands none

ADC ­ Add With Carry

Usage: ADC dest, src Modifies flags: AF, CF, OF, SF, PF, ZF

Sums two binary operands placing the result in the destination. If CF is set, a 1 is added to

the destination. Clocks Size Bytes

808x 3 16+EA 9+EA 4 17+EA 4 386 2 7 6 2 7 2 286 2 7 7 3 7 3 486 1 3 2 1 3 1 2 2­4 (W88=24+EA) 2­4 (W88=13+EA) 3­4 3­6 (W88=23+EA) 2­3 Operands reg, reg mem, reg reg, mem reg, immed mem, immed accum, immed

ADD ­ Arithmetic Addition

Usage: ADD dest, src Modifies flags: AF, CF, OF, PF, SF, ZF

Adds  "src"  to "dest" and replacing  the original  contents  of "dest".  Both operands  are

binary. Clocks Size Bytes

808x 3 16+EA 9+EA 4 17+EA 4 386 2 7 6 2 7 2 286 2 7 7 3 7 3 486 1 3 2 1 3 1 2 2­4 (W88=24+EA) 2­4 (W88=13+EA) 3­4 3­6 (W88=23+EA) 2­3 Operands reg, reg mem, reg reg, mem reg, immed mem, immed accum, immed

AND ­ Logical And

Usage: AND dest, src Modifies flags: CF, OF, PF, SF, ZF (AF undefined)

Performs a logical AND of the two operands replacing the destination with the result. Clocks Size Bytes

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

808x 3 16+EA 9+EA 4 17+EA 386 2 7 6 2 7 286 2 7 7 3 7 486 1 3 1 1 3 2 2­4 (W88=24+EA) 2­4 (W88=13+EA) 3­4 3­6 (W88=23+EA) Operands reg, reg mem, reg reg, mem reg, immed mem, immed

89

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

accum, immed 4 3 2 1 2­3

ARPL ­ Adjusted Requested Privilege Level of Selector (286+ PM)

Usage: ARPL dest, src (286+ protected mode) Modifies flags: ZF

Compares the RPL bits of "dest" against "src". If the RPL bits of “dest” are less than   "src", the destination RPL bits are set equal to the source RPL bits and the Zero Flag is set.   Otherwise the Zero Flag is cleared. Clocks Size Bytes

Operands reg, reg mem, reg 808x ­ ­ 286 10 11 386 20 21 486 9 9 2 4

BOUND ­ Array Index Bound Check (80188+) src, limit

Usage: BOUND Modifies flags: None

Array index in source register is checked against upper and lower bounds in memory  source. The first word located at "limit" is the lower boundary and the   word   at   "limit+2"   is   the  upper array bound. Interrupt 5 occurs if the source value is less than or higher than the source. Clocks Size Bytes

Operands reg16, mem32 reg32, mem64 808x ­ ­ 286 nj=13 nj=13 386 nj=10 nj=10 486 7 7 2 2

­ nj = no jump taken

BSF ­ Bit Scan Forward (386+) dest, src Usage: BSF Modifies flags: ZF

Scans source operand for first bit set. Sets ZF if a bit is found set and loads the destination  with an index to first set bit. Clears ZF is no bits are found set. BSF scans forward across bit  pattern (0­n) while BSR scans in reverse (n­0). Clocks Size Bytes Operands

reg, reg reg, mem reg32, reg32 reg32, mem32 808x ­ ­ ­ ­ 286 ­ ­ ­ ­ 386 10+3n 10+3n 10+3n 10+3n 486 6­42 7­43 6­42 7­43 3 3­7 3­7 3­7

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

BSR ­ Bit Scan Reverse (386+) Usage: BSR dest, src Modifies flags: ZF

90

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Scans source operand for first bit set. Sets ZF if a bit is found set and loads the destination  with an index to first set bit. Clears ZF is no bits are found set. BSF scans forward across bit  pattern (0­n) while BSR scans in reverse (n­0). Clocks Size Bytes Operands

reg, reg reg, mem reg32, reg32 reg32, mem32 808x ­ ­ ­ ­ 286 ­ ­ ­ ­ 386 10+3n 10+3n 10+3n 10+3n 486 6­103 7­104 6­103 7­104 3 3­7 3­7 3­7

reg32 BSWAP ­ Byte Swap    (486+) Usage: BSWAP Modifies flags: None

Changes the byte order of a 32 bit register from big endian to little endian or vice versa.

Result left in destination register is undefined if the operand is a 16 bit register. Clocks Size Bytes Operands reg32 808x ­ 286 ­ 386 ­ 486 1 2

BT ­ Bit Test  (386+) dest, src Usage: BT Modifies flags: CF

The destination bit indexed by the source value is copied into the Carry Flag.

Clocks Size Bytes

Operands reg16, immed8 mem16, immed8 reg16, reg16 mem16, reg16 808x ­ ­ ­ ­ 286 ­ ­ ­ ­ 386 3 6 3 12 486 3 6 3 12 4­8 4­8 3­7 3­7

BTC ­ Bit Test with Compliment (386+) Usage: BTC dest, src Modifies flags: CF

The destination bit indexed by the source value is copied into the Carry Flag after being

complimented (inverted). Clocks Size Bytes

808x ­ ­ ­ ­ 286 ­ ­ ­ ­ 386 6 8 6 13 486 6 8 6 13 Operands reg16, immed8 mem16, immed8 reg16, reg16 mem16, reg16 4­8 4­8 3­7 3­7

BTR ­ Bit Test with Reset (386+)

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Usage: BTR dest, src Modifies flags: CF

91

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

The destination bit indexed by the source value is copied into the Carry Flag and then

cleared in the destination. Clocks Size Bytes

Operands reg16, immed8 mem16, immed8 reg16, reg16 mem16, reg16 808x ­ ­ ­ ­ 286 ­ ­ ­ ­ 386 6 8 6 13 486 6 8 6 13 4­8 4­8 3­7 3­7

BTS ­ Bit Test and Set (386+) dest, src Usage: BTS Modifies flags: CF

The destination bit indexed by the source value is copied into the Carry Flag and then set

in the destination. Clocks Size Bytes

Operands reg16, immed8 mem16, immed8 reg16, reg16 mem16, reg16 808x ­ ­ ­ ­ 286 ­ ­ ­ ­ 386 6 8 6 13 486 6 8 6 13 4­8 4­8 3­7 3­7

CALL ­ Procedure Call

Usage: CALL destination Modifies flags: None

Pushes Instruction Pointer (and Code Segment for far calls) onto stack and loads

Instruction Pointer with the address of proc­name. Code continues with execution at CS:IP. Clocks Operands

rel16 (near, IP relative) rel32 (near, IP relative) 808x 19 ­ 286 7 ­ 386 7+m 7+m 486 3 3

reg16 (near, register indirect) reg32 (near, register indirect) 16 ­ 7 ­ 7+m 7+m 5 5

mem16 (near, memory indirect) mem32 (near, memory indirect) ­ ­ 21+EA ­ 11 10+m 5 5

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

ptr16:16 (far, full ptr supplied) ptr16:32 (far, full ptr supplied) ptr16:16 (far, ptr suppplied, prot. mode) ptr16:32 (far, ptr supplied, prot. mode) m16:16 (far, indirect) m16:32 (far, indirect) m16:16 (far, indirect, prot. mode) m16:32 (far, indirect, prot. mode) 28 ­ ­ ­ 37+EA ­ ­ ­ 13 ­ 26 ­ 16 ­ 29 ­ 17+m 17+m 34+m 34+m 22+m 22+m 38+m 38+m 18 18 20 20 17 17 20 20

92

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

­ ­ ­ ­ 177 180/185 ­ ­ TS 5+TS TS 5+TS 37+TS 37+TS 37+TS 37+TS ptr16:16 (task, via TSS or task gate) ptr16:32 (task, via TSS or task gate) m16:16 (task) m16:32 (task)

­ ­ ­ ­ 41 ­ 44 ­ 52+m 52+m 56+m 56+m 35 35 35 35 ptr16:16 (gate, same privilege) ptr16:32 (gate, same privilege) m16:16 (gate, same privilege) m16:32 (gate, same privilege)

­ ­ ­ ­ 82 ­ 83 ­ 86+m 86+m 90+m 90+m 69 69 69 69 ptr16:16 (gate, more priv, no parm) ptr16:32 (gate, more priv, no parm) m16:16 (gate, more priv, no parm) m16:32 (gate, more priv, no parm)

­ ­ ­ ­ 86+4x ­ 90+4x ­ 94+4x+m 94+4x+m 98+4x+m 98+4x+m 77+4x 77+4x 77+4x 77+4x ptr16:16 (gate, more priv, x parms) ptr16:32 (gate, more priv, x parms) m16:16 (gate, more priv, x parms) m16:32 (gate, more priv, x parms)

CBW ­ Convert Byte to Word Usage: CBW Modifies flags: None

Converts byte in AL to word Value in AX by extending sign of AL throughout register

AH. Clocks Size Bytes

Operands none 808x 2 286 2 386 3 486 3 1

CDQ ­ Convert Double to Quad (386+)

Usage: CDQ Modifies flags: None

Converts signed DWORD in EAX to a signed quad word in EDX:EAX by extending the

high order bit of EAX throughout EDX Clocks Size Bytes

Operands none 808x ­ 286 ­ 386 2 486 3 1

CLC ­ Clear Carry Usage: CLC Modifies flags: CF

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Clears the Carry Flag. Clocks Size Bytes Operands 808x 286 386 486

93

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

none 2 2 2 2 1

CLD ­ Clear Direction Flag Usage: CLD Modifies flags: DF

Clears the Direction Flag causing string instructions to increment the SI and DI index

registers. Clocks Size Bytes

1 Operands none 808x 2 286 2 386 2 486 2

CLI ­ Clear Interrupt Flag (disable)

Usage: CLI Modifies flags: IF

Disables   the   maskable   hardware   interrupts   by   clearing   the   Interrupt   flag.   NMI's   and

software interrupts are not inhibited. Clocks Size Bytes

1 Operands none 808x 2 286 2 386 3 486 5

CLTS ­ Clear Task Switched Flag (286+ privileged)

Usage: CLTS Modifies flags: None

Clears   the   Task   Switched   Flag   in   the   Machine   Status   Register.   This   is   a   privileged

operation and is generally used only by operating system code. Clocks Size Bytes

2 Operands none 808x ­ 286 2 386 5 486 7

CMC ­ Complement Carry Flag

Usage: CMC Modifies flags: CF

Toggles (inverts) the Carry Flag Clocks Size Bytes

1 Operands none 808x 2 286 2 386 2 486 2

CMP ­ Compare

Usage: CMP dest, src Modifies flags: AF, CF, OF, PF, SF, ZF

Subtracts source from destination and updates the flags but does not save result. Flags can

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

subsequently be checked for conditions.

94

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Clocks Size Bytes Operands

reg, reg mem, reg reg, mem reg, immed mem, immed accum, immed 808x 3 9+EA 9+EA 4 10+EA 4 286 2 7 6 3 6 3 386 2 5 6 2 5 2 486 1 2 2 1 2 1 2 2­4 (W88=13+EA) 2­4 (W88=13+EA) 3­4 3­6 (W88=14+EA) 2­3

CMPS ­ Compare String (Byte, Word or Doubleword) Usage: CMPS dest, src

CMPSB CMPSW CMPSD (386+) Modifies flags: AF, CF, OF, PF, SF, ZF

Subtracts destination value from source without saving results. Updates flags based on the  subtraction and the index registers (E)SI and (E)DI are incremented or decremented depending on  the   state   of   the   Direction   Flag.   CMPSB   inc/decrements   the   index   registers   by   1,   CMPSW  inc/decrements by 2, while CMPSD increments or decrements by 4. The REP prefixes can be  used to process entire data items. Clocks Size Bytes

Operands dest,src 808x 22 286 8 386 10 486 8 1 (W88=30)

CMPXCHG ­ Compare and Exchange

Usage: CMPXCHG dest, src (486+) Modifies flags: AF, CF, OF, PF, SF, ZF

Compares the accumulator (8­32 bits) with "dest". If equal the “dest” is loaded with "src",

otherwise the accumulator is loaded with "dest". Clocks Size Bytes Operands

reg, reg mem, reg 808x ­ ­ 286 ­ ­ 386 ­ ­ 486 6 7 2 2

­ add 3 clocks if the “mem,reg” comparison fails

CWD ­ Convert Word to Doubleword

Usage: CWD Modifies flags: None

Extends sign of word in register AX throughout register DX forming a Dword quantity in

DX:AX. Clocks Size Bytes

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Operands none 808x 5 286 2 386 2 486 3 1

95

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

CWDE ­ Convert Word to Extended Doubleword (386+)

Usage: CWDE Modifies flags: None

Converts a signed word in AX to a signed doubleword in EAX by extending the sign bit

of AX throughout EAX. Clocks Size Bytes

Operands none 808x ­ 286 ­ 386 3 486 3 1

DAA ­ Decimal Adjust for Addition

Usage: DAA Modifies flags: AF, CF, PF, SF, ZF (OF undefined)

Corrects result (in AL) of a previous BCD addition operation. Contents of AL are changed

to a pair of packed decimal digits. Clocks Size Bytes

Operands none 808x 4 286 3 386 4 486 2 1

DAS ­ Decimal Adjust for Subtraction

Usage: DAS Modifies flags: AF, CF, PF, SF, ZF (OF undefined)

Corrects  result (in AL) of a previous BCD subtraction operation. Contents  of AL are

changed to a pair of packed decimal digits. Clocks Size Bytes

Operands none 808x 4 286 3 386 4 486 2 1

DEC ­ Decrement

Usage: DEC dest Modifies flags: AF, OF, PF, SF, ZF

Unsigned binary subtraction of one from the destination. Clocks Size Bytes Operands

808x 3 15+EA 3 286 2 7 2 386 2 6 2 486 1 3 1 2 2­4 1 reg8 mem reg16/32

DIV ­ Divide

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Usage: DIV src Modifies flags: (AF, CF, OF, PF, SF, ZF undefined)

96

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Unsigned binary division of accumulator by source. If the source divisor is a byte value  then AX is divided by "src" and the quotient is placed in AL and the remainder in AH. If source  operand is a word value, then DX:AX is divided by "src" and the quotient is stored in AX and the  remainder in DX. Clocks Size Bytes Operands

reg8 reg16 reg32 mem8 808x 80­90 144­162 ­ (86­96)+EA 286 14 22 ­ 17 386 14 22 38 17 486 16 24 40 16

mem16 (150­168)+EA 25 25 24

mem32 ­ ­ 41 40 2 2 2 2­4 2­4 (W88=158­176+EA) 2­4

ENTER ­ Make Stack Frame (80188+) locals, level Usage: ENTER Modifies flags: None

Modifies stack for entry to procedure for high level language. Operand "locals" specifies  the amount of storage to be allocated on the stack. "Level" specifies the nesting level of the  routine. Paired with the LEAVE instruction, this   is   an   efficient   method   of   entry   and   exit   to  procedures. Clocks Size Bytes Operands

808x ­ ­ ­ 286 11 15 12+4(n­1) 386 10 12 15+4(n­1) 486 14 17 17+3n 4 4 4 immed16, 0 immed16, 1 immed16, immed8

ESC ­ Escape

Usage: ESC   immed,src Modifies flags: None

Provides access to the data bus for other resident processors. The CPU treats it as a NOP

but places memory operand on bus. Clocks Size Bytes 486 Operands

808x 2 2 286 9­20 9­20 386 ? ? 2 2­4 immed, reg immed, mem

HLT ­ Halt CPU

Usage: HLT Modifies flags: None

Halts CPU until RESET line is activated, NMI or maskable interrupt received. The CPU

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

becomes dormant but retains the current CS:IP for later restart. Clocks Size Bytes Operands 808x 286 386 486

97

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

none 2 2 5 4 1

IDIV ­ Signed Integer Division Usage: IDIV src Modifies flags: (AF, CF, OF, PF, SF, ZF undefined)

Signed binary division of accumulator by source. If source is a byte value, AX is divided  by "src" and the quotient is stored in AL and the remainder in AH. If source is a word value,  DX:AX is divided by "src", and the quotient is stored in AL and the remainder in DX. Clocks Size Bytes Operands

reg8 reg16 reg32 mem8 mem16 mem32 808x 101­112 165­184 ­ (107­118)+EA (171­190)+EA ­ 286 17 25 ­ 20 38 ­ 386 19 27 43 22 30 46 486 19 27 43 20 28 44 2 2 2 2­4 2­4 (W88=175­194) 2­4

IMUL ­ Signed Multiply Usage: IMUL src

IMUL src, immed IMUL dest, src, immed8 IMUL dest, src (286+) (286+) (386+) Modifies flags: CF, OF (AF, PF, SF, ZF undefined)

Signed multiplication of accumulator by "src" with result placed in the accumulator. If the  source operand is a byte value, it is multiplied by AL and the result stored in AX. If the source   operand is a word value it is multiplied by AX and the result is stored in DX:AX. Other variations  of   this   instruction   allow   specification   of   source   and   destination   registers   as   well   as   a   third  immediate factor. Clocks Size Bytes Operands

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

reg8 reg16 reg32 mem8 mem16 mem32 reg16, reg16 reg32, reg32 reg16, mem16 reg32, mem32 reg16, immed reg32, immed reg16, reg16, immed reg32, reg32, immed reg16, mem16, immed reg32, mem32, immed 808x 80­98 128­154 ­ 86­104 134­160 ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ 286 13 21 ­ 16 24 ­ ­ ­ ­ ­ 21 21 2 21 24 24 386 9­14 9­22 9­38 12­17 12­25 12­41 9­22 9­38 12­25 12­41 9­22 9­38 9­22 9­38 12­25 12­41 486 13­18 13­26 12­42 13­18 13­26 13­42 13­26 13­42 13­26 13­42 13­26 13­42 13­26 13­42 13­26 13­42 2 2 2 2­4 2­4 2­4 3­5 3­5 3­5 3­5 3 3­6 3­6 3­6 3­6 3­6

98

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

IN ­ Input Byte or Word From Port accum, port Usage: IN Modifies flags: None

A byte, word or dword is read from "port" and placed in AL, AX or EAX respectively. If  the port number is in the range of 0­255 it can be specified as an immediate, otherwise the port  number must be specified in DX. Valid port ranges on the PC are 0­1024, though values through  65535 may be specified and recognized by third party vendors and PS/2's. Clocks Size Bytes

808x 10/14 286 5

8/12 5 Operands accum, immed8 accum, immed8 (PM) accum, DX accum, DX (PM) 386 12 6/26 13 7/27 486 14 8/28/27 14 8/28/27 2 2 1 1

­ 386+ protected mode timings depend on privilege levels.

First number is the timing if: Second number is the timing if:

Third number is the timing when: CPL<= IOPL CPL > IOPL or in VM 86 mode (386) CPL>= IOPL (486) virtual mode on 486 processor ­486 virtual mode always requires 27 cycles

INC ­ Increment

Usage: INC dest Modifies flags: AF, OF, PF, SF, ZF

Adds one to destination unsigned binary operand. Clocks Size Bytes Operands

reg8 reg16 reg32 mem 808x 3 3 3 15+EA 286 2 2 2 7 386 2 2 2 6 486 1 1 1 3 2 1 1 2­4 (W88=23+EA)

INS ­ Input String from Port (80188+) Usage: INS dest, port

INSB INSW INSD (386+) Modifies flags: None

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Loads   data   from   port   to   the   destination   ES:(E)DI   (even   if   a   destination   operand   is  supplied). (E)DI is adjusted by the size of the operand and increased if the Direction Flag is  cleared  and decreased if the Direction  Flag is set. For INSB, INSW, INSD  no operands  are  allowed and the size is determined by the mnemonic. Clocks Size Bytes

99

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Operands

dest, port dest, port (PM) none none (PM) 808x ­ ­ ­ ­ 286 5 5 5 5 386 15 9/29 15 9/29 486 17 10/32/30 17 10/32/30 1 1 1 1

­ 386+ protected mode timings depend on privilege levels.

first number is the timing if: second number is the timing if: third number is the timing if: CPL<= IOPL CPL > IOPL virtual mode on 486 processor

INT ­ Interrupt num Usage: INT Modifies flags: TF, IF

Initiates a software interrupt by pushing the flags, clearing the Trap and Interrupt Flags,  pushing CS followed by IP and loading CS:IP with the value found in the interrupt vector table.  Execution then begins at the location addressed by the new CS:IP Clocks

Operands

3 (constant) 3 (prot. mode, same priv.) 3 (prot. mode, more priv.) 3 (from VM86 to PL 0) 3 (prot. mode via task gate) immed8 immed8 (prot. mode, same priv.) immed8 (prot. mode, more priv.) immed8 (from VM86 to PL 0) immed8 (prot. mode, via task gate) 808x 52/72 ­ ­ ­ ­ 51/71 ­ ­ ­ ­ 286 23+m 40+m 78+m ­ 167+m 23+m 40+m 78+m ­ 167+m 386 33 59 99 119 TS 37 59 99 119 TS 486 26 44 71 82 37+TS 30 44 71 86 37+TS Size  Bytes 2 2 2 2 2 1 1 1 1 1

INTO ­ Interrupt on Overflow Usage: INTO Modifies flags: IF, TF

If the Overflow Flag is set this instruction generates an INT 4 which causes the code

addressed by 0000:0010 to be executed. Clocks Operands

Size  Bytes 1

808x 53/73 4 ­ ­ ­ none:  jump no jump (prot. mode, same priv.) (prot. mode, more priv.) (from VM86 to PL 0) (prot. mode, via task gate) 286 24+m 3 ­ ­ ­ ­ 386 35 3 59 99 119 TS 486 28 3 46 73 84 39+TS 1 1 1 1

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

INVD ­ Invalidate Cache (486+)

100

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Usage: INVD Modifies flags: None

Flushes CPU internal cache. Issues special function bus cycle which indicates to flush

external caches. Data in write­back external caches is lost. Clocks Size Bytes

Operands none 808x ­ 286 ­ 386 ­ 486 4 2

INVLPG ­ Invalidate Translation Look­Aside Buffer Entry (486+)

Usage: INVLPG Modifies flags: None

Invalidates a single page table entry in the Translation Look­Aside Buffer. Intel warns that

this instruction may be implemented differently on future processors. Clocks Size Bytes

Operands none 808x ­ 286 ­ 386 ­ 486 12 2

­ timing is for TLB entry hit only.

IRET/IRETD ­ Interrupt Return Usage: IRET IRETD (386+) Modifies flags: AF, CF, DF, IF, PF, SF, TF, ZF

Returns control to point of interruption by popping IP, CS and then the Flags from the  stack   and   continues   execution   at   this   location.   CPU   exception   interrupts   will   return   to   the  instruction that cause the exception because the CS:IP placed on the stack during the interrupt is  the address of the offending instruction. Clocks Operands

iret iret (prot. mode) iret (to less privilege) iret (different task, NT=1) iretd iretd (to less privilege) iretd (to VM86 mode) iretd (different task, NT=1) 808x 32/44 ­ ­ ­ ­ ­ ­ ­ 286 17+m 31+m 55+m 169+m ­ ­ ­ ­ 386 22 38 82 TS 22/38 82 60 TS 486 15 15 36 TS+32 15 36 15 TS+32 Size  Bytes 1 1 1 1 1 1 1 1

­ 386 timings are listed as real­mode/protected­mode

Jxx ­ Jump Instructions Table Mnemonic Meaning Jump Condition

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

JA JAE Jump if Above Jump if Above or Equal CF=0 and ZF=0 CF=0

101

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

JB JBE JC JCXZ JE JG JGE JL JLE JMP JNA JNAE JNB JNBE JNC JNE JNG JNGE JNL JNLE JNO JNP JNS JNZ JO JP JPE JPO JS JZ Jump if Below Jump if Below or Equal Jump if Carry Jump if CX Zero Jump if Equal Jump if Greater (signed) Jump if Greater or Equal (signed) Jump if Less (signed) Jump if Less or Equal (signed) Unconditional Jump Jump if Not Above Jump if Not Above or Equal Jump if Not Below Jump if Not Below or Equal Jump if Not Carry Jump if Not Equal Jump if Not Greater (signed) Jump if Not Greater or Equal (signed) Jump if Not Less (signed) Jump if Not Less or Equal (signed) Jump if Not Overflow (signed) Jump if No Parity Jump if Not Signed (signed) Jump if Not Zero Jump if Overflow (signed) Jump if Parity Jump if Parity Even Jump if Parity Odd Jump if Signed (signed) Jump if Zero CF=1 CF=1 or ZF=1 CF=1 CX=0 ZF=1 ZF=0 and SF=OF SF=OF SF != OF ZF=1 or SF != OF unconditional CF=1 or ZF=1 CF=1 CF=0 CF=0 and ZF=0 CF=0 ZF=0 ZF=1 or SF != OF SF != OF SF=OF ZF=0 and SF=OF OF=0 PF=0 SF=0 ZF=0 OF=1 PF=1 PF=1 PF=0 SF=1 ZF=1

Clocks Size Bytes

2 Jx:

4 Jx: Operands jump no jump near­label no jump 808x 16 4 ­ ­ 286 7+m 3 ­ ­ 386 7+m 3 7+m 3 486 3 1 3 1

­ It’s a good programming practice to organize code so the expected case is executed  without without a jump since the actual jump takes longer to execute than falling through the test. ­ see JCXZ and JMP for their respective timings

JCXZ/JECXZ ­ Jump if Register (E)CX is Zero Usage: JCXZ label label (386+) JECXZ Modifies flags: None

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Causes execution to branch to "label" if register CX is zero. Uses unsigned comparision.

102

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Clocks Size Bytes

label: 2 Operands jump no jump 808x 18 6 286 8+m 4 386 9+m 5 486 8 5

JMP ­ Unconditional Jump Usage: JMP target Modifies flags: None

Unconditionally transfers control to "label". Jumps by default are within ­32768 to 32767  bytes from the instruction following the jump. NEAR and SHORT jumps cause the IP to be  updated while FAR jumps cause CS and IP to be updated. Clocks Operands

rel8 (relative) rel16 (relative) rel32 (relative) reg16 reg32 mem16 mem32 ptr16:16 (far, dword immed) ptr16:16 (far, PM dword immed) ptr16:16 (call gate, same priv.) ptr16:16 (via TSS) ptr16:16 (via task gate) mem16:16 (far, indirect) mem16:16 (far, PM indirect) mem16:16 (call gate, same priv.) mem16:16 (via TSS) mem16:16 (via task gate) ptr16:32 (far, 6 byte immed) ptr16:32 (far, PM 6 byte immed) ptr16:32 (call gate, same priv.) ptr16:32 (via TSS) ptr16:32 (via task gate) m16:32 (far, address at dword) m16:32 (far, address at dword) m16:32 (call gate, same priv.) m16:32 (via TSS) m16:32 (via task gate) 808x 15 15 ­ 11 ­ 18+EA 24+EA ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ 286 7+m 7+m ­ 7+m ­ 11+m 15+m ­ ­ 38+m 175+m 180+m ­ ­ 41+m 178+m 183+m ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ 386 7+m 7+m 7+m 7+m 7+m 10+m 10+m 12+m 27+m 45+m TS TS 43+m 31+m 49+m 5+TS 5+TS 12+m 27+m 45+m TS TS 43+m 31+m 49+m 5+TS 5+TS 486 3 3 3 5 5 5 5 17 19 32 42+TS 43+TS 13 18 31 41+TS 42+TS 13 18 31 41+TS 42+TS 13 18 31 41+TS 42+TS

LAHF ­ Load Register AH From Flags

Usage: LAHF Modifies flags: None

Copies bits 0­7 of the flags register into AH. This includes flags AF, CF, PF, SF and ZF

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

other bits are undefined.

103

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

AH:= SF ZF xx AF xx PF xx CF Clocks Size Bytes

Operands none 808x 4 286 2 386 2 486 3 1

LAR ­ Load Access Rights (286+ protected)

Usage: LAR dest, src Modifies flags: ZF

The high byte of the of the destination register is overwritten by the value of the access  rights byte and the low order byte is zeroed depending on the selection in the source operand. The  Zero Flag is set if the load operation is successful. Clocks Size Bytes Operands

reg16, reg16 reg32, reg32 reg16, mem16 reg32, mem32 808x ­ ­ ­ ­ 286 14 ­ 16 ­ 386 15 15 16 16 486 11 11 11 11 3 3 3­7 3­7

LDS ­ Load Pointer Using DS dest, src Usage: LDS Modifies flags: None

Loads  32­bit pointer  from memory  source to destination  register  & DS. The offset is  placed in the destination register and the segment is placed in DS. To use this instruction the word  at the lower memory address must contain the offset and the word at the higher address must  contain the segment. This simplifies the loading of far pointers from the stack and the interrupt  vector table. Clocks Size Bytes Operands

reg16, mem32 reg, mem (PM) 808x 16+EA ­ 286 7 ­ 386 7 22 486 6 12 2­4 5­7

LEA ­ Load Effective Address Usage: LEA dest, src Modifies flags: None

Transfers offset address of "src" to the destination register. Clocks Size Bytes

Operands reg,mem 808x 2+EA 286 3 386 2 486 1 2­4

­ the MOV instruction can often save clock cycles when used in place of LEA on 8088

processors

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

LEAVE ­ Restore Stack for Procedure Exit (80188+)

104

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Usage: LEAVE Modifies flags: None

Releases the local variables created by the previous ENTER instruction by restoring SP

and BP to their condition before the procedure stack frame was initialized. Clocks Size Bytes

Operands none 808x ­ 286 5 386 4 486 5 1

LES ­ Load Pointer Using ES dest, src Usage: LES Modifies flags: None

Loads 32­bit pointer from memory source to destination register and ES. The offset is  placed in the destination register and the segment is placed in ES. To use this instruction the word  at the lower memory address must contain the offset and the word at the higher address must  contain the segment. This simplifies the loading of far pointers from the stack and the interrupt  vector table. Clocks Size Bytes Operands

reg, mem reg, mem (PM) 808x 16+EA ­ 286 7 ­ 386 7 22 486 6 12 2­4 (W88=24+EA) 5­7

LFS ­ Load Pointer Using FS (386+) dest, src Usage: LFS Modifies flags: None

Loads 32­bit pointer from memory source to destination register and FS. The offset is  placed in the destination register and the segment is placed in FS. To use this instruction the word  at the lower memory address must contain the offset and the word at the higher address must  contain the segment. This simplifies the loading of far pointers from the stack and the interrupt  vector table. Clocks Size Bytes Operands

reg, mem reg, mem (PM) 808x ­ ­ 286 ­ ­ 386 7 22 486 6 12 5­7 5­7

LGDT ­ Load Global Descriptor Table (286+ privileged)

Usage: LGDT src Modifies flags: None

Loads a value from an operand into the Global Descriptor Table (GDT) register.

Clocks Size Bytes Operands mem64 808x ­ 286 11 386 11 486 11 5

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

LIDT ­ Load Interrupt Descriptor Table (286+ privileged)

105

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Usage: LIDT src Modifies flags: None

Loads a value from an operand into the Interrupt Descriptor Table (IDT) register. Clocks Size Bytes Operands mem64 808x ­ 286 12 386 11 486 11 5

LGS ­ Load Pointer Using GS (386+) dest, src Usage: LGS Modifies flags: None

Loads 32­bit pointer from memory source to destination register and GS. The offset is  placed in the destination register and the segment is placed in GS. To use this instruction the word  at the lower memory address must contain the offset and the word at the higher address must  contain the segment. This simplifies the loading of far pointers from the stack and the interrupt  vector table.

Clocks Size Bytes Operands

reg, mem reg, mem (PM) 808x ­ ­ 286 ­ ­ 386 7 22 486 6 12 5­7 5­7

LLDT ­ Load Local Descriptor Table (286+ privileged)

Usage: LLDT src Modifies flags: None

Loads a value from an operand into the Local Descriptor Table Register (LDTR). Clocks Size Bytes Operands

reg16 mem16 808x ­ ­ 286 17 19 386 20 24 486 11 11 3 5

LMSW ­ Load Machine Status Word (286+ privileged) src Usage: LMSW Modifies flags: None

Loads the Machine Status Word (MSW) from data found at "src" Clocks Size Bytes Operands

reg16 mem16 808x ­ ­ 286 3 6 386 10 13 486 13 13 3 5

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

LOCK ­ Lock Bus Usage: LOCK LOCK: (386+ prefix) Modifies flags: None

106

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

This instruction is a prefix that causes the CPU assert bus lock signal during the execution

of the next instruction. Used to avoid two processors from updating the same data location. The

286 always asserts lock during an XCHG with memory operands. This should only be

used to lock the bus prior to XCHG, MOV, IN and OUT instructions. Clocks Size Bytes

Operands none 808x 2 286 0 386 0 486 1 1

LODS ­ Load String (Byte, Word or Double) Usage: LODS src

(386+) LODSB LODSW LODSD Modifies flags: None

Transfers string element addressed by DS:SI (even if an operand is supplied) to

the  accumulator. SI is incremented based on the size of the operand or based on the instruction used.  If the Direction Flag is set SI is decremented, if the Direction Flag is clear SI is incremented. Use  with REP prefixes. Clocks Size Bytes

Operands src 808x 12/16 286 5 386 5 486 5 1

LOOP ­ Decrement CX and Loop if CX Not Zero

Usage: LOOP label Modifies flags: None

Decrements   CX   by  1   and   transfers   control   to   "label"   if   CX   is   not   Zero.   The   "label"

operand must be within ­128 or 127 bytes of the instruction following the loop instruction

Clocks Size Bytes

label: 2 Operands jump no jump 808x 18 5 286 8+m 4 386 11+m ? 486 6 2

LOOPE/LOOPZ ­ Loop While Equal / Loop While Zero

label label Usage: LOOPE LOOPZ Modifies flags: None

Decrements CX by 1 (without modifying the flags) and transfers control to "label" if CX ! =  0 and the  Zero Flag  is  set. The  "label"  operand must  be within ­128 or 127 bytes  of the  instruction following the loop instruction. Clocks Size Bytes

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

label: 2 Operands jump no jump 808x 18+m 5 286 8+m 4 386 11+m ? 486 9 6

107

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

LOOPNZ/LOOPNE ­ Loop While Not Zero / Loop While Not Equal

Usage: LOOPNZ LOOPNE label label Modifies flags: None

Decrements CX by 1 (without modifying the flags) and transfers Control to "label" if  CX != 0 and the Zero Flag is clear. The "label" operand must be within ­128 or 127 bytes of the   instruction following the loop instruction. Clocks Size Bytes

label: 2 Operands jump no jump 808x 19 5 286 8+m 4 386 11+m ? 486 9 6

LSL ­ Load Segment Limit (286+ protected) dest, src Usage: LSL Modifies flags: ZF

Loads the segment limit of a selector into the destination register if the selector is valid  and visible at the current privilege level. If loading is successful the Zero Flag is set, otherwise it  is cleared. Clocks Size Bytes Operands

reg16, reg16 reg32, reg32 reg16, mem16 reg32, mem32 808x ­ ­ ­ ­ 286 14 ­ 16 ­ 386 20/25 20/25 21/26 21/26 486 10 10 10 10 3 3 5 5

­ 386 times are listed “byte granular” / “page granular”

LSS ­ Load Pointer Using SS (386+) dest, src Usage: LSS Modifies flags: None

Loads 32­bit pointer from memory source to destination register and SS. The offset is  placed in the destination register and the segment is placed in SS. To use this instruction the word  at the lower memory address must contain the offset and the word at the higher address must  contain the segment. This simplifies the loading of far pointers from the stack and the interrupt  vector table. Clocks Size Bytes Operands

reg, mem reg, mem (PM) 808x ­ ­ 286 ­ ­ 386 7 22 486 6 12 5­7 5­7

LTR ­ Load Task Register (286+ privileged)

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Usage: LTR src Modifies flags: None

108

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Loads the current task register with the value specified in "src". Clocks Size Bytes Operands

reg16 mem16 808x ­ ­ 286 17 19 386 23 27 486 20 20 3 5

MOV ­ Move Byte or Word

Usage: MOV dest, src Modifies flags: None

Copies byte or word from the source operand to the destination operand. If the destination  is SS interrupts are disabled except on early buggy 808x CPUs. Some CPUs disable interrupts if  the destination is any of the segment registers. Clocks Size Bytes Operands

2 2­4 (W88=13+EA) 2­4 (W88=12+EA) 3­6 (W88=14+EA) 2­3 3 (W88=14) 3 (W88=14) 2 2­4 (W88=12+EA) 2 2­4 (W88=13+EA)

808x 2 9+EA 8+EA 10+EA 4 10 10 2 8+EA 2 9+EA ­ ­ ­ ­

­

­ ­ ­ 286 2 3 5 3 2 3 5 2 5 2 3 ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ 386 2 2 4 2 2 2 4 2 5 2 2 6 10 4 5 22 22 22 16 12 12 3 3 3 3 3 3 3 3 3

reg, reg mem, reg reg, mem mem, immed reg, immed mem, accum accum, mem segreg, reg16 segreg, mem16 reg16, segreg mem16, segreg reg32, CR0/CR2/CR3 CR0, reg32 CR2, reg32 CR3, reg32 reg32, DR0/DR1/DR2/DR3 reg32, DR6/DR7 DR0/DR1/DR2/DR3, reg32 DR6/DR7, reg32 reg32, TR6/TR7 TR6/TR7, reg32 reg32, TR3 TR3, reg32 486 1 1 1 1 1 1 1 3 9 3 3 4 16 4 4 10 10 11 11 4 4 3 6

­ when the 386 special registers are used all operands are 32 bits

MOVS ­ Move String (Byte or Word) dest, src Usage: MOVS

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

MOVSB MOVSW MOVSD (386+) Modifies flags: None

109

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Copies data from addressed by DS:SI (even if operands are given) to the location ES:DI  destination and updates SI and DI based on the size of the operand or instruction used. SI and DI  are incremented when the Direction Flag is cleared and decremented when the Direction Flag is  Set. Use with REP prefixes. Clocks Size Bytes Operands dest, src 808x 18 286 5 386 7 486 7 1 (W88=26)

MOVSX ­ Move with Sign Extend (386+) dest, src Usage: MOVSX Modifies flags: None

Copies the value of the source operand to the destination register with the sign extended.

Clocks Size Bytes Operands

reg, reg reg, mem 808x ­ ­ 286 ­ ­ 386 3 6 486 3 3 3 3­7

MOVZX ­ Move with Zero Extend (386+) dest, src Usage: MOVZX Modifies flags: None

Copies   the   value   of   the   source   operand   to   the   destination   register   with   the   zeroes

extended. Clocks Size Bytes Operands

reg, reg reg, mem 808x ­ ­ 286 ­ ­ 386 3 6 486 3 3 3 3­7

MUL ­ Unsigned Multiply Usage: MUL src Modifies flags: CF, OF (AF, PF, SF, ZF undefined)

Unsigned multiply of the accumulator by the source. If "src" is a byte value, then AL is  used as the other multiplicand and the result is placed in AX. If "src" is a word value, then AX is  multiplied by "src" and DX:AX receives the result. If "src" is a double word value, then EAX is  multiplied by "src" and EDX:EAX receives the result. The 386+ uses an early out algorithm  which makes multiplying any size value in EAX as fast as in the 8 or 16 bit registers. Clocks Size Bytes Operands

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

reg8 reg16 reg32 mem8 mem16 mem32 808x 70­77 118­113 ­ (76­83)+EA (124­139)+EA ­ 286 13 21 ­ 16 24 ­ 386 9­14 9­22 9­38 12­17 12­25 12­21 486 13­18 13­26 13­42 13­18 13­26 13­42 2 2 2­4 2­4 2­4 2­4

110

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

NEG ­ Two's Complement Negation Usage: NEG dest Modifies flags: AF, CF, OF, PF, SF, ZF

Subtracts the destination from 0 and saves the 2s complement of "dest" back into "dest".

Clocks Size Bytes Operands

reg mem 808x 3 16+EA 286 2 7 386 2 6 486 1 3 2 2­4 (W88=24+EA)

NOP ­ No Operation (90h) Usage: NOP Modifies flags: None

This is a do nothing instruction. It results in occupation of both space and time and is most

useful for patching code segments. (This is the original XCHG AL, AL instruction). Clocks Size Bytes

Operands none 808x 3 286 3 386 3 486 1 1

NOT ­ One's Compliment Negation (Logical NOT)

Usage: NOT dest Modifies flags: None

Inverts the bits of the "dest" operand forming the 1s complement. Clocks Size Bytes Operands

reg mem 808x 3 16+EA 286 2 7 386 2 6 486 1 3 2 2­4 (W88=24+EA)

dest, src OR ­ Inclusive Logical OR Usage: OR Modifies flags: CF, OF, PF, SF, ZF, (AF undefined)

Logical inclusive OR of the two operands returning the result in the destination. Any bit

set in either operand will be set in the destination. Clocks Size Bytes Operands

reg, reg mem, reg reg, mem reg, immed mem8, immed8 mem16, immed16 accum, immed 808x 3 16+EA 9+EA 4 17+EA 25+EA 4 286 2 7 7 3 7 7 3 386 2 7 6 2 7 7 2 486 1 3 2 1 3 3 1 2 2­4 (W88=24+EA) 2­4 (W88=13+EA) 3­4 3­6 3­6 2­3

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

OUT ­ Output Data to Port Usage: OUT port, accum

111

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Modifies flags: None

Transfers   byte   in   AL,word   in   AX   or   dword   in   EAX   to   the   specified   hardware   port  address. If the port number is in the range of 0­255 it can be specified as an immediate. If greater  than 255 then the port number must be specified in DX. Since the PC only decodes 10 bits of the  port address, values over 1023 can only be decoded by third party vendor equipment and also  map to the port range 0­1023. Clocks Size Bytes

Operands immed8, accum immed8, accum (PM) DX, accum DX, accum (PM) 808x 10/14 ­ 8/12 ­ 286 3 ­ 3 ­ 386 10 4/24 11 5/25 486 16 11/31/29 16 10/30/29 2 2 1 1

­ 386+ protected mode timings depend on privilege levels.

First number is the timing when: CPL<= IOPL Second number is the timing when: CPL > IOPL Third number is the timing when: virtual mode on 486 processor

OUTS ­ Output String to Port (80188+) Usage: OUTS port, src

(386+) OUTSB OUTSW OUTSD Modifies flags: None

Transfers a byte, word or doubleword from "src" to the hardware port specified in DX.  For   instructions   with   no   operands   the   "src"   is   located   at   DS:SI   and   SI   is   incremented   or  decremented by the size of the operand or the size dictated by the instruction format. When the  Direction Flag is set SI is decremented, when clear, SI is incremented. If the port number is in the  range of 0­255 it can be specified as an immediate. If greater than 255 then the port number must  be specified in DX. Since the PC only decodes 10 bits of the port address, values over 1023 can  only be decoded by third party vendor equipment and also map to the port range 0­1023. Clocks Size Bytes Operands

port, src port, src (PM) 808x ­ ­ 286 5 ­ 386 14 8/28 486 17 10/32/30 1 1

­ 386+ protected mode timings depend on privilege levels.

First number is the timing when: CPL<= IOPL Second number is the timing when: CPL > IOPL Third number is the timing when: virtual mode on 486 processor

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

POP ­ Pop Word off Stack dest Usage: POP

112

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Modifies flags: None

Transfers word at the current stack top (SS:SP) to the destination then increments SP by

two to point to the new stack top. CS is not a valid destination. Clocks Size Bytes Operands

reg16 reg32 segreg mem16 mem32 808x 8 4 8 17+EA 5 286 5 ­ 5 5 ­ 386 4 ­ 7 5 ­ 486 4 4 3 6 6 1 1 1 2­4 2­4

POPA/POPAD ­ Pop All Registers onto Stack (80188+) Usage: POPA (386+) POPAD Modifies flags: None

Pops the top 8 words off the stack into the 8 general purpose 16/32 bit registers. Registers  are popped in the following order: (E)DI, (E)SI, (E)BP, (E)SP, (E)DX, (E)CX and (E)AX. The  (E)SP value popped from the stack is actually discarded. Clocks Size Bytes

Operands none 808x ­ 286 19 386 24 486 9 1

POPF/POPFD ­ Pop Flags off Stack Usage: POPF (386+) POPFD Modifies flags: all flags

Pops word/doubleword from stack into the Flags Register and then Increments SP by 2

(for POPF) or 4 (for POPFD). Clocks Size Bytes

Operands none none (PM) 808x 8/12 ­ 286 5 ­ 386 5 5 486 9 6 1 (W88=12) 1

PUSH ­ Push Word onto Stack Usage: PUSH src PUSH immed (80188+ only) Modifies flags: None

Decrements SP by the size of the operand (two or four, byte values are sign extended) and

transfers one word from source to the stack top (SS:SP). Clocks Size Bytes Operands

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

reg16 reg32 mem16 808x 11/15 ­ 16+EA 286 3 ­ 5 386 2 2 5 486 1 1 4 1 1 2­4 (W88=24+EA)

113

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

mem32 segreg immed ­ 10/14 ­ ­ 3 3 5 2 2 4 3 1 2­4 1 2­3

PUSHA/PUSHAD ­ Push All Registers onto Stack (80188+) Usage: PUSHA PUSHAD (386+) Modifies flags: None

Pushes all general purpose registers onto the stack in the following order: (E)AX, (E)CX,  (E)DX, (E)BX, (E)SP, (E)BP, (E)SI, (E)DI. The value of SP is the value before the actual push of  SP. Clocks Size Bytes

Operands none 808x ­ 286 19 386 24 486 11 1

PUSHF/PUSHFD ­ Push Flags onto Stack

Usage: PUSHF PUSHFD (386+) Modifies flags: None

Transfers the Flags Register onto the stack. PUSHF saves a 16 bit value while PUSHFD

saves a 32 bit value. Clocks Size Bytes

Operands none none (PM) 808x 10/14 ­ 286 3 ­ 386 4 4 486 4 3 1 1

RCL ­ Rotate Through Carry Left Usage: RCL dest, count Modifies flags: CF, OF

Rotates the bits in the destination to the left "count" times with all data pushed out the left

side re­entering on the right. The Carry Flag holds the last bit rotated out.

Clocks Size Bytes Operands

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

reg, 1 mem, 1 reg, CL mem, CL reg, immed8 mem, immed8 808x 2 15+EA 8+4n 20+EA+4n ­ ­ 286 2 7 5+n 8+n 5+n 8+n 386 9 10 9 10 9 10 486 3 4 8­30 9­31 8­30 9­31 2 2­4 (W88=23+EA) 2 2­4 (W88=28+EA+4n) 3 3­5

114

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

RCR ­ Rotate Through Carry Right

Usage: RCR dest, count Modifies flags: CF, OF

Rotates the bits in the destination to the right "count" times with all data pushed out the

right side re­entering on the left. The Carry Flag holds the last bit rotated out. Clocks Size Bytes Operands

reg, 1 mem, 1 reg, CL mem, CL reg, immed8 mem, immed8 808x 2 15+EA 8+4n 20+EA+4n ­ ­ 286 2 7 5+n 8+n 5+n 8+n 386 9 10 9 10 9 10 486 3 4 8­30 9­31 8­30 9­31 2 2­4 (W88=23+EA) 2 2­4 (W88=28+EA+4n) 3 3­5

REP ­ Repeat String Operation

Usage: REP Modifies flags: None

Repeats execution of string instructions while CX != 0. After each string operation, CX is  decremented  and the  Zero Flag is  tested. The combination  of a repeat  prefix and a segment  override on CPU's before the 386 may result in errors if an interrupt occurs before CX=0. The  following code shows code that is susceptible to this and how to avoid it:

again: rep movs byte ptr ES:[DI],ES:[SI]

; vulnerable instr. ; continue if REP successful ; interrupt goofed count jcxz next loop again next: Clocks Size Bytes 486 Operands none 808x 2 286 2 386 2 1

REPE/REPZ ­ Repeat Equal / Repeat Zero

Usage: REPE REPZ Modifies flags: None

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Repeats execution of string instructions while CX != 0 and the Zero Flag is set. CX is  decremented and the Zero Flag tested after each string operation. The combination of a repeat  prefix and a segment override on processors other than the 386 may result in errors if an interrupt  occurs before CX=0. Clocks Size Bytes Operands 808x 286 386 486

115

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

none 2 2 2 1

REPNE/REPNZ ­ Repeat Not Equal / Repeat Not Zero

Usage: REPNE REPNZ Modifies flags: None

Repeats execution of string instructions while CX != 0 and the Zero Flag is clear. CX is  decremented and the Zero Flag tested after each string operation. The combination of a repeat  prefix and a segment override on processors other than the 386 may result in errors if an interrupt  occurs before CX=0. Clocks Size Bytes 486 Operands none 808x 2 286 2 386 2 1

RET/RETF ­ Return From Procedure Usage: RET nBytes RETF nBytes RETN nBytes Modifies flags: None

Transfers control from a procedure back to the instruction address saved on the stack. "n

bytes" is an optional number of bytes to release. Far returns pop the IP followed by the CS, while  near returns pop only the IP register. Clocks

Operands

808x 16/20 20/24 26/34

25/33 286 11+m 11+m 15+m ­ ­ 15+m

retn retn immed retf retf (PM, same priv.) retf (PM, lesser priv.) retf immed retf immed (PM, same priv.) retf immed (PM, lesser priv.) 386 10+m 10+m 18+m 32+m 68 18+m 32+m 68 486 5 5 13 18 33 14 17 33 Size  Bytes 1 3 1 1 1 3 1 1

ROL ­ Rotate Left

Usage: ROL dest, count Modifies flags: CF, OF

Rotates the bits in the destination to the left "count" times with all data pushed out the left

side re­entering on the right. The Carry Flag will contain the value of the last bit rotated out. Clocks Size Bytes Operands

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

reg, 1 mem, 1 808x 2 15+EA 286 2 7 386 3 7 486 3 4 2 2­4 (W88=23+EA)

116

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

reg, CL mem, CL reg, immed8 mem, immed8 8+4n 20+EA+4n ­ ­ 5+n 8+n 5+n 8+n 3 7 3 7 3 4 2 4 2 2­4 (W88=28+EA+4n) 3 3­5

ROR ­ Rotate Right

Usage: ROR dest, count Modifies flags: CF, OF

Rotates the bits in the destination to the right "count" times with all data pushed out the

right side re­entering on the left. The Carry Flag will contain the value of the last bit rotated out. Clocks Size Bytes Operands

reg, 1 mem, 1 reg, CL mem, CL reg, immed8 mem, immed8 808x 2 15+EA 8+4n 20+EA+4n ­ ­ 286 2 7 5+n 8+n 5+n 8+n 386 3 7 3 7 3 7 486 3 4 3 4 2 4 2 2­4 (W88=23+EA) 2 2­4 (W88=28+EA+4n) 3 3­5

SAHF ­ Store AH Register into FLAGS

Usage: SAHF Modifies flags: AF, CF, PF, SF, ZF

Transfers bits 0­7 of AH into the Flags Register. This includes AF, CF, PF, SF and ZF.

Clocks Size Bytes

Operands none 808x 4 286 2 386 3 486 2 1

SAL/SHL ­ Shift Arithmetic Left / Shift Logical Left

Usage: SAL dest, count SHL dest, count Modifies flags: CF, OF, PF, SF, ZF (AF undefined)

Shifts the destination left by "count" bits with zeroes shifted in on right. The Carry Flag

contains the last bit shifted out. Clocks Size Bytes Operands

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

reg, 1 mem, 1 reg, CL mem, CL 808x 2 15+EA 8+4n 20+EA+4n 286 2 7 5+n 8+n 386 3 7 3 7 486 3 4 3 4 2 2­4 (W88=23+EA) 2 2­4 (W88=28+EA+4n)

117

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

reg, immed8 mem, immed8 ­ ­ 5+n 8+n 3 7 2 4 3 3­5

SAR ­ Shift Arithmetic Right

Usage: SAR dest, count Modifies flags: CF, OF, PF, SF, ZF (AF undefined)

Shifts   the   destination   right   by   "count"   bits   with  the   current   sign  bit   replicated   in   the

leftmost bit. The Carry Flag contains the last bit shifted out. Clocks Size Bytes Operands

486 3 4 3 4 2 4 2 2­4 (W88=23+EA) 2 2­4 (W88=28+EA+4n) 3 3­5 386 3 7 3 7 3 7 reg, 1 mem, 1 reg, CL mem, CL reg, immed8 mem, immed8 808x 2 15+EA 8+4n 20+EA+4n ­ ­ 286 2 7 5+n 8+n 5+n 8+n

SBB ­ Subtract with Borrow/Carry

Usage: SBB dest, src Modifies flags: AF, CF, OF, PF, SF, ZF

Subtracts the source from the destination, and subtracts 1 extra if the Carry Flag is set.

Results are returned in "dest". Clocks Size Bytes Operands

486 1 3 2 1 3 1 2 2­4 (W88=24+EA) 2­4 (W88=13+EA) 3­4 3­6 (W88=25+EA) 2­3 386 2 6 7 2 7 2 reg, reg mem, reg reg, mem reg, immed mem, immed accum, immed 808x 3 16+EA 9+EA 4 17+EA 4 286 2 7 7 3 7 3

SCAS ­ Scan String (Byte, Word or Doubleword) Usage: SCAS string

SCASB SCASW SCASD (386+) Modifies flags: AF, CF, OF, PF, SF, ZF

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Compares value at ES:DI (even if operand is specified) from the accumulator and sets the  flags similar to a subtraction. DI is incremented/decremented based on the instruction format (or  operand size) and the state of the Direction Flag. Use with REP prefixes. Clocks Size Bytes Operands 808x 286 386 486

118

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

string 15 7 7 6 1 (W88=19)

SETAE/SETNB ­ Set if Above or Equal / Set if Not Below (386+) dest dest Usage: SETAE SETNB

(unsigned, 386+) Modifies flags: None

Sets the byte in the operand to 1 if the Carry Flag is clear otherwise sets the operand to 0.

Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

Usage: SETB SETB/SETNAE ­ Set if Below / Set if Not Above or Equal (386+) dest dest

SETNAE (unsigned, 386+) Modifies flags: None

Sets the byte in the operand to 1 if the Carry Flag is set otherwise sets the operand to 0.

Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

SETBE/SETNA ­ Set if Below or Equal / Set if Not Above (386+) dest dest Usage: SETBE SETNA

(unsigned, 386+) Modifies flags: None

Sets the byte in the operand to 1 if the Carry Flag or the Zero Flag is set, otherwise sets

the operand to 0. Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

SETE/SETZ ­ Set if Equal / Set if Zero (386+)

Usage: SETE dest SETZ dest Modifies flags: None

Sets the byte in the operand to 1 if the Zero Flag is set, otherwise sets the operand to 0.

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Clocks Size Bytes Operands 808x 286 386 486

119

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

3 3 reg8 mem8 ­ ­ ­ ­ 4 5 3 4

SETNE/SETNZ ­ Set if Not Equal / Set if Not Zero (386+)

dest dest Usage: SETNE SETNZ Modifies flags: None

Sets the byte in the operand to 1 if the Zero Flag is clear, otherwise sets the operand to 0.

Clocks Size Bytes Operands

3 3 reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4

Usage: SETL SETL/SETNGE ­ Set if Less / Set if Not Greater or Equal (386+) dest dest SETNGE

(signed, 386+) Modifies flags: None

Sets the byte in the operand to 1 if the Sign Flag is not equal to the Overflow Flag,

otherwise sets the operand to 0. Clocks Size Bytes Operands

3 3 reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4

SETGE/SETNL ­ Set if Greater or Equal / Set if Not Less (386+) dest dest

Usage: SETGE SETNL (signed, 386+) Modifies flags: None

Sets the byte in the operand to 1 if the Sign Flag equals the Overflow Flag, otherwise sets

the operand to 0.

Clocks Size Bytes Operands

3 3 reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4

SETLE/SETNG ­ Set if Less or Equal / Set if Not greater or Equal (386+) dest dest

Usage: SETLE SETNG (signed, 386+) Modifies flags: None

Sets the byte in the operand to 1 if the Zero Flag is set or the Sign Flag is not equal to the

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Overflow Flag, otherwise sets the operand to 0.

120

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

Usage: SETG SETG/SETNLE ­ Set if Greater / Set if Not Less or Equal (386+) dest dest SETNLE

(signed, 386+) Modifies flags: None

Sets the byte in the operand to 1 if the Zero Flag is clear or the Sign Flag equals to the

Overflow Flag, otherwise sets the operand to 0. Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

SETS ­ Set if Signed (386+)

Usage: SETS dest Modifies flags: None

Sets the byte in the operand to 1 if the Sign Flag is set, otherwise sets the operand to 0.

Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

SETNS ­ Set if Not Signed (386+) dest Usage: SETNS Modifies flags: None

Sets the byte in the operand to 1 if the Sign Flag is clear, otherwise sets the operand to 0.

Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

SETC ­ Set if Carry (386+) Usage: SETC dest Modifies flags: None

Sets the byte in the operand to 1 if the Carry Flag is set, otherwise sets the operand to 0.

Clocks Size Bytes Operands

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

121

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

SETNC ­ Set if Not Carry (386+) dest Usage: SETNC Modifies flags: None

Sets the byte in the operand to 1 if the Carry Flag is clear, otherwise sets the operand to 0.

Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

SETO ­ Set if Overflow (386+)

Usage: SETO dest Modifies flags: None

Sets the byte in the operand to 1 if the Overflow Flag is set, otherwise sets the operand to

0. Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

SETNO ­ Set if Not Overflow (386+) dest Usage: SETNO Modifies flags: None

Sets the byte in the operand to 1 if the Overflow Flag is clear, otherwise sets the operand

to 0. Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

SETP/SETPE ­ Set if Parity / Set if Parity Even (386+) Usage: SETP dest dest SETPE Modifies flags: None

Sets the byte in the operand to 1 if the Parity Flag is set, otherwise sets the operand to 0.

Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

SETNP/SETPO ­ Set if No Parity / Set if Parity Odd (386+)

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

dest dest Usage: SETNP SETPO Modifies flags: None

122

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Sets the byte in the operand to 1 if the Parity Flag is clear, otherwise sets the operand to 0.

Clocks Size Bytes Operands

reg8 mem8 808x ­ ­ 286 ­ ­ 386 4 5 486 3 4 3 3

SGDT ­ Store Global Descriptor Table (286+ privileged)

Usage: SGDT dest Modifies flags: None

Stores the Global Descriptor Table (GDT) Register into the specified operand.

Clocks Size Bytes Operands mem64 808x ­ 286 11 386 9 486 10 5

SIDT ­ Store Interrupt Descriptor Table (286+ privileged)

Usage: SIDT dest Modifies flags: None

Stores the Interrupt Descriptor Table (IDT) Register into the specified operand.

Clocks Size Bytes Operands mem64 808x ­ 286 12 386 9 486 10 5

SHL ­ Shift Logical Left See: SAL

SHR ­ Shift Logical Right

Usage: SHR dest, count Modifies flags: CF, OF, PF, SF, ZF (AF undefined)

Shifts the destination right by "count" bits with zeroes shifted in on the left. The Carry

Flag contains the last bit shifted out. Clocks Size Bytes Operands 486

reg, 1 mem, 1 reg, CL mem, CL reg, immed8 mem, immed8 808x 2 15+EA 8+4n 20+EA+4n ­ ­ 286 2 7 5+n 8+n 5+n 8+n 386 3 7 3 7 3 7 2 2­4 (W88=23+EA) 2 2­4 (W88=28+EA+4n) 3 3­5

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

SHLD/SHRD ­ Double Precision Shift (386+) Usage: SHLD dest, src, count SHRD dest, src, count

123

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Modifies flags: CF, PF, SF, ZF (OF,AF undefined)

SHLD shifts "dest" to the left "count" times and the bit positions opened are filled with  the  most  significant  bits  of  "src".  SHRD   shifts  "dest"  to  the  right  "count"  times  and  the  bit  positions opened are filled with the least significant bits of the second operand. Only the 5 lower  bits of "count" are used. Clocks

Operands reg16, reg16, immed8 reg32, reg32, immed8 mem16, reg16, immed8 mem32, reg32, immed8 reg16, reg16, CL reg32, reg32, CL mem16, reg16, CL mem32, reg32, CL 808x ­ ­ ­ ­ ­ ­ ­ ­ 286 ­ ­ ­ ­ ­ ­ ­ ­ 386 3 3 7 7 3 3 7 7 486 2 2 3 3 3 3 4 4 Size  Bytes 4 4 6 6 3 3 5 5

SLDT ­ Store Local Descriptor Table (286+ privileged)

Usage: SLDT dest Modifies flags: None

Stores the Local Descriptor Table (LDT) Register into the specified operand.

Clocks Size Bytes Operands

reg16 mem16 808x ­ ­ 286 2 2 386 2 2 486 2 3 3 5

SMSW ­ Store Machine Status Word (286+ privileged) dest Usage: SMSW Modifies flags: None

Store Machine Status Word (MSW) into "dest". Clocks Size Bytes Operands

808x ­ ­ 286 2 3 386 10 3 486 2 3 reg16 mem16 3 5

STC ­ Set Carry

Usage: STC Modifies flags: CF

Sets the Carry Flag to 1. Clocks Size Bytes

Operands none 808x 2 286 2 386 2 486 2 1

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

STD ­ Set Direction Flag Usage: STD

124

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Modifies flags: DF

Sets the Direction Flag to 1 causing string instructions to auto­decrement SI and DI

instead of auto­increment. Clocks Size Bytes

Operands none 808x 2 286 2 386 2 486 2 1

STI ­ Set Interrupt Flag (Enable Interrupts)

Usage: STI Modifies flags: IF

Sets the Interrupt Flag to 1, which enables recognition of all hardware interrupts. If an  interrupt is generated by a hardware device, an End of Interrupt (EOI) must also be issued to  enable other hardware interrupts of the same or lower priority. Clocks Size Bytes

Operands none 808x 2 286 2 386 2 486 5 1

STOS ­ Store String (Byte, Word or Doubleword) Usage: STOS dest

STOSB STOSW STOSD Modifies flags: None

Stores value in accumulator to location at ES:(E)DI (even if operand is given). (E)DI is  incremented/decremented based on the size of the operand (or instruction format) and the state of  the Direction Flag. Use with REP prefixes. Clocks Size Bytes

Operands dest 808x 11 286 3 386 4 486 5 1 (W88=15)

STR ­ Store Task Register (286+ privileged)

Usage: STR dest Modifies flags: None

Stores the current Task Register to the specified operand. Clocks Size Bytes

Operands reg16 mem16 808x ­ ­ 286 2 3 386 2 2 486 2 3 3 5

SUB ­ Subtract

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Usage: SUB dest, src Modifies flags: AF, CF, OF, PF, SF, ZF

125

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

The source is subtracted from the destination and the result is stored in the destination.

Clocks Size Bytes Operands

reg, reg mem, reg reg, mem reg, immed mem, immed accum, immed 808x 3 16+EA 9+EA 4 17+EA 4 286 2 7 7 3 7 3 386 2 6 7 2 7 2 486 1 3 2 1 3 1 2 2­4 (W88=24+EA) 2­4 (W88=13+EA) 3­4 3­6 (W88=25+EA) 2­3

TEST ­ Test For Bit Pattern

Usage: TEST dest, src Modifies flags: CF, OF, PF, SF, ZF (AF undefined)

Performs a logical AND of the two operands updating the flags register without saving the

result. Clocks Size Bytes Operands

reg, reg reg, mem mem, reg reg, immed mem, immed accum, immed 808x 3 9+EA 9+EA 5 11+EA 4 286 2 6 6 3 6 3 386 1 5 5 2 5 2 486 1 1 2 1 2 1 2 2­4 (W88=13+EA) 2­4 (W88=13+EA) 3­4 3­6 2­3

VERR ­ Verify Read (286+ protected)

Usage: VERR src Modifies flags: ZF

Verifies the specified segment selector is valid and is readable at the current privilege

level. If the segment is readable, the Zero Flag is set, otherwise it is cleared. Clocks Size Bytes Operands

reg16 mem16 808x ­ ­ 286 14 16 386 10 11 486 11 11 3 5

VERW ­ Verify Write (286+ protected)

Usage: VERWsrc Modifies flags: ZF

Verifies the specified segment selector is valid and is ratable at the current privilege level.

If the segment is writable, the Zero Flag is set, otherwise it is cleared.

Clocks Size Bytes Operands

reg16 mem16 808x ­ ­ 286 14 16 386 15 16 486 11 11 3 5

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

WAIT/FWAIT ­ Event Wait

126

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Usage: WAIT

FWAIT Modifies flags: None

CPU  enters  wait  state   until  the  coprocessor  signals   it  has  finished  its  operation.   This  instruction is used to prevent the CPU from accessing memory that may be temporarily in use by  the coprocessor. WAIT and FWAIT are identical. Clocks Size Bytes

Operands none 808x 4 286 3 386 6+ 486 1­3 1

WBINVD ­ Write­Back and Invalidate Cache (486+)

Usage: WBINVD Modifies flags: None

Flushes internal cache, then signals the external cache to write back current data followed

by a signal to flush the external cache. Clocks Size Bytes

Operands none 808x ­ 286 ­ 386 ­ 486 5 2

XCHG ­ Exchange

Usage: XCHG dest, src Modifies flags: None

Exchanges contents of source and destination. Clocks Size Bytes Operands

reg, reg mem, reg reg, mem accum, reg reg, accum 808x 4 17+EA 17+EA 3 3 286 3 5 5 3 3 386 3 5 5 3 3 486 3 5 3 3 3 2 2­4 (W88=25+EA) 2­4 (W88=25+EA) 1 1

XLAT/XLATB ­ Translate Usage: XLAT translation­table (masm 5.x) XLATB Modifies flags: None

Replaces the byte in AL with byte from a user table addressed by BX. The original value

of AL is the index into the translate table. The best way to describe this is MOV AL, [BX+AL] Clocks Size Bytes

Operands Table offset 808x 11 286 5 386 5 486 4 1

XOR ­ Exclusive OR

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

Usage: XOR dest, src Modifies flags: CF, OF, PF, SF, ZF (AF undefined)

127

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Performs a bitwise exclusive OR of the operands and returns the result in the destination.

Clocks Size Bytes Operands

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

reg, reg mem, reg reg, mem reg, immed mem, immed accum, immed 808x 3 16+EA 9+EA 4 17+EA 4 286 2 7 7 3 7 3 386 2 6 7 2 7 2 486 1 3 2 1 3 1 2 2­4 (W88=24+EA) 2­4 (W88=13+EA) 3­4 3­6 2­3

128

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Ụ Ủ

Ụ Ụ

PH  L C 2: CÁC D CH V  C A BIOS VÀ DOS

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

129

ƯỜ

Ạ Ọ

TR

NG Đ I H C K  THU T CÔNG NGHI P

Ụ Ụ

ƯƠ

PH  L C 3: CÁC CH

NG TRÌNH VÍ D

Communication

Compression

CPU

Date & Time

Disk & File access

Keyboard & Mouse

Math routines

Memory

Protected mode

TSR (Terminal and Stay Presidented)

ế

ậ Nguy n Ti n Duy ­ Trung tâm K  thu t máy tính ­ B  môn K  thu t máy tính

130