Ậ
Ỹ
Ệ
ƯỜ
Ạ Ọ
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=5A: .................................................................................................................. ề ệ 1.4.3.M nh đ A=B2*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 IBMPC , 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 BenjaminCummings Publishing Company, Inc. 1991.
[7] Microprocessors and microcomputerbased 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/McGrawHill, 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 ADDREPEAT ; 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 = Pseudoop). ASM không chuy n Pseudoop 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.
ế PSEUDOOP 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
và
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:=word1ax ; bl:=bl5 ; ax:=axdx
ị ộ ố ạ ế ư ả ệ ậ ỹ 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=5A:
mov sub mov ax, 5 ax, a ax, a ư ; Đ a 5 vào ax ; ax=5a ; 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=5A
13
ƯỜ
Ạ Ọ
Ậ
Ệ
Ỹ
TR
NG Đ I H C K THU T CÔNG NGHI P
ệ
ề
1.4.3.
M nh đ A=B2*A:
mov sub sub mov ax, B ax, A ax, A A, ax ; ax=b ; ax=BA ; ax=B2*A ; A=B2*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
Crossreference [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 8000h0001h=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=8000HFFFFH=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 PGR31: 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 TopDown, 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
; 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 PGM31: 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
; 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 30h39h, 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 AZ là t az là t ng t
ả ử ứ hoa t ủ ể ổ s dl ch a mã ASCII c a ký t ừ ự ườ th ự ườ th 41h5ah 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
61h7ah. 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 ứ ế af (AF). 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 PGM51: 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 topdown. Ý 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 51: 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 52).
ẽ Hình v 52:
ụ ề ủ ụ 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 PGM51: 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*a12*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*a12*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*(n1)*(n1)*...*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=Term1
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+(N1)*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 memorymemory 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 n1, .... 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*(n1).
ư ạ Đ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=n1 ;bx=2*(n1) ; di=2*(n1)+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 n1 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=i1
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=n1 ế ; 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 n1 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=n1 ế ặ ;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+(i1)*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 (j1)*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+((i1)*n+(j1))*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+((i1)+(j1)*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+(i1)*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+(j1)*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+(21)*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+(i1)*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+(j1)*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+(41)*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=j1
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 530 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 24 (W88=24+EA) 24 (W88=13+EA) 34 36 (W88=23+EA) 23 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 24 (W88=24+EA) 24 (W88=13+EA) 34 36 (W88=23+EA) 23 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 24 (W88=24+EA) 24 (W88=13+EA) 34 36 (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 23
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 (0n) while BSR scans in reverse (n0). Clocks Size Bytes Operands
reg, reg reg, mem reg32, reg32 reg32, mem32 808x 286 386 10+3n 10+3n 10+3n 10+3n 486 642 743 642 743 3 37 37 37
ễ
ế
ậ
ộ
ỹ
ỹ
ậ 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 (0n) while BSR scans in reverse (n0). Clocks Size Bytes Operands
reg, reg reg, mem reg32, reg32 reg32, mem32 808x 286 386 10+3n 10+3n 10+3n 10+3n 486 6103 7104 6103 7104 3 37 37 37
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 48 48 37 37
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 48 48 37 37
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 48 48 37 37
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 48 48 37 37
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 procname. 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 24 (W88=13+EA) 24 (W88=13+EA) 34 36 (W88=14+EA) 23
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 (832 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 24 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 8090 144162 (8696)+EA 286 14 22 17 386 14 22 38 17 486 16 24 40 16
mem16 (150168)+EA 25 25 24
mem32 41 40 2 2 2 24 24 (W88=158176+EA) 24
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(n1) 386 10 12 15+4(n1) 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 920 920 386 ? ? 2 24 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 101112 165184 (107118)+EA (171190)+EA 286 17 25 20 38 386 19 27 43 22 30 46 486 19 27 43 20 28 44 2 2 2 24 24 (W88=175194) 24
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 8098 128154 86104 134160 286 13 21 16 24 21 21 2 21 24 24 386 914 922 938 1217 1225 1241 922 938 1225 1241 922 938 922 938 1225 1241 486 1318 1326 1242 1318 1326 1342 1326 1342 1326 1342 1326 1342 1326 1342 1326 1342 2 2 2 24 24 24 35 35 35 35 3 36 36 36 36 36
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 0255 it can be specified as an immediate, otherwise the port number must be specified in DX. Valid port ranges on the PC are 01024, 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 24 (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 writeback external caches is lost. Clocks Size Bytes
Operands none 808x 286 386 486 4 2
INVLPG Invalidate Translation LookAside Buffer Entry (486+)
Usage: INVLPG Modifies flags: None
Invalidates a single page table entry in the Translation LookAside 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 realmode/protectedmode
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 nearlabel 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 07 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 37 37
LDS Load Pointer Using DS dest, src Usage: LDS Modifies flags: None
Loads 32bit 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 24 57
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 24
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 32bit 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 24 (W88=24+EA) 57
LFS Load Pointer Using FS (386+) dest, src Usage: LFS Modifies flags: None
Loads 32bit 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 57 57
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 32bit 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 57 57
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 32bit 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 57 57
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 24 (W88=13+EA) 24 (W88=12+EA) 36 (W88=14+EA) 23 3 (W88=14) 3 (W88=14) 2 24 (W88=12+EA) 2 24 (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 37
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 37
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 7077 118113 (7683)+EA (124139)+EA 286 13 21 16 24 386 914 922 938 1217 1225 1221 486 1318 1326 1342 1318 1326 1342 2 2 24 24 24 24
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 24 (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 24 (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 24 (W88=24+EA) 24 (W88=13+EA) 34 36 36 23
ễ
ế
ậ
ộ
ỹ
ỹ
ậ 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 0255 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 01023. 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 0255 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 01023. 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 24 24
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 24 (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 24 1 23
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 reentering 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 830 931 830 931 2 24 (W88=23+EA) 2 24 (W88=28+EA+4n) 3 35
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 reentering 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 830 931 830 931 2 24 (W88=23+EA) 2 24 (W88=28+EA+4n) 3 35
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 reentering 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 24 (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 24 (W88=28+EA+4n) 3 35
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 reentering 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 24 (W88=23+EA) 2 24 (W88=28+EA+4n) 3 35
SAHF Store AH Register into FLAGS
Usage: SAHF Modifies flags: AF, CF, PF, SF, ZF
Transfers bits 07 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 24 (W88=23+EA) 2 24 (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 35
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 24 (W88=23+EA) 2 24 (W88=28+EA+4n) 3 35 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 24 (W88=24+EA) 24 (W88=13+EA) 34 36 (W88=25+EA) 23 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 24 (W88=23+EA) 2 24 (W88=28+EA+4n) 3 35
ế
ễ
ậ
ộ
ỹ
ỹ
ậ 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 autodecrement SI and DI
instead of autoincrement. 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 24 (W88=24+EA) 24 (W88=13+EA) 34 36 (W88=25+EA) 23
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 24 (W88=13+EA) 24 (W88=13+EA) 34 36 23
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 13 1
WBINVD WriteBack 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 24 (W88=25+EA) 24 (W88=25+EA) 1 1
XLAT/XLATB Translate Usage: XLAT translationtable (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 24 (W88=24+EA) 24 (W88=13+EA) 34 36 23
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