Bài giảng môn hợp ngữ | Trường Đại học Bách Khoa Hà Nội
Bài giảng môn hợp ngữ | Trường Đại học Bách Khoa Hà Nội. Tài liệu gồm 78 trang, giúp bạn tham khảo, ôn tập và đạt kết quả cao. Mời bạn đọc đón xem!
Preview text:
BÀI GI NG MÔN H P NG Qu ng Ngãi - 2015
Bài gi ng môn Assembly M c l c
Ch ngă1ă- C ăB N V H P NG ............................................................................................. 1
1.1 Cú pháp l nh h p ng ........................................................................................................... 1 1.1.1ăTr
ng Tên (Name Field) .............................................................................................. 1
1.1.2ăTr ng toán t (operation field) .................................................................................... 1
1.1.3ăTr ng các toán h ng (operand(s) field) ....................................................................... 1
1.1.4ăTr ng chú thích (comment field) ................................................................................. 2
1.2 Các ki u số li uătrongăch
ngătrìnhăh p ng ........................................................................ 2
1.2.1 Các số ............................................................................................................................. 2
1.2.2 Các ký tự ........................................................................................................................ 2
1.3 Các bi n (variables) .............................................................................................................. 3
1.3.1. Bi n byte ....................................................................................................................... 3
1.3.2 Bi n từ ............................................................................................................................ 3
1.3.3 M ng (arrays) ................................................................................................................. 3
1.4 Các hằng (constants) ............................................................................................................. 4
1.5 Các l nhăc ăb n ..................................................................................................................... 5
1.5.1 L nh MOV và XCHG .................................................................................................... 5
1.5.2 L nh ADD, SUB, INC, DEC ......................................................................................... 5
1.5.3 L nh NEG (negative) ..................................................................................................... 6
1.6 Chuy n ngôn ng cấp cao thành ngôn ng ASM ................................................................. 6
1.6.1 M nhăđ B=A................................................................................................................. 6
1.6.2 M nhăđ A=5-A ............................................................................................................. 6
1.6.3 M nhăđ A=B-2*A ........................................................................................................ 7 1.7 Cấu trúc c a m tăch
ngătrìnhăh p ng ............................................................................... 7
1.7.1 Các ki u b nhớ (memory models) ................................................................................ 7
1.7.2ăĐo n số li u ................................................................................................................... 7
1.7.3ăĐo năngĕnăx p ............................................................................................................... 7
1.7.4ăĐọan mã ......................................................................................................................... 7
1.8 Các l nh vào ra...................................................................................................................... 8
1.8.1 L nh IN T 21h................................................................................................................. 8
1.9ăCh ngătrìnhăđầu tiên ........................................................................................................... 9 1.10 T o ra và ch y m tăch
ngătrìnhăh p ng ........................................................................ 10
1.11 Xuất m t chu i ký tự ........................................................................................................ 10
1.12ăCh ngătrìnhăđổi ch th ng sang ch hoa...................................................................... 11
Bài gi ng môn Assembly
Ch ngă2ă- Tr ng thái c a vi x lý và các thanh ghi c ............................................................... 13
2.1 Các thanh ghi c (Flags register) ........................................................................................ 13
2.2 Tràn (overflow) ................................................................................................................... 14 2.3 Các l nh nhăh
ngăđ c nh ăth nào ............................................................................... 15
Ch ngă3ă- CÁC L NHăĐI U KHI N ....................................................................................... 18
3.1 Ví d v l nh nh y .............................................................................................................. 18
3.2 Nh yăcóăđi u ki n ............................................................................................................... 18
3.3 L nh JMP ............................................................................................................................ 21
3.4 Cấu trúc c a ngôn ng cấp cao ........................................................................................... 21
3.4.1 Cấu trúc r nhánh ......................................................................................................... 21
4.3.2 Cấu trúc lặp .................................................................................................................. 25
3.5 Lập trình với cấu trúc cấp cao............................................................................................. 26
Ch ngă4ă- CÁC L NH LOGIC, D CH VÀ QUAY ................................................................... 31
4.1 Các l nh logic...................................................................................................................... 31
4.1.1 L nh AN D,OR và XOR ............................................................................................... 31
4.1.2 L nh NOT .................................................................................................................... 33
4.1.3 L nh TEST ................................................................................................................... 33
4.2 L nh SHIFT ........................................................................................................................ 33
4.2.1 L nh d ch trái (left shift ) ............................................................................................. 34
4.2.2 L nh d ch ph i (Right Shift ) ....................................................................................... 34
4.3 L nh quay (Rotate).............................................................................................................. 35
4.4 Xuất nhập số nh phân và số hex ........................................................................................ 36
4.4.1 Nhập số nh phân ......................................................................................................... 36
4.4.2 Xuất số nh phân .......................................................................................................... 37
4.4.3 Nhập số HEX ............................................................................................................... 37
4.4.4 Xuất số HEX ................................................................................................................ 38
Ch ngă5ă- NGĔNăX P VÀ TH T C ...................................................................................... 40
5.1ăNgĕnăx p ............................................................................................................................. 40
5.2ă ngăd ng c a stack............................................................................................................. 42
5.3 Th t c (Procedure) ............................................................................................................ 43
5.4 CALL & RETURN ............................................................................................................. 44
5.5 Ví d v th t c ................................................................................................................... 46
Ch ngă6ă- L NH NHÂN VÀ CHIA........................................................................................... 48
6.1 L nh MUL và IMUL........................................................................................................... 48
Bài gi ng môn Assembly
6.2ă ngăd ngăđ năgi n c a l nh MUL và IMUL ..................................................................... 49
6.3 L nh DIV và IDIV .............................................................................................................. 50
6.4 M r ng dấu c a số b chia ................................................................................................. 51
6.5 Th t c nhập xuất số thập phân .......................................................................................... 51
Ch ngă7ă- M NG VÀ CÁC CH Đ Đ A CH ....................................................................... 58
7.1 M ng m t chi u .................................................................................................................. 58
7.2 Các ch đ đ a ch (addressing modes) ............................................................................... 59
7.2.1 Ch đ đ a ch gián ti p bằng thanh ghi....................................................................... 59
7.2.2 Ch đ đ a ch ch số vƠăc ăs ...................................................................................... 61
7.2.5 Truy xuấtăđo n stack .................................................................................................... 65
7.3 Sắp x p số li u trên m ng ................................................................................................... 65
7.4 M ng 2 chi u....................................................................................................................... 67
7.6ă ngăd ngăđ tính trung bình ............................................................................................... 69
7.7 L nh XLAT......................................................................................................................... 71 Ch
ng 1 - C ăB N V H P NG
Trongă ch ngă nƠyă s giới thi u nh ng nguyên tắcă chungă đ t o ra, d ch và ch y m tă ch ngă
trình h p ng trên máy tính. 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 .
1.1 Cú pháp l nh h p ng M tă ch
ngă trìnhă h p ng bao gồm m t lo t các m nhă đ (statement)ă đ c vi t liên ti p nhau, m i m nhă đ đ
c vi t trên 1 dòng. M t m nhă đ có th là :
- m t l nh (instruction)ă :ăđ
c trình biên d ch (Assembler =ASM) chuy n thành mã máy.
- 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 Operation Operand(s) Comment
cácătr ng cách nhau ít nhất là m t ký tự trống hoặc m t ký tự TAB ví d l nhă đ sau :
START : MOV CX,5 ; khơỉ tạo thanh ghi CX
SauăđơyălƠăm t ch dẫn c a ASM :
MAIN PROC ; tạo một thủ tục có tên là MAIN
1.1.1 Trường Tên (Name Field)
Tr ngă tênă đ c dùng cho nhãn l nh, tên th t c và tên bi n. ASM s chuy nă tênă thƠnhă đ a ch
b nhớ. Tên có th dài từ 1ăđ n 31 ký tự. Trong tên chứa các ký tự từ a-z, các số và các ký tự đặc
bi t sau : ? ,@, _, $ và dấu. Khôngăđ
c phép có ký tự trống trong phần tên. N u trong tên có ký
tự. thì nó ph i là ký tự đầu tiên. Tênă khôngă đ
c bắtă đầu bằng m t số. ASM không phân bi t gi a ký tự vi tă th ng và vi t hoa .
SauăđơyălƠăcácăvíăd v tên h p l và không h p l trong ASM . Tên h p l Tên không h p l COUNTER1 TWO WORDS @CHARACTER 2ABC SUM_OF_DIGITS A45.28 DONE? YOU&ME .TEST ADD-REPEAT
1.1.2 Trường toán tử (operation field)
Đối với 1 l nhă tr ng toán t ch áă kỦă hi u (symbol) c a mã phép toán (operation code =
OPCODE) .ASM s chuy n ký hi u mã phép toán thành mã máy. Thôngă th ng ký hi u mã
phép toán mô t chứcănĕngă c a phép toán, ví d ADD, SUB, INC, DEC, INT ...
Đối với ch dẫn c a ASM, tr ng toán t ch áăm t opcode gi (pseudo operation code = pseudo-
op). ASM không chuy n pseudo-op thành mã máy mà h ớng dẫn ASM thực hi n m t 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) field) Trong m t l nhă tr
ng toán h ng ch ra các số li u tham gia trong l nhă đó. M t l nh có th
không có toán h ng, có 1 hoặc 2 toán h ng. Ví d : NOP ; không có toán hạng INC AX ; 1 toán hạng
ADD WORD1,2 ; 2 toán hạng cộng 2 với nội dung của từ nhớ WORD1 1
Bài gi ng môn Assembly
Trong các l nh 2 toán h ng toán h ngă đầu là toán h ngă đíchă (destination operand). Toán h ng
đíchă th ng làthanh ghi hoặc v trí nhớ dùngă đ l uă tr k t qu . Toán h ng thứ hai là toán h ng
nguồn. Toán h ng nguồnă th
ng không b thay đổi 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 chứa m t hoặc nhi u thông tină mƠă ASMădùngă đ thực thi ch dẫn .
1.1.4 Trường chú thích (comment field)
Tr ng chú thích là m t tuỳ chọn c a m nhăđ trong ngôn ng ASM. Lập trìnhăviênădùngătr 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óă khôngă đ 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 mọi dòng c aă ch ngă trình, k c
nnh ng l nhă mƠă Ủănghĩaă c a nóăđưărất rỏ rƠngă nh ă : NOP ; không làm chi cả
Ng i ta dùng dấu chấm phẩyă(;)ăđ bắtăđầuătr ng chú thích . ASMăcũngăchoăphép dùng toàn b
m tă dòngă choă chúă thíchă đ t o m t kho ng trốngă ngĕnă cáchă cácă phần khác nhau cu ch ngătrìnhă ,ví d : ; ; khởi tạo các thanh ghi ; MOV AX,0 MOV BX,0
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ất c các lo i số li u 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 ới d ng nh phân, thập
phân hoặc thập l c phân và thậm chí là c ký tự n a . 1.2.1 Các số
M t số nh phân là m t dãy các bit 0 và 1 va 2ph i k t thúc bằng h hoặc H
M t số thập phân là m t dãy các ch só thập phân và k t thúc b i d hoặc D (có th không cần)
M t số hex ph i bắtăđầu b i 1 ch số thập phân và ph i k t thúc b i h hoặc H .
SauăđơyălƠăcácăbi u di n số h p l và không h p l trong ASM : Số Lo i 10111 thập phân 10111b nh phân 64223 thập phân -2183D thập phân 1B4DH hex 1B4D số hex không h p l FFFFH số hex không h p l 0FFFFH số hex 1.2.2 Các ký tự
Ký tự và m t chu i các ký tự ph iă đ
căđóngăgi a hai dấu ngoặcăđ năhoặc hai dấu ngoặc kép. Ví
d ‘A’ă vƠă “HELLO”. Các ký tự đ uă đ
c chuy n thành mã ASCII b i ASM. Doă đóă trongă m t
ch ngă trìnhă ASMăs xemăkhaiă báoă‘A’ăvƠă41hă(mưăASCIIăc a A) là giống nhau . 2
Bài gi ng môn Assembly
1.3 Các bi n (variables)
Trong ASM bi nă đóngă vaiă tròă nh ă trongă ngônă ng cấp cao. M i bi n có m t lo i d li u và nó
đ c gán m tăđ a ch b nhớ sau khi d chăch ngătrình. B ng sau đơyăli t kê các toán t gi dùng
đ đ nhă nghĩaă cácălo i số li u . PSEUDO-OP STANDS FOR DB define byte DW define word (doublebyte) DD
define doubeword (2 từ liên ti p) DQ
define quadword (4 từ liên ti p ) DT
define tenbytes (10 bytes liên ti p) 1.3.1. Biến byte
Ch dẫn c aăASMăđ đ nhă nghĩaă bi n byte có d ngă nh ăsauă : NAME DB 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 : BYT DB ?
Đối với bi n byte vùng giá tr kh dĩămƠănóăl uătr đ c là -128ăđ n 127ăđối với số có dấu và 0
đ nă255ăđối với số không dấu . 1.3.2 Biến từ
Ch dẫn c aăASMăđ đ nhă nghĩaă m t bi n từ nh ă sauă: NAME DW initial_value Ví d : WRD DW -2
Cũngă cóă th dùng dấuă ?ă đ thay th cho bi n từ có giá tr không xác đ nh. Vùng giá tr c a bi n
từ là -32768ăđ n 32767ăđối với số có dấuăvƠă0ăđ n 56535 đối với số không dấu . 1.3.3 Mảng (arrays)
Trong ASM m t m ng 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
B_ARRAYă lƠătênăđ căgánăchoăbyteăđầu tiên
B_ARRAY+1 là tên c a byte thứ hai
B_ARRAY+2 là tên c a byte thứ ba
N uăASMăgánă đ a ch offset là 0200h cho m ng B_ARRAY thì n i dung b nhớ s nh ă sauă: SYMBOL ADDRESS CONTENTS B_ARRAY 200h 10h B_ARRAY+1 201h 20h B_ARRAY+2 202h 30h
Ch dẫnăsauă đơyăs đ nhă nghĩaă m t m ng 4 phần t có tên là W_ARRAY: W_ARRAY DW 1000,40,29887,329 3
Bài gi ng môn Assembly
Gi s m ng bắtăđầu t i 0300h thì b nhớ s nh ă sau: SYMBOL ADDRESS CONTENTS W_ARRAY 300h 1000d W_ARRAY+2 302h 40d W_ARRAY+4 304h 29887d W_ARRAY+6 306h 329d
Byte thấp và byte cao của một từ
Đôiă khiă chúngă taă cần truy xuất tới byte thấp và byte cao c a m t bi n từ. Gi s chúngătaăđ nh nghĩaă : WORD1 DW 1234h
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 còn ký hi uă đ a ch c a byte cao là WORD1+1 .
Chuỗi các ký tự (character strings)
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 DW 41h,42h,43h t ngă đ ngăvới LETTERS DW ‘ABC ’
Bên trong m t chu i, ASM s phân bi t ch hoa và ch th
ng. Vì vậy chu i ‘abc’ă s đ c
chuy n thành 3 bytes : 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,4CH,4Ch,4FH,0AH,0DH,24H
1.4 Các hằng (constants) Trong m tă ch
ngă trìnhă cácă hằng có th đ că đặt tên nh ch dẫn EQU (equates). Cú pháp c a EQU là : NAME EQU constant ví d : LF EQU 0AH
sau khi có khaiă báoă trênă thìă LFă đ
că dùngă thayă choă 0Ahă trongă ch ngă trình. Vì vậy ASM s chuy n các l nh : 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ó khai báo này, thay cho MSG DB ‘TYPE YOUR NAME ’ chúng ta có th vi t MSG DB PROMPT 4
Bài gi ng môn Assembly 1.5 Các l nhăc ăb n
CPUă 8086ă cóă hƠngă trĕmă l nh, trongă ch ngă nƠyă ,chúngă taă s xem xét 7 l nh đ năgi n c a 8086
mƠă chúngă th ngă đ c dùng với các thao tác di chuy n số li u và thực hi n các phép toán số học.
Trong phầnă sauă đơy, WORD1 và WORD2 là các bi n từ, BYTE1 và BYTE2 là các bi n byte .
1.5.1 Lệnh MOV và XCHG
L nhă MOVă dùngă đ chuy n số li u gi a các thanh ghi, gi a 1 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 là :
MOV Destination, Source
SauăđơyălƠăvƠiăvíăd :
MOV AX,WORD1 ; lấy nội dung của từ nhớ WORD1 đưa vào thanh ghi AX
MOV AX,BX ; AX lấy nội dung của BX, BX không thay đổi
MOV AH,’A’ ; AX lấy giá trị 41h B ng sau cho thấyă cácătr
ng h p cho phép hoặc cấm c a l nh MOV
L nh XCHG (Exchange)ă dùngă đ traoă đổi n i dung c a 2 thanh ghi hoặc c a một thanh ghi và
một vị trí nhớ. Ví dụ : XCHG AH,BL
XCHG AX,WORD1 ; trao đổi nội dung của thanh ghi AX và từ nhớ WORD1.
Cũngă nh ăl nh MOV có m t số h n ch đối với l nhă XCHGănh ăb ng sau :
1.5.2 Lệnh ADD, SUB, INC, DEC
L nhă ADDă vƠă SUBă đ
că dùngă đ c ng và trừ n i dung c a 2 thanh ghi, c a m t thanh ghi và
m t v trí nhớ, hoặc c ng (trừ) m t số với (khỏi) m t thanh ghi hoặc m t v trí nhớ. Cú pháp là : ADD Destination, Source SUB Destination, Source Ví d : ADD WORD1, AX ADD BL, 5 5
Bài gi ng môn Assembly SUB AX,DX ; AX=AX-DX
Vì lý do kỹ thuật, l nhă ADDă vƠăSUBăcũngă b m t số h n ch nh ă b ng sau:
Vi c c ng hoặc trừ trực ti p gi a 2 v trí nhớ lƠă khôngă đ
c phép. Đ gi i quy t vấnă đ này
ng i ta ph i di chuy n byte (từ ) nhớ đ n m tăthanhăghiăsauăđó mới c ng hoặc trừ thanh ghi này
với m t byte (từ ) nhớ khác. Ví d : MOV AL, BYTE2 ADD BYTE1, AL
L nh INC (incremrent)ă đ 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 1 v trí nhớ. Cú pháp c a chúng là: INC Destination DEC Destination Ví d : INC WORD1 INC AX DEC BL
1.5.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 : NEG destination Ví d : NEG AX ;
Gi s AX=0002h sau khi thực hi n l nh NEG AX thì AX=FFFEh
L Uăụă: 2 toán h ng trong các l nhă trênăđơyăph i cùng lo i (cùng là byte hoặc từ )
1.6 Chuy n ngôn ng cấp cao thành ngôn ng ASM
Gi s A và B là 2 bi n từ . Chúng ta s chuy n các m nhăđ sau trong ngôn ng cấp cao ra ngôn ng ASM .
1.6.1 Mệnh đề B=A MOV AX,A ; đưa A vào AX MOV B,AX ; đưa AX vào B
1.6.2 Mệnh đề A=5-A MOV AX,5 ; đưa 5 vào AX SUB AX,A ; AX=5-A MOV A,AX ; A=5-A cách khác : NEG A ;A=-A ADD A,5 ;A=5-A 6
Bài gi ng môn Assembly
1.6.3 Mệnh đề A=B-2*A MOV AX,B ;Ax=B SUB AX,A ;AX=B-A SUB AX,A ;AX=B-2*A MOV A,AX ;A=B-2*A
1.7 Cấu trúc c a m tăch ngătrìnhăh p ng M tă ch
ngă trìnhă ngônă ng máy bao gồm mã (code), số li u (data) và ngĕn x p (stack ). M i
m t phần chi m m tă đo n b nhớ. M i m tă đo nă ch
ngă trìnhă lƠ đ c chuy n thành m tă đo n b nhớ b i ASM .
1.7.1 Các kiểu bộ nhớ (memory models)
Đ lớn c a mã và số li u trong m tă ch ngă trìnhă đ 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ớ : Model Description Small
code và data nằmătrongă1ăđo n Medium
code nhi uăh nă1ăđo nă,ădataătrongă1ăđo n Compact
data nhi uăh nă1ăđọană,ăcodeătrongă1ăđo n Large
code và dayta lớnăh nă1ăđo n , array không qúa 64KB Huge
code ,data lớn hớnă1ăđo n , array lớnăh nă64KB
1.7.2 Đoạn số liệu
Đo n số li u c aă ch ngă trìnhăch áăcácăkhaiăbáoăbi n, khai 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 các bi n, hằng và mãng ví d : .DATA WORD1 DW 2 WORD2 DW 5
MSG DB ‘THIS IS A MESSAGE ’ MASK EQU 10010010B
1.7.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 satck)ă đ 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ìă 1KBăđ c dành cho vùng stack .
.STACK 100h ; dành 256 bytes cho vùng stack 1.7.4 Đọan mã
Đo nămưăch áăcácăl nh 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ăđ c tổ chức thành th t c (procedure) mà cấu trúc c a m t th t că nh ă sauă: 7
Bài gi ng môn Assembly name PROC ; body of the procedure name ENDP
SauăđơyălƠăcâú 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 .MODEL SMALL .STACK 100h .DATA
; định nghĩa số liệu tại đây .CODE MAIN PROC ;thân của thủ tục MAIN MAIN ENDP
; các thủ tục khác nếu có END MAIN 1.8 Các l nh vào ra
CPU thông tin với các ngo i vi thông qua các cổng IO. 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ì 2 lý do:
- cácăđ a ch cổngă thayă đổi tuỳ theo lo i máy tính
- có th lập trình cho các IO d dƠngă h n nh cácă ch ngă trìnhă conă (routine)ă đ c cung
cấp b i các hãng ch t o máy tính Có 2 lo iă ch
ngătrìnhăph c v IO là : các routine c a BIOS (Basic Input Output System) và các routine c a DOS . 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
đơyă interrupt_numberă lƠă m t số mà nó ch đ nh m t routine. Ví d INT 16h gọi routine thực
hi n vi c nhập số li u từ Keyboard . 1.8.1 Lệnh INT 21h
INTă 21hă đ că dùngă đ gọi m t số lớn các 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 routine t ngă ứng .
Trong phần này chúng ta s quană tơmă đ nă 2ăhƠmă sauă đơyă: FUNCTION NUMBER ROUTINE 1 Single key input 2 Single character output
FUNTION 1 : Single key input Input : AH=1
Output: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 : MOV AH,1 ; input key function
INT 21h ; ASCII code in AL and display character on the screen 8
Bài gi ng môn Assembly
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 ? MOV AH,2
MOV DL,’?’ ; character is ‘?’ INT 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 áă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à : ASCII code (Hex) SYMBOL FUNCTION 7 BEL beep 8 BS backspace 9 HT tab A LF line feed D CR carriage return
1.9ăCh ngă trìnhăđầu tiên Chúng ta s vi 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óătrênăđầu dòng mới . TITLE PGM1: ECHO PROGRAM .MODEL SMALL .STACK 100H .CODE MAIN PROC ; display dấu nhắc MOV AH,2 MOV DL,’?’ INT 21H ; nhập 1 ký tự
MOV AH,1 ; hàm đọc ký tự
INT 21H ; ký tự được đưa vào AL
MOV BL,AL ; cất ký tự trong BL ; nhảy đến dòng mới
MOV AH,2 ; hàm xuất 1 ký tự
MOV DL,0DH ; ký tự carriage return
INT 21H, thực hiện carriage return
MOV DL,0AH ; ký tự line feed
INT 21H ; thực hiện line feed ; xuất ký tự 9
Bài gi ng môn Assembly
MOV DL,BL ; đưa ký tự vào DL INT 21H ; xuất ký tự ; trở về DOS
MOV AH,4CH ; hàm thoát về DOS INT 21H ; exit to DOS MAIN ENDP END MAIN
1.10 T o ra và ch y m tăch ngătrìnhăh p ng Tham kh o cách s d ngă ch
ngă trìnhă Emu8086ă trênăinternet.
1.11 Xuất m t chu i ký tự
Trongă ch ngă trìnhă PGM1ă trênă đơyă chúngă taă đưă dùngăINTă21HăhƠmă2ăvƠă4ăđ đọc và 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 chu i s khôngă đ
c in lên màn hình. N u chu i có chứa ký tự đi u khi n thì
chứcănĕngă đi u khi nă t
ngă ứng s đ c thực hi n . Chúng ta s vi tă 1ă ch
ngă trìnhă ină lênă mƠnă hìnhă chu iă “HELLO!”. Thông đi pă HELLOă đ c
đ nhă nghĩaă nh ăsauătrongă đo n số li u : MSG DB ‘HELLO!$’
Lệnh LEA (Load Effective Address ) LEA destnation, source
Ngắt 21h, hàm số 9 s xuất m t chu i ký tự ra màn hình vớiă đi u ki nă đ a ch hi u d ng c a bi n
chu i ph i trên DX. Có th thực hi nă đi u này b i l nh :
LEA DX,MSG ; đưa địa chỉ offset của biến MSG vào DX
Program Segment Prefix (PSP ) : Phần đầu của đo n Ếhương trình Khi m tă ch
ngătrìnhăđ c n p vào b nhớ máy tính, DOS dành ra 256 byte cho cái gọi là PSP.
PSPă ch áă m t số thông tin v ch ngă trìnhă đangă đ c n p trong b nhớ. Đ choă cácă ch ngă
trình có th truy xuất tới PSP, DOSă đặt số phân đo n c a nó (PSP) trong c DSă vƠă ESă tr ớc khi thựcă thiă ch
ngă trình. K t q a là thanh ghi DS không chứa số đo n c aăđo n số li u c aăch ngă
trình. Đ khắc ph că đi u này, m tă ch
ngă trìnhă cóă chứaă đo n số li u ph iă đ c bắtă đầu b i 2 l nhă sauăđơyă: MOV AX,@DATA MOV DS,AX
đơyă @DATAă lƠă tênă c aă đo n số li uă đ
că đ nhă nghĩaă b i DATA . Assembler s chuy n @DATA thành số đo n .
SauăđơyălƠăch ngă trìnhă hoƠnăch nhă đ xuất chu i ký tự HELLO!
TITLE PGM2: PRINT STRING PROGRAM .MODEL SMALL .STACK 100H .DATA 10
Bài gi ng môn Assembly MSG DB ‘HELLO!$’ .CODE MAIN PROC ; initialize DS MOV AX,@DATA MOV DS,AX ; display message LEA DX,MSG MOV AH,9 INT 21H ; return to DOS MOV AH,4CH INT 21H MAIN ENDP END MAIN
1.12ăCh ngă trìnhăđổi ch th ờng sang ch hoa Chúng ta s vi tă 1ă ch
ngătrìnhăyêuăcầuăng i dùng gõ vào m t ký tự bằng ch th ng. Ch ngă
trình s đổi nó sang d ng ch hoa rồi in ra dòng ti p theo .
TITLE PGM3: CASE COVERT PROGRAM .MODEL SMALL .STACK 100H .DATA CR EQU 0DH LF EQU 0AH
MSG1 DB ‘ENTER A LOWER CASE LETTER:$’
MSG2 DB 0DH,0AH,’IN UPPER CASE IT IS :’
CHAR DB ?,’$’ ; định nghĩa biến CHAR có giá trị ban đầu chưa ;xác định .CODE MAIN PROC ; INITIALIZE DS MOV AX,@DATA MOV DS,AX ;PRINT PROMPT USER
LEA DX,MSG1 ; lấy thông điệp số 1 MOV AH,9
INT 21H ; xuất nó ra màn hình
;nhập vào một ký tự thường và đổi nó thành ký tự hoa
MOV AH,1 ; nhập vào 1 ký tự INT 21H ; cất nó trong AL
SUB AL,20H ; đổi thành chữ hoa và cất nó trong AL 11
Bài gi ng môn Assembly
MOV CHAR, AL ; cất ký tự trong biến CHAR
; xuất ký tự trên dòng tiếp theo
LEA DX, MSG2 ; lấy thông điệp thứ 2 MOV AH,9
INT 21H ; xuất chuỗi ký tự thứ hai, vì MSG2 không kết
;thúc bởi ký tự $ nên nó tiếp tục xuất ký tự có trong biến CHAR ;dos exit MOV AH,4CH INT 21H ; dos exit MAIN ENDP END MAIN 12
Bài gi ng môn Assembly
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 l nh nh y, rẻ nhánh và lặp . 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 Các thanh ghi cờ (Flags 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 khác là kh nĕngă choă cácă
quy tă đ nh. M t m chă đặc bi t trong CPU có th làm các quy t đ nh này bằngă cáchă cĕnă cứ vào
tr ng thái hi n hành c a CPU. Có m tă thanhă ghiă đặc bi t cho bi t tr ng thái c aă CPUă đóă lƠă thanhă ghi c .
B ng 2.1 cho thấy thanh ghi c 16 bit c a 8086 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF
B ng 2.1 :Thanh ghi c c a 8086
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 q a thực hi n l nh c a CPU. B ng 2.2 ch ra tên và B ng 2.2 : Các c c a 8086
M i bit trên thanh ghi c ph n ánh 1 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
c ZF =1, nghĩaă lƠăk t q a c a phép trừ là zero .
C nhớ (Carry Flag - CF) : CF=1 n u xuất hi n bit nhớ (carry) từ v trí MSB trong khi thực hi n
phép c ng hoặcă cóă bită m n (borrow ) t i MSB trong khi thực hi n phép trừ. Trongă cácă tr ng
h p khác CF=0. C CFăcũng b nhă h
ng b i l nh d ch (Shift) và quay (Rotate) số li u .
C chẳn lẻ (Parity Flag - PF) : PF=1 n u byte thấp c a k t q a có tổng số con số 1 là m t số chẳn
(even parity). PF=0 n u byte thấp là chẳn lẻ lẻ (old parity ). Ví d n u k t q a là FFFEh thì PF=0
C nhớ ph (Auxiliary Carry Flag - AF ) :AF =1 n u có nhớ (m n) từ bit thứ 3 trong phép c ng (trừ) .
C Zero (Zero Flag -ZF) : ZF=1 n u k t q a là số 0 .
C dấu (Sign Flag - SF ) : SF=1 n u MSB c a k t q a là 1 (k t q a là số âm ). SF=0 n u MSB=0 13
Bài gi ng môn Assembly
C tràn (Overflow Flag - OF ) : OF=1 n u x y ra tràn số trong khi thực hi n các phép toán. Sau
đơy chúng ta s phơnă tíchă cácă tr ng h p x y ra tràn trong khi thực hi n tính toán. Hi nă t ng
tràn số liênă quană đ n vi c bi u di n số trong máy tính với m t số h u h n các bit. 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 từ (16 bit) 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ố có th
bi u di n trong m t từ lƠă 0ă đ n 65535, trong m tă byteă lƠă 0ă đ n 255. N uk t q a c a m t phép
toánăv 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 q a thuăđ c s b sai . 2.2 Tràn (overflow)
Có 2 lo i tràn số : Tràn có dấu (signed 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 phép c ng, s x y ra 4 kh nĕngă sauăđơy : 1) không tràn 2) ch tràn dấu 3) ch tràn không dấu
4) tràn c dấu và không dấu
Ví d c a tràn không dấu là phép c ng ADD AX,BX với AX=0FFFFh, BX=0001h .K t q a d ới d ng nh phân là : 1111 1111 1111 1111 0000 0000 0000 0001 10000 0000 0000 0000
N u di n gi i k t q aă d ới d ng không dấu thì k t q aă lƠă đúngă (10000h=65536). Nh ngă k t q a
đư v tă quáă đ lớn c a từ nhớ. Bit 1 (bit nhớ từ v trí MSBă )ă đưă x y ra và k t q a trên 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ăđơyălƠăphépăc ng
hai số có dấu thì k t q aă trênă AXă =ă 0000hă lƠă đúng, vì FFFFh = -1 , còn 0001h = +1, doăđóăk t
q a phép c ng là 0. Vậy trongă tr
ng h p này sự tràn dấu không x y ra .
Ví d v sự tràn dấu : gi s AX = BX = 7FFFh , l nh ADD AX,BX s cho k t q aănh ăsauă : 0111 1111 1111 1111 0111 1111 1111 1111 1111 1111 1111 1110 = FFFE h
Bi u di n có dấu và không dấu c a 7FFFh là 3276710. Nh ă vậyă lƠă đối với phép c ng có dấu
cũngănh không dấu thì k t q a vẫn là 32767 + 32767 = 65534. Số nƠy(65534)ăđưăv t ngoài dãi
giá tr mà 1 số 16 bit 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ă:
- CPU s set OF =1 n u x y ra tràn dấu
- CPU s set CF = 1 n u x y ra tràn không dấu Sau khi có tràn, m tă ch
ngătrìnhăh p lý s đ c thực hi năđ s a sai k t q a ngay lập tức. Các
lập trình viên s ch ph i quan tâm tới c OF hoặc CF n u bi u di n số c a họ là có dấu hay không dấu m tă cáchăt ng ứng .
Vậy thì làm th nƠoăđ CPU bi tă đ c có tràn ?
- Tràn không dấu s x y ra khi có m t bit nhớ (hoặc m n ) từ MSB
- Tràn dấu s x yă raătrongă cácătr ng h p sau :
a) Khi c ng hai số cùng dấu, sự tràn dấu x y ra khi tổng có dấu khác với hai toán h ngă banăđầu .
Trong ví d 2, c ng hai số 7FFFh +7FFFh (hai số d
ng )ănh ngă k t q a là FFFFh (số âm) 14
Bài gi ng môn Assembly
b) Khi trừ hai số khác dấu (giốngă nh ă c ng hai số cùng dấu) k t q a ph i có dấu h p lý .N u k t
q a cho dấuă khôngă nh ă mongă đ iă thìă cóă nghĩaă lƠă đưă x y ra sự tràn dấu. Ví d 8000h - 0001h = 7FFFh (số d ngă). Do đó OF=1 .
Vậy làm th nƠoăđ CPU ch ra rằng có tràn ? - OF=1 n u tràn dấu - CF=1 n u tràn không dấu
Làm th nƠoăđ CPU bi t là có tràn ?
- Tràn không dấu x y ra khi có số nhớ (carry) hoặc m n (borrow) từ MSB
- Tràn dấu x y ra khi c ng hai số cùng dấu (hoặc trừ 2 số khác dấu ) mà k t q a với dấu khác với dấuămongă đ i
- Phép c ng hai số có dấu khác nhau không th x y ra sự tràn. Trên thực t CPUădùngăph ngă
pháp sau : c OF=1 n u số nhớ vào và số nhớ ra từ 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ă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Ơă :
- C h ớng (Direction Flag = DF) - C bẫy (Trap flag = TF)
- C ngắt (Interrupt Flag = IF) Các c đi u khi nă đ
cădùngăđ đi u khi n ho tăđ ng c a CPU C h ớngă (DF)ă đ
c dùng trong các l nh x lý chu i c a CPU. M că đíchă c aă DFă lƠă dùngă đ
đi u khi nă h ớng mà m t chu iă đ c x lý. Trong các l nh x lý chu i hai thanh ghi DI và SI
đ că dùngă đ đ a ch b nhớ chứa chu i. N u DF=0 thì l nh x lý chu i s tĕng đ a ch b nhớ sao cho chu iă đ
c x lý từ trái sang ph i N u DF=1 thìă đ a ch b nhớ s đ c x lý theo
h ớng từ ph i sang trái .
2.3 Các l nh nhă h ởngă đ cờ nh ă th nào
T i m t th iă đi m, CPU thực hi n 1 l nh, các c lầnă l t ph n ánh k t q a thực hi n l nh. Dĩă
nhiên có m t số l nhă khôngă lƠmă thayă đổi m t c nào c hoặc thay đổi ch 1 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 ch
ngă tr ớc ) lên các c nh ăth nào .
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 NONE ADD/SUB ALL INC/DEC ALL trừ CF NEG ALL
(CF=1 trừ khi k t q a bằng 0 , OF=1 n u k t q a là 8000H )
Đ thấy rỏ nhăh ng c a các l nh lên các c chúng ta s lấy vài ví d .
Ví d 1ă:ăADDă AX,AXă trongă đóăAX=BX=FFFFh FFFFh + FFFFh 1FFFEh
K t q a chứa trên AX là FFFEh = 1111 1111 1111 1110 SF=1 vì MSB=1 15
Bài gi ng môn Assembly
PF=0 vì có 7 (lẻ) số 1 trong byte thấp c a k t q a ZF=0 vì k t q a khác 0 CF=1 vì có nhớ 1 từ MSB
OF=0 vì dấu c a k t q a giốngă nh ă dấu c a 2 số h ngă banăđầu .
Ví d 2ă:ăADDă AL,BLă trongă đóăAL=ăBL=ă 80h 80h + 80h 100h K t q a trên AL = 00h SF=0 vì MSB=0
PF=1 vì tất c cácăbită đ u bằng 0 ZF=1 vì k t q a bằng 0 CF=1 vì có nhớ 1 từ MSB
OF=1 vì c 2 toán h ng là số ơmă nh ngă k t q a là số d
ngă(có nhớ ra từ MSBănh ngăkhôngă có nhớ vào ) .
Ví d 3ă:ăSUBă AX,BXă trongă đóăAX=8000hă vƠăBX= 0001h 8000h - 0001h 7FFFFh = 0111 1111 1111 1111 SF=0 vì MSB=0
PF=1 vì có 8 (chẳn ) số 1 trong byte thấp c a k t q a ZF=0 vì k t q a khác 0 CF=0ăvìăkhôngă cóăm n
OF=1 vì trừ m t số âm cho 1 số d ngă (tức là c ng
2 số âm ) mà k t q a là m t số d ngă.
Ví d 4ă:ăINCăALătrongă đóăAL=FFh
K t q a trên AL=00h = 0000 0000 SF=0 vì MSB=0 PF=1 ZF=1 vì k t q a bằng 0 CF không b nh h
ng b i l nh INC mặc dù có nhớ 1 từ MSB
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 từ MSB) Ví d 5: MOV AX,-5 K t qu trên BX = -5 = FFFBh Không có c nào nhă h ng b i l nh MOV
Ví d 6:ăNEGăAXătrongă đóăAX=8000h 8000h =1000 0000 0000 0000 bù 1 =0111 1111 1111 1111 +1 1000 0000 0000 0000 = 8000h K t q a trên AX=8000h SF=1 vì MSB=1 16