Giáo trình Vi xử lý - Chương 3: Lập trình hợp ngữ - Phạm Hùng Kim Khánh

Tài liu vi xlý  
Lp trình hp ngữ  
CHƯƠNG 3: LP TRÌNH HP NGỮ  
1. Các tp tin .EXE và .COM  
DOS chcó ththi hành được các tp tin dng .COM và .EXE. Tp tin .COM  
thường dùng để xây dng cho các chương trình nhcòn .EXE dùng cho các chương  
trình ln.  
1.1.  
Tp tin .COM  
- Tp tin .COM chcó mt đon nên kích thước ti đa ca mt tp tin loi  
này là 64 KB.  
- Tp tin .COM được np vào bnhvà thc thi nhanh hơn tp tin .EXE  
nhưng cháp dng được cho các chương trình nh.  
- Chcó thgi các chương trình con dng near.  
Khi thc hin tp tin .COM, DOS định vbnhvà to vùng nhdài 256  
byte vtrí 0000h, vùng này gi là PSP (Program Segment Prefix), nó scha các  
thông tin cn thiết cho DOS. Sau đó, các mã lnh trong tp tin sẽ được np vào sau  
PSP vtrí 100h và đưa giá tr0 vào stack. Như vy, kích thước ti đa thc sca  
tp tin .COM là 64 KB – 256 byte PSP – 2 byte stack.  
Tt ccác thanh ghi đon đều chỉ đến PSP và thanh ghi con trlnh IP chỉ  
đến 100h, thanh ghi SP có giá tr0FFFEh.  
1.2.  
Tp tin .EXE  
- Nm trong nhiu đon khác nhau, kích thước thông thường ln hơn 64  
KB.  
- Có thgi được các chương trình con dng near hay far.  
- Tp tin .EXE cha mt header ở đầu tp tin để cha các thông tin điu  
khin cho tp tin.  
2. Khung ca mt chương trình hp ngữ  
Khung ca mt chương trình hp ngcó dng như sau:  
TITLE  
Chương trình hp ngữ  
Kiu kích thước bnhớ  
.MODEL  
; Khai báo quy mô sử  
; dng bnhớ  
.STACK  
.DATA  
Kích thước  
; Khai báo dung lượng  
; đon stack  
; Khai báo đon dliu  
msg DB 'Hello$'  
.CODE  
; Khai báo đon mã  
main PROC  
CALL  
Subname  
PROC  
; Gi chương trình con  
main ENDP  
Subname  
; Định nghĩa chương  
; trình con  
Phm Hùng Kim Khánh  
Trang 44  
Tài liu vi xlý  
Lp trình hp ngữ  
RET  
Subname  
END main  
ENDP  
™ Quy mô sdng bnh:  
Bng 3.1:  
Loi  
Mô tả  
Tiny  
Mã lnh và dliu nm trong mt đon  
Small  
Medium  
Mã lnh trong mt đon, dliu trong mt đon  
Mã lnh không nm trong mt đon, dliu trong mt đon  
Compact Mã lnh trong mt đon, dliu không nm trong mt đon  
Large  
Mã lnh không nm trong mt đon, dliu không nm trong mt đon  
và không có mng nào ln hơn 64KB  
Mã lnh không nm trong mt đon, dliu không nm trong mt đon  
và các mng có thln hơn 64KB  
Huge  
Thông thường, các ng dng đơn gin chỉ đòi hi mã chương trình không quá  
64 KB và dliu cũng không ln hơn 64 KB nên ta sdng dng Small:  
.MODEL  
SMALL  
™ Khai báo kích thước stack:  
Khai báo stack dùng để dành ra mt vùng nhdùng làm stack (chyếu phc  
vcho chương trình con), thông thường ta chn khong 256 byte là đủ để sdng  
(nếu không khai báo thì chương trình dch tự động cho kích thước stack là 1 KB):  
.STACK  
256  
™ Khai báo đon dliu:  
Đon dliu dùng để cha các biến và hng sdng trong chương trình.  
™ Khai báo đon mã:  
Đon mã dùng cha các mã lnh ca chương trình. Đon mã bt đầu bng  
mt chương trình chính và có thcó các lnh gi chương trình con (CALL).  
Mt chương trình chính hay chương trình con bt đầu bng lnh PROC và kết  
thúc bng lnh ENDP (đây là các lnh gica chương trình dch). Trong chương  
trình con, ta sdng thêm lnh RET để trvề địa chlnh trước khi gi chương trình  
con.  
3. Cú pháp ca các lnh trong chương trình hp ngữ  
Mt dòng lnh trong chương trình hp nggm có các trường (field) sau  
(không nht thiết phi đầy đủ tt ccác trường):  
Phm Hùng Kim Khánh  
Trang 45  
Tài liu vi xlý  
Lp trình hp ngữ  
Tên Lnh  
A: MOV  
Main PROC  
Toán hng Chú thích  
AH,10h ; Đưa giá tr10h vào thanh ghi AH  
Trường tên cha nhãn, tên biến hay tên thtc. Các tên nhãn có thcha ti  
đa 31 ký t, không cha ký ttrng (space) và không được bt đầu bng s(A: hay  
Main:). Các nhãn được kết thúc bng du ':'.  
Trường lnh cha các lnh sthc hin. Các lnh này có thlà các lnh tht  
(MOV) hay các lnh gi(PROC). Các lnh tht sẽ được dch ra mã máy.  
Trường toán hng cha các toán hng cn thiết cho lnh (AH,10h).  
Trường chú thích phi được bt đầu bng du ';'. Trường này chdùng cho  
người lp trình để ghi các li gii thích cho chương trình. Chương trình dch sbỏ  
qua các lnh nm phía sau du ;.  
3.1.  
Khai báo dliu  
Khi khai báo dliu trong chương trình, nếu sdng snhphân, ta phi  
dùng thêm chB cui, nếu sdng sthp lc phân thì phi dùng chH cui.  
Chú ý rng đối vi sthp lc phân, nếu bt đầu bng chA..F thì phi thêm vào  
s0 phía trước.  
Ví d:  
1011b  
1111  
; Snhphân  
; Sthp phân  
; Sthp lc phân  
1011h  
3.2.  
Khai báo biến  
Khai báo biến nhm để chương trình dch cung cp mt địa chxác định trong  
bnh. Ta dùng các lnh gisau để định nghĩa các biến ng vi các kiu dliu  
khác nhau: DB (define byte), DW (define word) và DD (define double word).  
VD:  
A1  
DB  
1
; Định nghĩa biến A1 dài 1 byte (chương  
; trình dch sdùng 1 byte trong bnhớ để  
; lưu trA1), trban đầu A1 = 1  
A2  
DB  
?
; Biến A2 kiu byte, không có giá trgán  
; ban đầu  
A3  
A4  
DB 'A'  
DW 1  
; Biến kiu ký tự  
; Định nghĩa biến A4 dài 2 byte, giá trban  
; đầu A4 = 1, ta cũng có thdùng du ? để  
; xác định biến không cn khi to giá trban đầu  
; Biến A5 dài 4 byte  
A5  
A6  
DD  
1
DB 1,2,3 ; Định nghĩa biến mng (array) gm có 3  
; phn t, mi phn tdài 1 byte (nghĩa là  
; sdùng 3 byte lưu tr) vi các giá trban  
; đầu ca các phn tln lượt là 1,2,3  
A7  
DB 10  
DUP(0)  
; Khai báo biến mng gm 10 phn t, mi  
; phn tcó chiu dài 1 byte vi giá trgán  
; ban đầu là 0  
Phm Hùng Kim Khánh  
Trang 46  
Tài liu vi xlý  
Lp trình hp ngữ  
A8  
DB 10  
DUP(?)  
; Khai báo biến mng gm 10 phn t, mi  
; phn tcó chiu dài 1 byte, không cn  
; gán giá trban đầu  
Ngoài ra ta có thdùng các toán tDUP lng vào nhau khi khai báo biến  
mng. Gista cn khai báo mng A9 có các giá trgán ban đầu  
1,2,3,1,1,3,2,2,1,1,3,2,2. Ta có ththc hin như sau:  
A9  
Hay: A9  
Hay: A9  
DB 1,2,3,1,1,3,2,2,1,1,3,2,2  
DB 1,2,3,2 DUP(1,1,3,2,2)  
DB 1,2,3,2 DUP(2 DUP(1),3,2 DUP(2))  
Đối vi các biến có nhiu hơn 1 byte, byte thp scha ô nhđịa chỉ  
thp và byte cao scha ô nhđịa chcao.  
VD:  
A10 DW 1234h  
Biến A10 gisbt đầu lưu ti địa ch1000h thì ô nh1000h cha giá tr34h  
còn ô nh1001h cha giá tr12h.  
Đối vi biến kiu chui (string), thc cht là mt mng các ký t, ta có thể  
khai báo như sau:  
A11 DB 'ABCD'  
Hay A11 DB 65h,66h,67h,68h  
Sau lnh khai báo này thì ô nh1000h (gisbiến A11 lưu trti địa chỉ  
1000h) cha 'A', 1001h cha 'B', 1002h cha 'C' và 1003h cha 'D'.  
3.3.  
Khai báo hng  
Các hng khai báo trong chương trình hp ngbng lnh giEQU để chương  
trình dhiu hơn. Hng có thể ở dng s, ký thay chui.  
VD:  
A12 EQU 10  
A13 EQU 'AAA'  
Sau khi sdng khai báo này, nếu ta dùng lnh:  
MOV AH,A12  
thì AH = 10h  
A14 DB 'B',A13  
thì khai báo chui A14 vi giá trgán ban đầu là 'BAAA'.  
Phm Hùng Kim Khánh  
Trang 47  
Tài liu vi xlý  
Lp trình hp ngữ  
4. Các toán ttrong hp ngữ  
™ Toán tshc:  
Bng 3.2:  
Toán tử  
Cú pháp  
Mô tả  
+
+bt  
Sdương  
-
-bt  
Sâm  
Nhân  
Chia  
*
bt1*bt2  
bt1/bt2  
/
mod  
+
bt1 mod bt2 Ly phn dư  
bt1 + bt2  
bt1 – bt2  
bt shl n  
Cng  
-
Trừ  
shl  
shr  
Dch trái n bit  
Dch phi n bit  
bt shr n  
Trong đó bt, bt1, bt2 là các biu thc hng, n là snguyên.  
VD: MOV AH,(8+1)*7/3  
MOV AH, 00010001b shr 2  
MOV AH,00010001b shl 2  
MOV AH,100 mod 3  
; AH 21  
; AH 0000 0100b  
; AH 0100 0100b  
; AH 1  
™ Toán tlogic:  
Bao gm các toán tAND, OR, NOT, XOR  
VD: MOV AH,10 OR 4 AND 2  
; AH = 10  
; AH = 70h  
MOV AH, 0F0h AND 7Fh  
™ Toán tquan h:  
Các toán tquan hso sánh 2 biu thc, cho giá trtrue (-1) nếu điu kin  
thovà false (0) nếu không tho.  
Bng 3.3:  
Toán tử  
EQ  
Cú pháp  
Mô tả  
bt1 EQ bt2 Bng  
NE  
bt1 NE bt2 Không bng  
bt1 LT bt2 Nhhơn  
LT  
LE  
bt1 LE bt2 Nhhơn hay bng  
bt1 GT bt2 Ln hơn  
GT  
GE  
bt1 GE bt2 Ln hơn hay bng  
Phm Hùng Kim Khánh  
Trang 48  
Tài liu vi xlý  
Lp trình hp ngữ  
™ Các toán tcung cp thông tin:  
¾ Toán tSEG:  
SEG bt  
Toán tSEG xác định địa chỉ đon ca biu thc bt. bt có thlà biến, nhãn,  
hay các toán hng bnh.  
¾ Toán tOFFSET:  
OFFSET bt  
Toán tOFFSET xác định địa choffset ca biu thc bt. bt có thlà biến,  
nhãn, hay các toán hng bnh.  
VD: MOV AX,SEG A  
MOV DS,AX  
; Np địa chỉ đon và địa choffset  
; ca biến A vào cp thanh ghi  
; DS:AX  
MOV AX,OFFSET A  
¾ Toán tchs[ ]: (index operator)  
Toán tchsthường dùng vi toán hng trưc tiếp và gián tiếp.  
¾ Toán t(:) (segment override operator)  
Segment:bt  
Toán t: quy định cách tính địa chỉ đối vi segment được ch. Segment là các  
thanh ghi đon CS, DS, ES, SS.  
Chú ý rng khi sdng toán t: kết hp vi toán t[ ] thì segment: phi đặt  
ngoài toán t[ ].  
VD: Cách viết [CS:BX] là sai, ta phi viết CS:[BX]  
¾ Toán tTYPE:  
TYPE bt  
Trvgiá trbiu thdng ca biu thc bt.  
- Nếu bt là biến thì strv1 nếu biến có kiu byte, 2 nếu biến có kiu  
word, 4 nếu biến có kiu double word.  
- Nếu bt là nhãn thì trv0FFFFh nếu bt là near và 0FFFEh nếu bt là far.  
- Nếu bt là hng thì trv0.  
¾ Toán tLENGTH:  
LENGTH bt  
Trvscác đơn vcp cho biến bt  
¾ Toán tSIZE:  
SIZE bt  
Trvtng scác byte cung cp cho biến bt  
VD: A  
DD 100 DUP(?)  
MOV AX,LENGTH A  
MOV AX,SIZE A  
; AX = 100  
; AX = 400  
Phm Hùng Kim Khánh  
Trang 49  
Tài liu vi xlý  
Lp trình hp ngữ  
™ Các toán tthuc tính:  
¾ Toán tPTR:  
Loai PTR bt  
Toán tnày cho phép thay đổi dng ca biu thc bt.  
- Nếu bt là biến hay toán hng bnhthì Loai là byte, word hay dword.  
- Nếu bt là nhãn thì Loai là near hay far.  
VD: A  
DW 100 DUP(?)  
DD  
B
?
MOV AH,BYTE PTR A  
MOV AX,WORD PTR B  
¾ Toán tHIGH, LOW:  
; Đưa byte đầu tiên trong mng A  
; vào thanh ghi AH  
; Đưa 2 byte thp trong biến B  
; vào thanh ghi AX  
HIGH bt  
LOW bt  
Cho giá trca byte cao và thp ca biu thc bt, bt phi là mt hng.  
VD: A  
EQU 1234h  
MOV AH,HIGH A  
MOV AH,LOW A  
; AH 12h  
; AH 34h  
5. Các cách định địa chtrong hp ngữ  
™ Toán hng trc tiếp:  
Toán hng trc tiếp là mt biu thc hng xác định. Các hng scó thể ở  
dng thp phân (có du và không du), nhphân, thp lc phân, các hng số định  
nghĩa bng lnh EQU, …  
VD: MOV AH,10  
MOV AH,1010b  
MOV AH,0Ah  
MOV AH,A12  
MOV AX,OFFSET msg  
MOV AX,SEG msg  
™ Toán hng thanh ghi:  
Các thanh ghi có thsdng trong phép định địa chthanh ghi là AH, BH,  
CH, DH, AL, BL, CL, DL, AX, BX, CX, DX, SP, BP, SI, DI, CS, DS, ES, SS.  
™ Toán hng bnh:  
¾ Trc tiếp:  
Toán hng này xác định dliu lưu trong bnhti mt địa chxác định khi  
dch, địa chnày là mt biu thc hng (có thkết hp vi toán tchs[ ] hay toán  
t+, -, :). Thanh ghi đon mc định là thanh ghi DS nhưng ta có thdùng toán t:  
để chthanh ghi đon khác.  
Phm Hùng Kim Khánh  
Trang 50  
Tài liu vi xlý  
Lp trình hp ngữ  
VD: A  
DW 1000h  
B
DB 100 DUP(0)  
MOV AX,A  
; Chuyn ni dung ca biến A vào  
MOV AX,[A]  
MOV AH,B  
; thanh ghi AX  
; Truy xut phn tử đầu tiên ca  
; mng B  
MOV AH,B[0]  
MOV AH,B + 1  
MOV AH,B[1]  
MOV AH,B + 5  
MOV AH,B[5]  
; Truy xut phn tthhai ca  
; mng B  
; Truy xut phn tth6 ca  
; mng B  
Chú ý rng lnh MOV AX,[1000h] schuyn giá tr1000h vào thanh ghi AX.  
Nếu mun chuyn ni dung ti ô nh1000h vào thanh ghi AX thì phi dùng lnh  
MOV AX,DS:[1000h] hay MOV AX,DS:1000h  
¾ Gián tiếp:  
Toán hng bnhgián tiếp cho phép dùng các thanh ghi BX, BP, SI, DI để  
chcác giá trtrong bnh.  
VD: MOV BX,2  
MOV SI,3  
MOV AH,B[BX]  
; Chuyn phn tth3 ca mng B  
; vào thanh ghi AH  
MOV AH,B[BX+1]  
MOV AH,B[BX]+1  
MOV AH,B[BX+SI]  
MOV AH,B[BX][SI]  
MOV AH,[B+BX+SI]  
MOV AH,[B][BX][SI]  
; Chuyn phn tth4 ca mng B  
; vào thanh ghi AH (BX + 1 = 3)  
; Chuyn phn tth6 ca mng B  
; vào thanh ghi AH  
; BX + SI = 5  
MOV AH,B[BX+SI+5] ; Chuyn phn tth11 ca mng B  
MOV AH,B[BX][SI]+5 ; vào thanh ghi AH  
MOV AH,[B+BX+SI+5] ; BX + SI + 5 = 10  
6. To và thc thi chương trình hp ngữ  
Ta có thto và thc thi mt chương trình hp ngtrên mt máy PC theo các  
bước sau:  
- Dùng mt chương trình son tho văn bn không định dng (như NC) to  
mt tp tin cha chương trình hp ng(gán phn mrng ca tp tin này  
là .ASM, gislà TEMP.ASM).  
- - Dùng chương trình TASM.EXE (Turbo Assembler) để dch ra mã máy  
dng .OBJ:  
TASM TEMP  
- Sau khi dch xong, ta sẽ được file TEMP.OBJ cha các mã máy ca  
chương trình. Để chuyn thành file thc thi, ta dùng chương trình  
TLINK.EXE để chuyn thành tp tin .EXE: TLINK TEMP  
- - Nếu tp tin thc thi dng .COM thì ta dùng thêm chương trình  
EXE2BIN.EXE:  
EXE2BIN TEMP TEMP.COM  
Phm Hùng Kim Khánh  
Trang 51  
Tài liu vi xlý  
Lp trình hp ngữ  
7. Tp lnh hp ngữ  
7.1.  
Nhóm lnh chuyn dliu  
7.1.1.Nhóm lnh chuyn dliu đa dng  
™ Lnh MOV dst,src: chuyn ni dung toán hng src vào toán hng dst.  
Toán hng ngun src có thlà thanh ghi (reg), bnh(mem) hay giá trị  
tc thi (immed); toán hng đích dst có thlà reg hay mem.  
Lnh MOV có thcó các trường hp sau:  
Reg8 reg8  
MOV AL,AH  
Reg16 reg16  
Mem8 reg8  
MOV AX,BX  
MOV [BX],AL  
MOV AL,[BX]  
MOV [BX],AX  
MOV AX,[BX]  
MOV AL,04h  
MOV mem[BX],01h  
MOV AL,0F104h  
MOV mem[BX],0101h  
MOV DS,AX  
MOV DS,mem  
MOV AX,DS  
MOV [BX],DS  
Reg8 mem8  
Mem16 reg16  
Reg16 mem16  
Reg8 immed8  
Mem8 immed8  
Reg16 immed16  
Mem16 immed16  
SegReg reg16  
SegReg mem16  
Reg16 segreg  
Mem16 segreg  
- Lnh MOV không nh hưởng đến các c.  
- Không thchuyn trc tiếp dliu gia hai ô nhmà phi thông qua mt  
thanh ghi  
MOV AX,mem1  
MOV mem2,AX  
- Không thchuyn giá trtrc tiếp vào thanh ghi đon  
MOV AX,1010h  
MOV DS,AX  
- Không thchuyn trc tiếp gia 2 thanh ghi đon  
- Không thdùng thanh ghi CS làm toán hng đích  
™ Lnh XCHG dst,src: (Exchange) hoán chuyn ni dung 2 toán hng.  
Toán hng chcó thlà reg hay mem.  
- Lnh XCHG không nh hưởng đến các cờ  
- Không thdùng cho các thanh ghi đon  
™ Lnh PUSH src: ct ni dung mt thanh ghi vào stack. Toán hng là  
reg16  
™ Lnh POP dst: ly dliu 16 bit tstack đưa vào toán hng dst.  
Ta có thdùng nhiu lnh PUSH để ct dliu vào stack nhưng khi dùng  
lnh POP để ly dliu ra thì phi dùng theo thtngược li.  
PUSH  
PUSH  
AX  
BX  
Phm Hùng Kim Khánh  
Trang 52  
Tài liu vi xlý  
Lp trình hp ngữ  
PUSH  
CX  
POP  
POP  
POP  
CX  
BX  
AX  
™ Lnh XLAT [src]: chuyn ni dung ca ô nh8 bit vào thanh ghi AL. Địa  
chô nhxác định bng cp thanh ghi DS:BX (nếu không chra src) hay  
src, địa choffset cha trong thanh ghi AL.  
Lnh XLAT tương đương vi các lnh:  
MOV AH,0  
MOV SI,AX  
MOV AL,[BX+SI]  
7.1.2.Nhóm lnh chuyn địa chỉ  
™ Lnh LEA reg16,mem16: (Load Effective Address) chuyn địa choffset  
ca toán hng bnhvào thanh ghi reg16.  
Lnh này stương đương vi MOV reg16, OFFSET mem16  
™ Lnh LDS reg16,mem32: (Load pointer using DS) chuyn ni dung bộ  
nhtoán hng mem32 vào cp thanh ghi DS:reg16.  
Lnh LDS AX,mem tương đương vi:  
MOV AX,mem  
MOV BX,mem+2  
MOV DS,BX  
™ Lnh LES reg16,mem32: (Load pointer using ES) ging như lnh LDS  
nhưng dùng cho thanh ghi ES  
7.1.3.Nhóm lnh chuyn chiu  
™ Lnh LAHF: (Load AH from flag) chuyn các cSF, ZF, AF, PF và CF  
vào các bit 7,6,4,2 và 0 ca thanh ghi AH (3 bit còn li không đổi)  
™ Lnh SAHF: (Store AH into flag) chuyn các bit 7,6,4,2 và 0 ca thanh  
ghi AH vào các cSF, ZF, AF, PF và CF.  
™ Lnh PUSHF: chuyn thanh ghi cvào stack  
™ Lnh POPF: ly dliu tstack chuyn vào thanh ghi cờ  
7.1.4.Nhóm lnh chuyn dliu qua cng  
Mi I/O port giao tiếp vi CPU scó mt địa ch16 bit cho nó. CPU gi hay  
nhn dliu tcng bng cách chỉ đến địa chcng đó. Tutheo chc năng mà  
cng có th: chỉ đọc dliu (input port), chghi dliu (output port) hay có thể đọc  
và ghi dliu (input/output port).  
Phm Hùng Kim Khánh  
Trang 53  
Tài liu vi xlý  
Lp trình hp ngữ  
™ Lnh IN: đọc dliu tcng và đưa vào thanh ghi AL  
IN  
IN  
AL,port8  
AL,DX  
Nếu địa chport chcó 8 bit thì có thể đưa giá trtrc tiếp vào, nếu là 16 bit  
thì phi thông qua thanh ghi AX.  
™ Lnh OUT: ghi dliu trong thanh ghi AL ra cng  
OUT port8,AL  
OUT DX,AL  
VD: MOV AL,3  
OUT 61h,AL  
MOV AL,1  
; Gi giá tr03h ra cng 61h  
; Xut ra cng máy in  
MOV DX,03F8h  
OUT DX,AL  
MOV DX,03F8h  
IN  
AL,DX  
; Đọc dliu tcng máy in  
7.2.  
Nhóm lnh chuyn điu khin  
7.2.1.Lnh nhy không điu kin JMP  
JMP label  
JMP reg/mem  
Lnh JMP dùng để chuyn điu khin chương trình tvtrí này sang vtrí  
khác (thay đổi ni dung cp thanh ghi CS:IP).  
7.2.2.Lnh nhy có điu kin  
Lnh nhy có điu kin chsdng cho các nhãn nm trong khong t–127  
đến 128 byte so vi vtrí ca lnh.  
™ Lnh JA label: (Jump if Above)  
Nếu CF = 0 và ZF = 0 thì JMP label  
™ Lnh JAE label: (Jump if Above or Equal)  
Nếu CF = 0 thì JMP label  
™ Lnh JB label: (Jump if Below)  
Nếu CF = 1 thì JMP label  
™ Lnh JBE label: (Jump if Below or Equal)  
Nếu CF = 1 hoc ZF = 1 thì JMP label  
™ Lnh JNA label: (Jump if Not Above)  
Ging lnh JBE  
™ Lnh JNAE label: (Jump if Not Above or Equal)  
Ging lnh JB  
Phm Hùng Kim Khánh  
Trang 54  
Tài liu vi xlý  
Lp trình hp ngữ  
™ Lnh JNB label: (Jump if Not Below)  
Ging lnh JAE  
™ Lnh JNBE label: (Jump if Not Below or Equal)  
Ging lnh JA  
™ Lnh JG label: (Jump if Greater)  
Nếu SF = OF và ZF = 0 thì JMP label  
™ Lnh JGE label: (Jump if Greater or Equal)  
Nếu SF = OF thì JMP label  
™ Lnh JL label: (Jump if Less)  
Nếu SF <> OF thì JMP label  
™ Lnh JLE label: (Jump if Less or Equal)  
Nếu CF <> OF hoc ZF = 1 thì JMP label  
™ Lnh JNG label: (Jump if Not Greater)  
Ging lnh JLE  
™ Lnh JNGE label: (Jump if Not Greater or Equal)  
Ging lnh JL  
™ Lnh JNL label: (Jump if Not Less)  
Ging lnh JGE  
™ Lnh JNLE label: (Jump if Not Less or Equal)  
Ging lnh JG  
™ Lnh JC label: (Jump if Carry)  
Ging lnh JB  
™ Lnh JNC label: (Jump if Not Carry)  
Ging lnh JNB  
™ Lnh JZ label: (Jump if Zero)  
Nếu ZF = 1 thì JMP label  
™ Lnh JE label: (Jump if Equal)  
Ging lnh JZ  
™ Lnh JNZ label: (Jump if Not Zero)  
Nếu ZF = 0 thì JMP label  
™ Lnh JNE label: (Jump if Equal)  
Ging lnh JNZ  
Phm Hùng Kim Khánh  
Trang 55  
Tài liu vi xlý  
Lp trình hp ngữ  
™ Lnh JS label: (Jump on Sign)  
Nếu SF = 1 thì JMP label  
™ Lnh JNS label: (Jump if No Sign)  
Nếu SF = 0 thì JMP label  
™ Lnh JO label: (Jump on Overflow)  
Nếu OF = 1 thì JMP label  
™ Lnh JNO label: (Jump if No Overflow)  
Nếu OF = 0 thì JMP label  
™ Lnh JP label: (Jump on Parity)  
Nếu PF = 1 thì JMP label  
™ Lnh JNP label: (Jump if No Parity)  
Nếu PF = 0 thì JMP label  
™ Lnh JCXZ label: (Jump if CX Zero)  
Nếu CX = 1 thì JMP label  
7.2.3.Lnh so sánh  
CMP left(reg/mem), right(reg/mem/immed)  
Lnh CMP dùng để so sánh ni dung 2 toán hng, kết qucha vào thanh ghi  
cvà không làm thay đổi ni dung các toán hng.  
VD: Đon chương trình so sánh 2 sA và B: A >B thì nhy đến label1, A = B  
thì nhy đến label2, A < B thì nhy đến label3.  
MOV AX,A  
CMP AX,B  
JG  
JL  
label1  
label2  
JMP label3  
7.2.4.Các lnh vòng lp  
™ Lnh LOOP:  
LOOP label  
Mô t:  
CX = CX – 1  
Nếu CX <> 0 thì JMP label  
™ Lnh LOOPE:  
LOOPE  
label  
Mô t:  
CX = CX – 1  
Nếu (ZF = 1) và (CX <> 0) thì JMP label  
Phm Hùng Kim Khánh  
Trang 56  
Tài liu vi xlý  
Lp trình hp ngữ  
™ Lnh LOOPZ:  
Ging lnh LOOPE  
™ Lnh LOOPNE:  
LOOPNE  
Mô t:  
label  
CX = CX – 1  
Nếu (ZF = 0) và (CX <> 0) thì JMP label  
™ Lnh LOOPNZ:  
Ging lnh LOOPNE  
7.2.5.Lnh liên quan đến chương trình con  
™ Lnh CALL:  
Lnh CALL dùng để gi mt chương trình con, có thlà near hay far.  
CALL  
label  
; Gi chương trình con ti vtrí xác định  
; bi nhãn label  
CALL  
reg/mem  
; Gi chương trình con ti vtrí xác định  
; trong reg/mem  
™ Lnh RET: (return)  
RET [n]  
RETN [n]  
RETF [n]  
Lnh RET dùng để kết thúc chương trình con, điu khin sẽ được đưa về địa  
chtrước khi gi chương trình con. RETN để kết thúc chương trình con dng near và  
RETF dùng để kết thúc chương trình con dng far.  
Trong trường hp lnh RET có hng sn theo sau thì scng vi thanh ghi  
SP giá trn (n phi là schn). Lnh này dùng để loi bmt stham schương  
trình con sdng ra khi stack.  
7.3.  
Nhóm lnh xshc  
7.3.1.Xlý phép cng  
™ Lnh ADD dst,src:  
dst dst + src  
Toán hng src có thlà reg, mem hay immed còn toán hng dst là reg hay  
mem.  
- Không thcng trc tiếp 2 thanh ghi đon  
- Lnh ADD nh hưởng đến các csau:  
+ CCF: = 1 khi kết quphép cng có nhhay có mượn  
+ CAF: = 1 khi kết quphép cng có nhhay có mượn đối vi 4 bit  
thp  
+ CPF: = 1 khi kết quphép cng có tng 8 bit thp là mt schn.  
+ CZF: = 1 khi kết quphép cng là 0.  
+ CSF: = 1 nếu kết quphép cng là mt sâm  
+ COF: = 1 nếu kết quphép cng bsai du, nghĩa là vượt ra ngoài  
phm vi ln nht hay nhnht mà scó du có thcha trong toán hng dst.  
Phm Hùng Kim Khánh  
Trang 57  
Tài liu vi xlý  
Lp trình hp ngữ  
™ Lnh ADC dst, src: (Add with Carry)  
dst dst + src + CF  
Lnh ADC thường dùng để cng các sln hơn 16 bit.  
™ Lnh INC dst: (Increment)  
dst dst + 1  
Dst có thlà reg hay mem.  
™ Lnh AAA: (ASCII Adjust for Addition)  
Hiu chnh kết quphép cng 2 sBCD dng không nén (mi chsBCD  
lưu bng 1 byte).  
VD: MOV AX,9  
MOV BX,3  
ADD AL,BL  
AAA  
; Kết qulà AX = 0Ch  
; AX = 0102h (AH = 1, AL = 2)  
Lnh AAA chỉ ảnh hưởng đến các cAF và CF, không nh hưởng đến các cờ  
còn li.  
™ Lnh DAA: (Decimal Adjust for Addition)  
Hiu chnh kết quphép cng 2 sBCD dng nén (mi chsBCD lưu bng  
4 bit, nghĩa là 1 byte biu din được các snguyên t0 đến 99).  
VD: MOV AX,4338h  
ADD AL,AH  
DAA  
; AX 437Bh  
; AX 4381h (43 + 38 = 81)  
Lnh DAA chỉ ảnh hưởng đến các cAF, CF, PF, SF, ZF và không nh  
hưởng đến thanh ghi AH.  
7.3.2.Xlý phép trừ  
™ Lnh SUB dst,src:  
dst dst - src  
Toán hng src có thlà reg, mem hay immed còn toán hng dst chcó thlà  
reg hay mem.  
- Không thtrtrc tiếp thanh ghi đon  
- nh hưởng đến các cAF, CF, OF, PF, SF và ZF.  
™ Lnh SBB dst,src:  
dst dst – src – CF  
Lnh ADC thường dùng để trcác sln hơn 16 bit.  
™ Lnh DEC dst: (decrement)  
dst dst – 1  
dst là reg hay mem. Lnh DEC nh hưởng đến các cAF, OF, PF, SF, ZF.  
Phm Hùng Kim Khánh  
Trang 58  
Tài liu vi xlý  
Lp trình hp ngữ  
™ Lnh NEG dst:  
dst - dst  
dst là reg hay mem.  
Lnh NEG nh hưởng đến các c:  
CF = 1 nếu ni dung kết qulà skhác 0.  
SF = 1 nếu ni dung kết qulà sâm khác 0.  
PF = 1 nếu tng 8 bit thp là mt schn.  
ZF = 1 nếu ni dung kết qulà 0.  
OF = 1 nếu ni dung toán hng dst là 80h (dng byte) hay 8000h (dng word).  
VD: Nếu mun thc hin phép toán 100 – AH, ta không thcùng lnh:  
SUB 100,AH  
mà phi dùng lnh:  
SUB AH,100  
NEG AH  
™ Lnh AAS: (Ascii Adjust for Substract)  
Hiu chnh kết quphép tr2 sBCD dng không nén (mi chsBCD lưu  
bng 1 byte). Lnh AAS chỉ ảnh hưởng cAF và CF.  
™ Lnh DAS: (Decimal Adjust for Substract)  
Hiu chnh kết quphép tr2 sBCD dng nén (mi chsBCD lưu bng 4  
bit). Lnh AAS chỉ ảnh hưởng cAF và CF.  
7.3.3.Xlý phép nhân  
™ Lnh MUL src:  
Nếu src là reg hay mem 8 bit: AX AL*src  
Nếu src là reg hay mem 16 bit: DX:AX AX*src  
Lnh MUL chỉ ảnh hưởng đến cCF và OF.  
™ Lnh IMUL src:  
Ging như lnh MUL nhưng kết qulà scó du.  
™ Lnh AAM: (Ascii Adjust for Multiple)  
Hiu chnh kết quphép nhân 2 sBCD dng không nén, lnh AAM thc  
hin chia AL cho 10, lưu phn thương vào AL và phn dư vào AH. Lnh AAM nh  
hưởng đến các cPF, SF và ZF.  
7.3.4.Xlý phép chia  
™ Lnh DIV src:  
Nếu src là reg/mem 8 bit: AL AX DIV src và AH AX MOD src  
Nếu src là reg/mem 16 bit: AX DX:AX DIV src và DX DX:AX MOD  
src  
Lnh DIV không nh hưởng đến các cnhưng xy ra tràn trong các trường  
hp sau:  
- Chia cho 0  
Phm Hùng Kim Khánh  
Trang 59  
Tài liu vi xlý  
Lp trình hp ngữ  
- Thương ln hơn 256 đối vi dng 8 bit.  
- Thương ln hơn 65536 đối vi dng 16 bit.  
™ Lnh IDIV src:  
Ging như lnh DIV nhưng kết qulà scó du. Các trường hp tràn:  
- Chia cho 0  
- Thương nm ngoài khong (-128,127) đối vi dng 8 bit.  
- Thương nm ngoài khong (-32767,32768) đối vi dng 16 bit.  
™ Lnh AAD: (Ascii Adjust for Division)  
Hiu chnh kết quphép chia 2 sBCD dng không nén. Lưu ý rng lnh  
AAD phi được thc hin trước lnh chia. Sau khi thc hin chia thì phi hiu chnh  
li dng BCD bng cách dùng lnh AAM.  
™ Lnh CBW: (Convert Byte to Word)  
Nếu AL < 80h thì AH = 0, ngược li AH = 0FFh  
Lnh CBW dùng để chuyn snhphân có du 8 bit thành snhphân có du  
16 bit.  
™ Lnh CWD: (Convert Word to Double word)  
Nếu AX < 8000h thì DX = 0, ngược li DX = 0FFFFh  
Lnh CWD dùng để chuyn snhphân có du 16 bit thành snhphân có  
du 32 bit cha trong DX:AX.  
7.3.5.Dch chuyn và quay  
™ Lnh SHL: (Shift Logical Left)  
SHL dst,1  
SHL dst,CL  
Dch trái 1 bit hay CL bit.  
CF  
dst7  
dst6 …  
dst0  
dst0  
0
™ Lnh SHR: (Shift Logical Right)  
SHR dst,1  
SHR dst,CL  
Dch phi 1 bit hay CL bit.  
0
dst7  
dst6 …  
CF  
CF  
dst7  
™ Lnh SAL: ging SHL  
™ Lnh SAR:  
Ging như lnh SHR nhưng giá trbit dst7 không thay đổi, nghĩa là  
dst7  
dst7  
dst6 …  
dst0  
™ Lnh ROL: (Rotate Left)  
ROL dst,1  
ROL dst,CL  
Quay trái 1 bit hay CL bit.  
CF  
dst7  
dst6 …  
dst0  
Phm Hùng Kim Khánh  
Trang 60  
Tài liu vi xlý  
Lp trình hp ngữ  
™ Lnh ROR: (Rotate Right)  
ROR dst,1  
ROR dst,CL  
Quay phi 1 bit hay CL bit.  
dst0  
dst7  
dst6 …  
dst0  
dst0  
dst0  
CF  
CF  
CF  
™ Lnh RCL: (Rotate though Carry Left)  
RCL dst,1  
RCL dst,CL  
Quay trái 1 bit hay CL bit.  
CF  
dst7  
dst6 …  
™ Lnh RCR: (Rotate though Carry Right)  
RCR dst,1  
RCR dst,CL  
Quay phi 1 bit hay CL bit.  
CF  
dst7  
dst6 …  
7.3.6.Các lnh logic  
™ Lnh AND:  
AND dst,src  
dst dst AND src  
CF 0, OF 0  
Src là reg, mem hay immed còn dst là reg, mem.  
™ Lnh OR:  
OR dst,src  
dst dst OR src  
CF 0, OF 0  
™ Lnh XOR:  
XOR dst,src  
dst dst XOR src  
CF 0, OF 0  
™ Lnh NOT:  
NOT dst  
dst NOT dst  
Lnh NOT không nh hưởng đến các c.  
™ Lnh TEST:  
TEST dst,src  
Lnh TEST thc hin phép toán AND 2 toán hng nhưng chỉ ảnh hưởng đến  
các cvà không nh hưởng đến toán t.  
Phm Hùng Kim Khánh  
Trang 61  
Tài liu vi xlý  
Lp trình hp ngữ  
7.4.  
Nhóm lnh xlý chui  
Bao gm các lnh sau:  
- Lnh MOVS: chuyn dliu tvùng nhnày sang vùng nhkhác.  
+ MOVSB: chuyn 1 byte tvtrí chỉ đến bi SI đến vtrí chbi DI. Nếu  
DF = 0 thì SI SI + 1, DI DI + 1 còn nếu DF = 1 thì SI SI - 1, DI ←  
DI - 1.  
+ MOVSW: chuyn 1 word tvtrí chỉ đến bi SI đến vtrí chbi DI.  
Nếu DF = 0 thì SI SI + 2, DI DI + 2 còn nếu DF 1 thì SI SI - 2,  
DI DI - 2.  
- Lnh CMPS: so sánh ni dung 2 vùng nhớ  
+ CMPSB: so sánh 1 byte ti vtrí chỉ đến bi SI và ti vtrí chbi DI.  
Nếu DF = 0 thì SI SI + 1, DI DI + 1 còn nếu DF 1 thì SI SI - 1,  
DI DI - 1.  
+ CMPSW: so sánh 1 word ti vtrí chỉ đến bi SI và ti vtrí chbi DI.  
Nếu DF = 0 thì SI SI + 2, DI DI + 2 còn nếu DF = 1 thì SI SI - 2, DI  
DI - 2.  
- Lnh SCAS: tìm mt phn ttrong vùng nh, địa chvùng nhxác định  
bng cp thanh ghi ES:DI, giá trcn tìm đặt trong thanh ghi AL, nếu tìm  
thy thì ZF = 1. Giá trca DI và SI thay đổi ging như trên.  
- Lnh LODS: đưa mt byte hay word có địa chxác định bi cp thanh ghi  
DS:SI vào thanh ghi AL hay AX. Giá trca DI và SI thay đổi ging như  
trên.  
- Lnh STOS: chuyn ni dung ca AL hay AX vào vùng nhxác định bi  
cp thanh ghi ES:DI. Giá trca DI và SI thay đổi ging như trên.  
8. Các cu trúc cơ bn trong lp trình hp ngữ  
8.1.  
Cu trúc tun tự  
Cu trúc tun tlà cu trúc đơn gin nht. Trong cu trúc tun t, các lnh  
được sp xếp tun t, lnh này tiếp theo lnh kia.  
Lnh 1  
Lnh 2  
Lnh n  
VD: Cng 2 giá trca thanh ghi BX và CX, ri nhân đôi kết qu, kết quả  
cui cùng cha trong AX  
MOV AX,BX  
ADD AX,CX  
SHL AX,1  
; Cng BX vi CX  
; Nhân đôi  
Phm Hùng Kim Khánh  
Trang 62  
Tài liu vi xlý  
Lp trình hp ngữ  
8.2.  
Cu trúc IF – THEN, IF – THEN – ELSE  
IF Điu kin THEN Công vic  
IF Điu kin THEN Công vic1 ELSE Công vic2  
VD: Gán BX = |AX|  
CMP AX,0  
JNL DUONG  
NEG AX  
; AX > 0?  
; AX dương  
; Nếu AX < 0 thì đảo du  
DUONG:  
NEXT:  
MOV BX,AX  
VD: Gán CL giá trbit du ca AX  
CMP AX,0  
; AX > 0?  
JNS AM  
; AX âm  
MOV CL,1  
; CL = 1 (AX dương)  
JMP NEXT  
AM: MOV CL,0  
NEXT:  
; CL = 0 (AX âm)  
8.3.  
Cu trúc CASE  
CASEBiu thc  
Giá tr1: Công vic 1  
Giá tr2: Công vic 2  
Giá trn: Công vic n  
END  
VD: Nếu AX > 0 thì BH = 0, nếu AX < 0 thì BH = 1. Ngược li BH = 2  
CMP AX,0  
JL  
AM  
JE  
DUONG:  
AM:  
KHONG  
JG  
DUONG  
MOV BH,0  
JMP NEXT  
MOV BH,1  
JMP NEXT  
MOV BH,2  
KHONG:  
NEXT:  
8.4.  
Cu trúc FOR  
FOR Sln lp DO Công vic  
VD: Cho vùng nhM dài 200 bytes trong đon dliu, chương trình đếm số  
chA trong vùng nhM như sau:  
MOV CX,200  
; Đếm 200 bytes  
; Ly địa chvùng nhớ  
; AX = 0  
MOV BX,OFFSET M  
XOR AX,AX  
Phm Hùng Kim Khánh  
Trang 63  
Tải về để xem bản đầy đủ
pdf 30 trang baolam 9540
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Vi xử lý - Chương 3: Lập trình hợp ngữ - Phạm Hùng Kim Khánh", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_vi_xu_ly_chuong_3_lap_trinh_hop_ngu_pham_hung_kim.pdf