Đề cương bài giảng Hợp ngữ

Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
1
Chöông 1 : CÔ BANÛ VEÀ HÔÏP NGÖÕ  
Trong chöông naøy seõ giôùi thieäu nhöõng nguyeân taéc chung ñeå taïo ra , dòch vaø  
chaïy moät chöông trình hôïp ngöõ treân maùy tính .  
Caáu truùc ngöõ phaùp cuûa leänh hôïp ngöõ trong giaùo trình naøy ñöôïc trình baøy theo  
Macro Assembler ( MASM) döïa treân CPU 8086 .  
1.1 Cuù phaùp leänh hôïp ngöõ  
Moät chöông trình hôïp ngöõ bao goàm moät loaït caùc meänh ñeà ( statement) ñöôïc  
vieát lieân tieáp nhau , moãi meänh ñeà ñöôïc vieát treân 1 doøng .  
Moät meänh ñeà coù theå laø :  
·
moät leänh ( instruction) : ñöôïc trình bieân dòch ( Assembler =ASM) chuyeån thaønh  
maõ maùy.  
·
moät chæ daãn cuûa Assembler ( Assembler directive) : ASM khoâng chuyeån thaønh  
maõ maùy  
Caùc meänh ñeà cuûa ASM goàm 4 tröôøng :  
Name  
Operation  
Operand(s)  
Comment  
caùc tröôøng caùch nhau ít nhaát laø moät kyù töï troáng hoaëc moät kyù töï TAB  
ví duï leänh ñeà sau :  
START :  
Sau ñaây laø moät chæ daãn cuûa ASM :  
MAIN PROC  
MOV CX,5 ; khôæ taïo thanh ghi CX  
; taïo moät thuû tuïc coù teân laø MAIN  
1.1.1 Tröôøng Teân ( Name Field)  
Tröôøng teân ñöôïc duøng cho nhaõn leänh , teân thuû tuïc vaø teân bieán . ASM seõ  
chuyeån teân thaønh ñòa chæ boä nhôù .  
Teân coù theå daøi töø 1 ñeán 31 kyù töï . Trong teân chöùa caùc kyù töï töø a-z , caùc soá vaø  
caùc kyù töï ñaëc bieät sau : ? ,@ , _ , $ vaø daáu . Khoâng ñöôïc pheùp coù kyù töï troáng trong  
phaàn teân . Neáu trong teân coù kyù töï . thì noù phaûi laø kyù töï ñaàu tieân . Teân khoâng ñöôïc  
baét ñaàu baèng moät soá . ASM khoâng phaân bieät giöõa kyù töï vieát thöôøng vaø vieát hoa .  
Sau ñaây laø caùc ví duï veà teân hôïp leä vaø khoâng hôïp leä trong ASM .  
Teân hoäp leä  
Teân khoâng hôïp leä  
TWO WORDS  
2ABC  
A45.28  
YOU&ME  
COUNTER1  
@CHARACTER  
SUM_OF_DIGITS  
DONE?  
.TEST  
ADD-REPEAT  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
2
1.1.2 Tröôøng toaùn töû ( operation field)  
Ñoái vôùi 1 leänh tröôøng toaùn töû chöaù kyù hieäu ( sumbol) cuûa maõ pheùp toaùn (  
operation code = OPCODE) .ASM seõ chuyeån kyù hieäu maõ pheùp toaùn thaønh maõ maùy .  
Thoâng thöôøng kyù hieäu maõ pheùp toaùn moâ taû chöùc naêng cuûa pheùp toaùn , ví duï ADD ,  
SUB , INC , DEC , INT ...  
Ñoái vôùi chæ daãn cuûa ASM , tröôøng toaùn töû chöaù moät opcode giaû (pseudo  
operation code = pseudo-op) . ASM khoâng chuyeån pseudo-op thaønh maõ maùy maø  
höôùng daãn ASM thöïc hieän moät vieäc gì ñoù ví duï taïo ra moät thuû tuïc , ñònh nghóa caùc  
bieán ...  
1.1.3 Tröôøng caùc toaùn haïng ( operand(s) field)  
Trong moät leänh tröôøng toaùn haïng chæ ra caùc soá lieäu tham gia trong leänh ñoù.  
Moät leänh coù theå khoâng coù toaùn haïng , coù 1 hoaëc 2 toaùn haïng . Ví duï :  
NOP  
; khoâng coù toaùn haïng  
INC AX  
ADD WORD1,2  
; 1 toaùn haïng  
; 2 toaùn haïng coäng 2 vôùi noäi dung cuûa töø nhôù WORD1  
Trong caùc leänh 2 toaùn haïng toaùn haïng ñaàu laø toaùn haïng ñích ( destination  
operand) . Toaùn haïng ñích thöôøng laøthanh ghi hoaëc vò trí nhôù duøng ñeå löu tröõ keát  
quaû . Toaùn haïng thöù hai laø toaùn haïng nguoàn . Toaùn haïng nguoàn thöôøng khoâng bò thay  
ñoåi sau khi thöïc hieän leänh .  
Ñoái vôùi moät chæ daãn cuûa ASM , tröôøng toaùn haïng chöùa moät hoaëc nhieàu thoâng  
tin maø ASM duøng ñeå thöïc thi chæ daãn .  
1.1.4 Tröôøng chuù thích ( comment field)  
Tröôøng chuù thích laø moät tuyø choïn cuûa meänh ñeà trong ngoân ngöõ ASM . Laäp  
trình vieân duøng tröôøng chuù thích ñeå thuyeát minh veà caâu leänh . Ñieàu naøy laø caàn thieát  
vì ngoân ngöõ ASM laø ngoân ngöõ caáp thaáp ( low level) vì vaäy seõ raát khoù hieåu chöông  
trình neáu noù khoâng ñöôïc chuù thích moät caùch ñaày ñuû vaø roû raøng . Tuy nhieân khoâng neân  
coù chuù thích ñoái vôùi moïi doøng cuûa chöông trình , keå caû nnhöõng leänh maø yù nghóa cuûa  
noù ñaõ raát roû raøng nhö :  
NOP  
; khoâng laøm chi caû  
Ngöôøi ta duøng daáu chaám phaåy (;) ñeå baét ñaàu tröôøng chuù thích .  
ASM cuõng cho pheùp duøng toaøn boä moät doøng cho chuù thích ñeå taïo moät khoaûng  
troáng ngaên caùch caùc phaàn khaùc nhau cuaû chöông trình ,ví duï :  
;
; khôûi taïo caùc thanh ghi  
;
MOV AX,0  
MOV BX,0  
1.2  
Caùc kieåu soá lieäu trong chöông trình hôïp ngöõ  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
3
CPU chæ laøm vieäc vôùi caùc soá nhò phaân . Vì vaäy ASM phaûi chuyeån taát caû caùc  
loaïi soá lieäu thaønh soá nhò phaân . Trong moät chöông trình hôïp ngöõ cho pheùp bieåu dieãn  
soá lieäu döôùi daïng nhò phaân , thaäp phaân hoaëc thaäp luïc phaân vaø thaäm chí laø caû kyù töï  
nöûa .  
1.2.1 Caùc soá  
Moät soá nhò phaân laø moät daõy caùc bit 0 vaø 1 va 2phaûi keát thuùc baèng h hoaëc H  
Moät soá thaäp phaân laø moät daõy caùc chöõ soù thaäp phaân vaø keát thuùc bôûi d hoaëc D  
( coù theå khoâng caàn)  
Moät soá hex phaûi baét ñaàu bôûi 1 chöõ soá thaäp phaân vaø phaûi keát thuùc bôûi h hoaëc  
H .  
Sau ñaây laø caùc bieåu dieãn soá hôïp leä vaø khoâng hôïp leä trong ASM :  
Soá  
Loaïi  
thaäp phaân  
nhò phaân  
thaäp phaân  
thaäp phaân  
hex  
10111  
10111b  
64223  
-2183D  
1B4DH  
1B4D  
soá hex khoâng hôïp leä  
FFFFH  
0FFFFH  
soá hex khoâng hôïp leä  
soá hex  
1.2.2 Caùc kyù töï  
Kyù töï vaø moät chuoãi caùc kyù töï phaûi ñöôïc ñoùng giöõa hai daáu ngoaëc ñôn hoaëc  
hai daáu ngoaëc keùp . Ví duï ‘A’ vaø “HELLO” . Caùc kyù töï ñeàu ñöôïc chuyeån thaønh maõ  
ASCII bôûi ASM . Do ñoù trong moät chöông trình ASM seõ xem khai baùo ‘A’ vaø 41h (  
maõ ASCII cuûa A) laø gioáng nhau .  
1.3  
Caùc bieán ( variables)  
Trong ASM bieán ñoùng vai troø nhö trong ngoân ngöõ caáp cao . Moãi bieán coù moät  
loaïi döõ lieäu vaø noù ñöôïc gaùn moät ñòa chæ boä nhôù sau khi dòch chöông trình . Baûng sau  
ñaây lieät keâ caùc toaùn töû giaû duøng ñeå ñònh nghóa caùc loaïi soá lieäu .  
PSEUDO-OP  
DB  
STANDS FOR  
define byte  
DW  
DD  
DQ  
DT  
define word ( doublebyte)  
define doubeword ( 2 töø lieân tieáp)  
define quadword ( 4 töø lieân tieáp )  
define tenbytes ( 10 bytes lieân tieáp)  
1.3.1. Bieán byte  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
Chæ daãn cuûa ASM ñeå ñònh nghóa bieán byte coù daïng nhö sau :  
4
NAME  
DB  
initial_value  
Ví duï :  
ALPHA  
DB  
4
Chæ daãn naøy seõ gaùn teân ALPHA cho moät byte nhôù trong boä nhôù maø giaù  
trò ban ñaàu cuûa noù laø 4 . Neáu giaù trò cuûa byte laø khoâng xaùc ñònh thì ñaët daáu chaám hoûi  
( ?) vaøo giaù trò ban ñaàu . Ví duï :  
BYT  
DB  
?
Ñoái vôùi bieán byte vuøng giaù trò khaû dó maø noù löu tröõ ñöôïc laø -128 ñeán  
127 ñoái vôùi soá coù daáu vaø 0 ñeán 255 ñoái vôùi soá khoâng daáu .  
1.3.2 Bieán töø  
Chæ daãn cuûa ASM ñeå ñònh nghóa moät bieán töø nhö sau :  
NAME  
Ví duï :  
WRD  
DW  
initial_value  
DW  
-2  
Cuõng coù theå duøng daáu ? ñeå thay theá cho bieán töø coù giaù trò khoâng xaùc  
ñònh . Vuøng giaù trò cuûa bieán töø laø -32768 ñeán 32767 ñoái vôùi soá coù daáu vaø 0 ñeán 56535  
ñoái vôùi soá khoâng daáu .  
1.3.3 Maûng ( arrays)  
Trong ASM moät maûng laø moät loaït caùc byte nhôù hoaëc töø nhôù lieân tieáp  
nhau . Ví duï ñeå ñònh nghóa moät maûng 3 byte goïi laø B_ARRAY maø giaù trò ban ñaàu  
cuûa noù laø 10h,20h vaø 30h chuùng ta coù theå vieát :  
B_ARRAY DB  
10h,20h,30h  
B_ARRAY laø teân ñöôïc gaùn cho byte ñaàu tieân  
B_ARRAY+1 laø teân cuûa byte thöù hai  
B_ARRAY+2 laø teân cuûa byte thöù ba  
Neáu ASM gaùn ñòa chæ offset laø 0200h cho maûng B_ARRAY thì noäi dung boä  
nhôù seõ nhö sau :  
SYMBOL  
B_ARRAY  
B_ARRAY+1  
B_ARRAY+2  
ADDRESS  
200h  
201h  
CONTENTS  
10h  
20h  
30h  
202h  
Chæ daãn sau ñaây seõ ñònh nghóa moät maûng 4 phaàn töû coù teân laø W_ARRAY:  
W_ARRAY DW 1000,40,29887,329  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
5
Giaû söû maûng baét ñaàu taïi 0300h thì boä nhôù seõ nhö sau:  
SYMBOL  
ADDRESS  
300h  
302h  
304h  
306h  
CONTENTS  
1000d  
40d  
29887d  
329d  
W_ARRAY  
W_ARRAY+2  
W_ARRAY+4  
W_ARRAY+6  
Byte thaáp vaø byte cao cuûa moät töø  
Ñoâi khi chuùng ta caàn truy xuaát tôùi byte thaáp vaø byte cao cuûa moät bieán töø . Giaû  
söû chuùng ta ñònh nghóa :  
WORD1 DW 1234h  
Byte thaáp cuûa WORD1 chöùa 34h , coøn byte cao cuûa WORD1 chöùa 12h  
Kyù hieäu ñòa chæ cuûa byte thaáp laø WORD1 coøn kyù hieäu ñòa chæ cuûa byte cao laø  
WORD1+1 .  
Chuoãi caùc kyù töï ( character strings)  
Moät maûng caùc maõ ASCII coù theå ñöôïc ñònh nghóa baèng moät chuoãi caùc kyù töï  
Ví duï :  
LETTERS  
DW 41h,42h,43h  
töông ñöông vôùi  
LETTERS  
DW ‘ABC ’  
Beân trong moät chuoãi , ASM seõ phaân bieät chöõ hoa vaø chöõ thöôøng . Vì vaäy chuoãi  
‘abc’ seõ ñöôïc chuyeån thaønh 3 bytes : 61h ,62h vaø 63h.  
Trong ASM cuõng coù theå toå hôïp caùc kyù töï vaø caùc soá trong moät ñònh nghóa . Ví  
duï :  
MSG DB  
‘HELLO’, 0AH, 0DH, ‘$’  
töông ñöông vôùi  
MSG DB  
48H,45H,4CH,4Ch,4FH,0AH,0DH,24H  
1.4 Caùc haèng ( constants)  
Trong moät chöông trình caùc haèng coù theå ñöôïc ñaët teân nhôø chæ daãn EQU  
(equates) . Cuù phaùp cuûa EQU laø :  
NAME  
ví duï :  
LF  
EQU constant  
EQU 0AH  
sau khi coù khai baùo treân thì LF ñöôïc duøng thay cho 0Ah trong chöông trình . Vì  
vaäy ASM seõ chuyeãn caùc leänh :  
MOV DL,0Ah  
vaø  
MOV DL,LF  
thaønh cuøng moät maõ maùy .  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
6
Cuõng coù theå duøng EQU ñeå ñònh nghóa moät chuoãi , ví duï:  
PROMPT  
EQU ‘TYPE YOUR NAME ’  
Sau khi coù khai baùo naøy , thay cho  
MSG DB  
chuùng ta coù theå vieát  
MSG DB  
‘TYPE YOUR NAME ’  
PROMPT  
1.5  
Caùc leänh cô baûn  
CPU 8086 coù haøng traêm leänh , trong chöông naøy ,chuùng ta seõ xem xeùt 7 leänh  
ñôn giaûn cuûa 8086 maø chuùng thöôøng ñöôïc duøng vôùi caùc thao taùc di chuyeån soá lieäu vaø  
thöïc hieän caùc pheùp toaùn soá hoïc .  
Trong phaàn sau ñaây , WORD1 vaø WORD2 laø caùc bieán töø , BYTE1 vaø  
BYTE2 laø caùc bieán byte .  
1.5.1 Leänh MOV vaø XCHG  
Leänh MOV duøng ñeå chuyeån soá lieäu giöõa caùc thanh ghi , giöõa 1 thanh ghi vaø  
moät vò trí nhôù hoaëc ñeå di chuyeån tröïc tieáp moät soá ñeán moät thanh ghi hoaëc moät vò trí  
nhôù . Cuù phaùp cuûa leänh MOV laø :  
MOV Destination , Source  
Sau ñaây laø vaøi ví duï :  
MOV AX,WORD1 ; laáy noäi dung cuûa töø nhôù WORD1 ñöa vaøo thanh ghi AX  
MOV AX,BX  
MOV AH,’A’  
; AX laáy noäi dung cuûa BX , BX khoâng thay ñoåi  
; AX laáy giaù trò 41h  
Baûng sau cho thaáy caùc tröôøng hôïp cho pheùp hoaëc caám cuûa leänh MOV  
Destination operand  
General Reg Segment Reg  
Memory Location Constant  
source operand  
General Reg  
Segment Reg  
MemoryLocation  
Constant  
Y
Y
Y
Y
Y
NO  
Y
Y
Y
NO  
NO  
NO  
NO  
NO  
Y
NO  
Leänh XCHG ( Exchange) duøng ñeå trao ñoåi noäi dung cuûa 2 thanh ghi hoaëc cuûa  
moät thanh ghi vaø moät vò trí nhôù . Ví duï : XCHG AH,BL  
XCHG  
AX,WORD1 ; trao ñoåi noäi dung cuûa thanh ghi AX vaø töø  
nhôù WORD1.  
Cuõng nhö leänh MOV coù moät soá haïn cheá ñoái vôùi leänh XCHG nhö baûng sau :  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
Destination operand  
7
General  
Register  
Memory Locatin  
Source operand  
General Memory  
Memory Location  
Y
Y
Y
No  
1.5.2 Leänh ADD, SUB, INC , DEC  
Leänh ADD vaø SUB ñöôïc duøng ñeå coäng vaø tröø noäi dung cuûa 2 thanh ghi , cuûa  
moät thanh ghi vaø moät vò trí nhôù , hoaëc coäng ( tröø) moät soá vôùi (khoûi) moät thanh ghi  
hoaëc moät vò trí nhôù . Cuù phaùp laø :  
ADD Destination , Source  
SUB Destination , Source  
Ví duï :  
ADD WORD1, AX  
ADD BL , 5  
SUB AX,DX  
; AX=AX-DX  
Vì lyù do kyõ thuaät , leänh ADD vaø SUB cuõng bò moät soá haïn cheá nhö baûng sau:  
Destination operand  
General Reg  
Memory Loacation  
Source operand  
Gen Memory  
Memory Location  
Constant  
Y
Y
Y
Y
NO  
Y
Vieäc coäng hoaëc tröø tröïc tieáp giöõa 2 vò trí nhôù laø khoâng ñöôïc pheùp . Ñeå giaûi  
quyeát vaán ñeà naøy ngöôøi ta phaûi di chuyeån byte ( töø ) nhôù ñeán moät thanh ghi sau ñoù  
môùi coäng hoaëc tröø thanh ghi naøy vôùi moät byte ( töø ) nhôù khaùc . Ví duï:  
MOV AL, BYTE2  
ADD BYTE1, AL  
Leänh INC ( incremrent) ñeå coäng theâm 1 vaøo noäi dung cuûa moät thanh ghi hoaëc  
moät vò trí nhôù . Leänh DEC ( decrement) ñeå giaûm bôùt 1 khoûi moät thanh ghi hoaëc 1 vò  
trí nhôù . Cuù phaùp cuûa chuùng laø :  
INC Destination  
DEC Destination  
Ví duï :  
INC WORD1  
INC AX  
DEC BL  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
8
1.5.3 Leänh NEG ( negative)  
Leänh NEG ñeå ñoåi daáu ( laáy buø 2 ) cuûa moät thanh ghi hoaëc moät vò trí nhôù . Cuù  
phaùp :  
NEG destination  
Ví duï : NEG AX ;  
Giaû söû AX=0002h sau khi thöïc hieän leänh NEG AX thì AX=FFFEh  
LÖU YÙ : 2 toaùn haïng trong caùc leänh treân ñaây phaûi cuøng loaïi ( cuøng laø byte hoaëc töø )  
1.6 Chuyeån ngoân ngöõ caáp cao thaønh ngoân ngöõ ASM  
Giaû söû A vaø B laø 2 bieán töø .  
Chuùng ta seõ chuyeån caùc meänh ñeà sau trong ngoân ngöõ caáp cao ra ngoân ngöõ  
ASM .  
1.6.1 Meänh ñeà B=A  
MOV AX,A  
MOV B,AX  
; ñöa A vaøo AX  
; ñöa AX vaøo B  
1.6.2 Meänh ñeà A=5-A  
MOV AX,5  
; ñöa 5 vaøo AX  
; AX=5-A  
SUB AX,A  
MOV A,AX  
; A=5-A  
caùch khaùc :  
NEG A  
;A=-A  
ADD A,5  
;A=5-A  
1.6.3 Meänh ñeà A=B-2*A  
MOV AX,B  
;Ax=B  
SUB AX,A  
SUB AX,A  
MOV A,AX  
;AX=B-A  
;AX=B-2*A  
;A=B-2*A  
1.7  
Caáu truùc cuûa moät chöông trình hôïp ngöõ  
Moät chöông trình ngoân ngöõ maùy bao goàm maõ ( code) , soá lieäu ( data) vaø ngaên  
xeáp (stack ) . Moãi moät phaàn chieám moät ñoaïn boä nhôù . Moãi moät ñoaïn chöông trình laø  
ñöôïc chuyeån thaønh moät ñoaïn boä nhôù bôûi ASM .  
1.7.1 Caùc kieåu boä nhôù ( memory models)  
Ñoä lôùn cuûa maõ vaø soá lieäu trong moät chöông trình ñöôïc quy ñònh bôûi chæ daãn  
MODEL nhaèm xaùc ñònh kieåu boä nhôù duøng vôùi chöông trình . Cuù phaùp cuûa chæ daãn  
MODEL nhö sau :  
.MODEL  
memory_model  
Baûng sau cho thaáy caùc kieåu boä nhôù :  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
9
MODEL  
SMALL  
MEDIUM  
COMPACT  
LARGE  
HUGE  
DESCRITION  
code vaø data naèm trong 1 ñoaïn  
code nhieàu hôn 1 ñoaïn , data trong 1 ñoaïn  
data nhieàu hôn 1 ñoïan , code trong 1 ñoaïn  
code vaø dayta lôùn hôn 1 ñoaïn , array khoâng quùa 64KB  
code ,data lôùn hôùn 1 ñoaïn , array lôùn hôn 64KB  
1.7.2 Ñoaïn soá lieäu  
Ñoaïn soá lieäu cuûa chöông trình chöaù caùc khai baùo bieán , khai baùo haèng ... Ñeå  
baét ñaàu ñoaïn soá lieäu chuùng ta duøng chæ daãn DATA vôùi cuù phaùp nhö sau :  
.DATA  
;khai baùo teân caùc bieán , haèng vaø maõng  
ví duï :  
.DATA  
WORD1  
WORD2  
MSG  
DW  
DW  
DB  
2
5
‘THIS IS A MESSAGE ’  
EQU 10010010B  
MASK  
1.7.3 Ñoaïn ngaên xeáp  
Muïc ñích cuûa vieäc khai baùo ñoaïn ngaên xeáp laø daønh moät vuøng nhôù ( vuøng  
satck) ñeå löu tröõ cho stack . Cuù phaùp cuûa leänh nhö sau :  
.STACK  
size  
neáu khoâng khai baùo size thì 1KB ñöôïc daønh cho vuøng stack .  
.STACK  
100h ; daønh 256 bytes cho vuøng stack  
1.7.4 Ñoïan maõ  
Ñoaïn maõ chöaù caùc leänh cuûa chöông trình . Baét ñaàu ñoaïn maõ baèng chæ daãn  
CODE nhö sau :  
.CODE  
Beân trong ñoaïn maõ caùc leänh thöôøng ñöôïc toå chöùc thaønh thuû tuïc  
(procedure) maø caáu truùc cuûa moät thuû tuïc nhö sau :  
name  
; body of the procedure  
name ENDP  
PROC  
Sau ñaây laø caâuù truùc cuûa moät chöông trình hôïp ngöõ maø phaàn CODE laø thuû tuïc  
coù teân laø MAIN  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
10  
.MODEL  
.STACK  
.DATA  
SMALL  
100h  
; ñònh nghóa soá lieäu taïi ñaây  
.CODE  
MAIN  
;thaân cuûa thuû tuïc MAIN  
MAIN ENDP  
; caùc thuû tuïc khaùc neáu coù  
PROC  
END  
MAIN  
1.8 Caùc leänh vaøo ra  
CPU thoâng tin vôùi caùc ngoaïi vi thoâng qua caùc coång IO . Leänh IN vaø OUT cuûa  
CPU cho pheùp truy xuaát ñeán caùc coång naøy . Tuy nhieân haàu heát caùc öùng duïng khoâng  
duøng leänh IN vaø OUT vì 2 lyù do:  
·
caùc ñòa chæ coång thay ñoåi tuyø theo loaïi maùy tính  
·
coù theå laäp trình cho caùc IO deã daøng hôn nhôø caùc chöông trình con ( routine) ñöôïc  
cung caáp bôûi caùc haõng cheá taïo maùy tính  
Coù 2 loaïi chöông trình phuïc vuï IO laø : caùc routine cuûa BIOS ( Basic Input  
Output System) vaø caùc routine cuûa DOS .  
Leänh INT ( interrupt)  
Ñeå goïi caùc chöông trình con cuûa BIOS vaø DOS coù theå duøng leänh INT vôùi cuù  
phaùp nhö sau :  
INT interrupt_number  
ôû ñaây interrupt_number laø moät soá maø noù chæ ñònh moät routine . Ví duï INT 16h  
goïi routine thöïc hieän vieäc nhaäp soá lieäu töø Keyboard .  
1.8.1 Leänh INT 21h  
INT 21h ñöôïc duøng ñeå goïi moät soá lôùn caùc caùc haøm ( function) cuûa DOS . Tuyø  
theo giaù trò maø chuùng ta ñaët vaøo thanh ghi AH , INT 21h seõ goïi chaïy moät routine  
töông öùng .  
Trong phaàn naøy chuùng ta seõ quan taâm ñeán 2 haøm sau ñaây :  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
11  
FUNCTION NUMBER  
ROUTINE  
1
2
Single key input  
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  
Ñeå goïi routine naøy thöïc hieän caùc leänh sau :  
MOV AH,1 ; input key function  
INT 21h  
; ASCII code in AL and display character on the screen  
FUNTION 2 : Display a character or execute a control function  
Input : AH=2  
DL=ASCII code of the the display character or control  
character  
character  
Output:AL= ASCII code of the the display character or control  
Caùc leänh sau seõ in leân maøn hình daáu ?  
MOV AH,2  
MOV DL,’?’ ; character is ‘?’  
INT 21H ; display character  
Haøm 2 cuõng coù theå duøng ñeå thöïc hieän chöùc naêng ñieàu khieån .Neáu DL chöaù kyù  
töï ñieàu khieån thì khi goïi INT 21h , kyù töï ñieàu khieån seõ ñöôïc thöïc hieän .  
Caùc kyù töï ñieàu khieån thöôøng duøng laø :  
ASCII code (Hex) SYMBOL  
FUNCTION  
beep  
backspace  
tab  
line feed  
carriage return  
7
8
BEL  
BS  
9
A
D
HT  
LF  
CR  
1.9  
Chuùng ta seõ vieát moät chöông trình hôïp ngöõ nhaèm ñoïc moät kyù töï töø baøn phím  
vaø in noù treân ñaàu doøng môùi .  
TITLE PGM1: ECHO PROGRAM  
Chöông trình ñaàu tieân  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
12  
.MODEL  
.STACK  
.CODE  
MAIN  
SMALL  
100H  
PROC  
; display daáu nhaéc  
MOV AH,2  
MOV DL,’?’  
INT 21H  
; nhaäp 1 kyù töï  
MOV AH,1 ; haøm ñoïc kyù töï  
INT 21H  
MOV BL,AL  
; kyù töï ñöôïc ñöa vaøo AL  
; caát kyù töï trong BL  
; nhaûy ñeán doøng môùi  
MOV AH,2 ; haøm xuaát 1 kyù töï  
MOV DL,0DH  
INT 21H  
MOV DL,0AH  
INT 21H  
; kyù töï carriage return  
, thöïc hieän carriage return  
; kyù töï line feed  
; thöïc hieän line feed  
; xuaát kyù töï  
MOV DL,BL  
INT 21H  
; ñöa kyù töï vaøo DL  
; xuaát kyù töï  
; trôû veà DOS  
MOV AH,4CH  
INT 21H  
; haøm thoaùt veà DOS  
; exit to DOS  
MAIN ENDP  
END MAIN  
1.10 Taïo ra vaø chaïy moät chöông trình hôïp ngöõ  
Coù 4 böôùc ñeå taïo ra vaø chaïy moät chöông trình hôïp ngöõ laø :  
·
·
Duøng moät trình soaïn thaûo vaên baûn ñeå taïo ra taäp tin chöông trình nguoàn ( source  
program file ) .  
Duøng moät trình bieân dòch (Assembler ) ñeå taïo ra taäp tin ñoái töôïng (object file)  
ngoân ngöõ maùy  
·
Duøng trình LINK ñeå lieân keát moät hoaëc nhieàu taäp tin ñoái töôïng roài taïo ra file thöïc  
thi ñöôïc .  
·
Cho thöïc hieän taäp tin EXE hoaëc COM .  
Böôùc 1 : Taïo ra chöông trình nguoàn  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
13  
Duøng moät trình soaïn thaûo vaên baûn (NC chaúng haïn) ñeå taïo ra chöông trình  
nguoàn .Ví duï laát teân laø PGM1.ASM. Phaàn môû roäng ASM laø phaàn môû roäng quy öôùc ñeå  
Assembler nhaän ra chöông trình nguoàn .  
Böôùc 2 :Bieân dòch chöông trình  
Chuùng ta seõ duøng MASM ( Microsoft Macro Assembler ) ñeå chuyeån taäp tin  
nguoàn PGM1.ASM thaønh taäp tin ñoái töôïng ngoân ngöõ maùy goò laø PGM1.OBJ baèng  
leänh sau :  
MASM PGM1;  
Sau khi in thoâng tin veà baûn quyeàn MASM seõ kieåm tra file nguoàn ñeå tìm loãi cuù  
phaùp . Neáu coù loãi thì MASM seõ inra soá doøng bò loãi vaø moät moä taû ngaén veà loãi ñoù .  
Neáu khoâng coù loãi thì MASM seõ chuyeån PGM1.ASM thaønh taäo tin ñoái töôïng ngoân ngöõ  
maùy goïi laø PGM1.OBJ .  
Daáu chaám phaåy sau leänh MASM PGM1 coù nghóa laø chuùng ta khoâng muoán taïo  
ra moät taäp tin ñoái töôïng coù teân khaùc vôùi PGM1 . Neáu khoâng coù daáu chaám phaåy sau  
leänh thì MASM seõ yeâu caàu chuùng ta goõ vaøo teân cuûa moät soá taäp tin maø noù coù theå taïo  
ra nhö hình döôùi ñaây :  
Object file name [ PGM1.OBJ]:  
Source listing [NUL.LIST]  
Cross-reference [NUL.CRF]  
: PGM1  
: PGM1  
Teân maëc nhieân laø NUL coù nghóa laø khoâng taïo ra file töông öùng tröø khi laäp  
trình vieân goõ vaøo teân taäp tin .  
Taäp tin danh saùch nguoàn ( source listing file) : laø moät taäp tin Text coù ñaùnh soá  
doøng , trong ñoù maõ hôïp ngöõ vaø maõ nguoàn naèm caïnh nhau . Taäp tin naøy thöôøng duøng  
ñeå gôõ roái chöông trình nguoàn vì MASM thoâng baùo loãi theo soá doøng .  
Taäp tin tham chieáu cheùo ( Cross -Reference File ) : laø 1 taäp tin chöùa danh  
saùch caùc teân maø chuùng xuaát hieän trong chöông trình keøm theo soá doøng maø teân aáy  
xuaát hieän . Taäp tin naøy ñöoïc duøng ñeå tìm caùc bieán vaø nhaõn trong moät chöông trình  
lôùn .  
Böôùc 3 : Lieân keát chöông trình  
Taäp tin ñoái töôïng taïo ra ôû böôùc 2 laø moät taäp tin ngoân ngöõ maùy nhöng noù  
khoâng chaïy ñöôïc vì chöa coù daïng thích hôïp cuûa 1 file chaïy . Hôn nöõa noù chöa bieát  
chöông trình ñöôïc naïp vaøo vò trí naøo treân boä nhôù ñeå chaïy . Moät soá ñòa chæ döôùi daïng  
maõ maùy coù theå bò thieáu .  
Trình LINK seõ lieân keát moät hoaëc nhieàu file ñoùi töôïng thaønh moät file chaïy duy  
nhaát ( *.EXE ) .Taäp tin naøy coù theå ñöôïc naïp vaøo boä nhôù vaø thi haønh .  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
14  
Ñeå lieân keát chöông trình ta goõ :  
LINK PGM1;  
Neáu khoâng coù daáu chaám phaåy ASM seõ yeâu caâuø chuùng ta goõ vaøo teân taäp tin  
thöïc thi .  
Böôùc 4 : Chaïy chöông trình  
Töø daáu nhaéc leänh coù theå chaïy chöông trình baèng caùch goõ teân noù roài nhaán  
ENTER .  
1.11 Xuaát moät chuoãi kyù töï  
Trong chöông trình PGM1 treân ñaây chuùng ta ñaõ duøng INT 21H haøm 2 vaø 4 ñeå  
ñoïc vaø xuaát moät kyù töï . Haøm 9 ngaét 21H coù theå duøng ñeå xuaát moät chuoãi kyù töï .  
INT 21H , Function 9 : Display a string  
Input : DX=offset address of string  
The string must end with a ‘$’ character  
Kyù töï $ ôû cuoái chuoãi seõ khoâng ñöôïc in leân maøn hình . Neáu chuoãi coù chöùa kyù  
töï ñieàu khieån thì chöùc naêng ñieàu khieån töông öùng seõ ñöôïc thöïc hieän .  
Chuùng ta seõ vieát 1 chöông trình in leân maøn hình chuoãi “HELLO!” . Thoâng  
ñieäp HELLO ñöôïc ñònh nghóa nhö sau trong ñoaïn soá lieäu :  
MSG DB  
‘HELLO!$’  
Leänh LEA ( Load Effective Address )  
LEA destnation , source  
Ngaét 21h , haøm soá 9 seõ xuaát moät chuoãi kyù töï ra maøn hình vôùi ñieàu kieän ñòa chæ  
hieäu duïng cuûa bieán chuoãi phaûi ôû treân DX . Coù theå thöïc hieän ñieàu naøy bôûi leänh :  
LEA DX,MSG  
; ñöa ñòa chæ offset cuûa bieán MSG vaøo DX  
Program Segment Prefix ( PSP ) : Phaàn ñaàu cuûa ñoaïn chöông trình  
Khi moät chöông trình ñöôïc naïp vaøo boä nhôù maùy tính , DOS daønh ra 256 byte  
cho caùi goïi laø PSP . PSP chöaù moät soá thoâng tin veà chöông trình ñang ñöôïc naïp trong  
boä nhôù . Ñeå cho caùc chöông trình coù theå truy xuaát tôùi PSP , DOS ñaët soá phaân ñoaïn  
cuûa noù (PSP) trong caû DS vaø ES tröôùc khi thöïc thi chöông trình . Keát quûa laø thanh  
ghi DS khoâng chöùa soá ñoaïn cuûa ñoaïn soá lieäu cuûa chöông trình . Ñeå khaéc phuïc ñieàu  
naøy , moät chöông trình coù chöùa ñoaïn soá lieäu phaûi ñöôïc baét ñaàu bôûi 2 leänh sau ñaây :  
MOV AX,@DATA  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
15  
MOV DS,AX  
ÔÛ ñaây @DATA laø teân cuûa ñoaïn soá lieäu ñöôïc ñònh nghóa bôûi DATA .  
Assembler seõ chuyeån @DATA thaønh soá ñoaïn .  
Sau ñaây laø chöông trình hoaøn chænh ñeå xuaát chuoãi kyù töï HELLO!  
TITLE  
PGM2: PRINT STRING PROGRAM  
.MODEL  
.STACK  
.DATA  
SMALL  
100H  
MSG DB  
.CODE  
MAIN  
‘HELLO!$’  
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 ñoåi chöõ thöôøng sang chöõ hoa  
Chuùng ta seõ vieát 1 chöông trình yeâu caàu ngöôøi duøng goõ vaøo moät kyù töï  
baèng chöõ thöôøng . Chöông trình seõ ñoåi noù sang daïng chöõ hoa roài in ra ôû doøng tieáp  
theo .  
TITLE  
PGM3: CASE COVERT PROGRAM  
.MODEL  
.STACK  
.DATA  
SMALL  
100H  
CR  
LF  
EQU 0DH  
EQU 0AH  
MSG1  
MSG2  
DB  
DB  
‘ENTER A LOWER CASE LETTER:$’  
0DH,0AH,’IN UPPER CASE IT IS :’  
Ñeà cöông baøi giaûng HÔÏP NGÖÕ  
16  
CHAR  
DB  
?,’$’ ; ñònh nghóa bieán CHAR coù giaù trò ban ñaàu chöa  
;xaùc ñònh  
DS  
AX,@DATA  
DS,AX  
.CODE  
MAIN  
; INITIALIZE  
MOV  
PROC  
MOV  
;PRINT PROMPT USER  
LEA DX,MSG1  
MOV AH,9  
; laáy thoâng ñieäp soá 1  
; xuaát noù ra maøn hình  
INT 21H  
;nhaäp vaøo moät kyù töï thöôøng vaø ñoåi noù thaønh kyù töï hoa  
MOV AH,1  
INT 21H  
; nhaäp vaøo 1 kyù töï  
; caát noù trong AL  
SUB AL,20H  
; ñoåi thaønh chöõ hoa vaø caát noù trong AL  
MOV CHAR, AL ; caát kyù töï trong bieán CHAR  
; xuaát kyù töï treân doøng tieáp theo  
LEA DX, MSG2 ; laáy thoâng ñieäp thöù 2  
MOV AH,9  
INT 21H  
; xuaát chuoãi kyù töï thöù hai , vì MSG2 khoâng keát  
;thuùc bôûi kyù töï $ neân noù tieáp tuïc xuaát kyù töï coù trong bieán CHAR  
;dos exit  
MOV AH,4CH  
INT 21H  
ENDP  
END MAIN  
; dos exit  
MAIN  
Ñeà cöôn g ba øi g i aûn g H ôïp n göõ  
17  
Chöông 2 : Traïng thaùi cuûa vi xöû lyù vaø caùc thanh ghi côø  
Trong chöông naøy chuùng ta seõ xem xeùt caùc thanh ghi  
côø cuûa vi xöû lyù vaø aûnh höôûng cuûa caùc leänh maùy ñeán caùc  
thanh ghi côø nhö theá naøo . Traïng thaùi cuûa caùc thanh ghi laø  
caên cöù ñeå chöông trình coù theå thöïc hieän leänh nhaûy , reû  
nhaùnh vaø laëp .  
Moät phaàn cuûa chöông naøy seõ giôùi thieäu chöông trình  
DEBUG cuûa DOS .  
2.1 Caùc thanh ghi côø ( Flags register)  
Ñieåm khaùc bieät quan troïng cuûa maùy tính so vôùi caùc  
thieát bò ñieän töû khaùc laø khaû naêng cho caùc quyeát ñònh  
. Moät maïch ñaëc bieät trong CPU coù theå laøm caùc quyeát  
ñònh naøy baèng caùch caên cöù vaøo traïng thaùi hieän haønh  
cuûa CPU . Coù moät thanh ghi ñaëc bieät cho bieát traïng  
thaùi cuûa CPU ñoù laø thanh ghi côø .  
Baûng 2.1 cho thaáy thanh ghi côø 16 bit cuûa 8086  
11 10 9 8 7 6 5 4 3 2 1 0  
O D IF T S Z  
F F F F F  
A
F
P
F
C
F
Baûng 2.1 :Thanh ghi côø cuûa 8086  
Ñeà cöôn g ba øi g i aûn g H ôïp n göõ  
18  
Muïc ñích cuûa caùc thanh ghi côø laø chæ ra traïng thaùi cuûa  
CPU .Coù hai loaïi côø laø côø traïng thaùi ( status flags) vaø côø  
ñieàu khieån (control flags) . Côø traïng thaùi phaûn aùnh caùc  
keát quûa thöïc hieän leänh cuûa CPU . Baûng 2.2 chæ ra teân vaø  
kyù hieäu caùc thanh ghi côø trong 8086 .  
Bit  
Name  
Symbol  
CF  
0 Carry flag  
2 Parity flag  
4 Auxiliary  
carry flag  
PF  
AF  
6 Zero flag  
7 Sign flag  
11 Overflow flag  
8 Trap flag  
9 Interrrupt flag  
10 Direction flag  
ZF  
SF  
OF  
TF  
IF  
DF  
Baûng 2.2 : Caùc côø cuûa 8086  
Moãi bit treân thanh ghi côø phaûn aùnh 1 traïng thaùi cuûa  
CPU .  
Caùc côø traïng thaùi ( status flags)  
Ñeà cöôn g ba øi g i aûn g H ôïp n göõ  
19  
Caùc côø traïng thaùi phaûn aùnh keát quaû cuûa caùc pheùp  
toaùn . Ví duï sau khi thöïc hieän leänh SUB AX,AX côø ZF  
=1 , nghóa laø keát quûa cuûa pheùp tröø laø zero .  
Côø nhôù ( Carry Flag - CF) : CF=1 neáu xuaát hieän bit  
nhôù (carry) töø vò trí MSB trong khi thöïc hieän pheùp coäng  
hoaëc coù bit möôïn ( borrow ) taïi MSB trong khi thöïc hieän  
pheùp tröø . Trong caùc tröôøng hôïp khaùc CF=0 . Côø CF cuõng  
bò aûnh höôûng bôûi leänh dòch ( Shift) vaø quay ( Rotate) soá  
lieäu .  
Côø chaún leû ( Parity Flag - PF) : PF=1 neáu byte thaáp  
cuûa keát quûa coù toång soá con soá 1 laø moät soá chaún ( even  
parity). PF=0 neáu byte thaáp laø chaún leû leû (old parity ). Ví  
duï neáu keát quûa laø FFFEh thì PF=0  
Côø nhôù phuï ( Auxiliary Carry Flag - AF ) :AF =1 neáu  
coù nhôù ( möôïn) töø bit thöù 3 trong pheùp coäng ( tröø) .  
Côø Zero ( Zero Flag -ZF) : ZF=1 neáu keát quûa laø soá 0 .  
Côø daáu ( Sign Flag - SF ) : SF=1 neáu MSB cuûa keát  
quûa laø 1 ( keát quûa laø soá aâm ) . SF=0 neáu MSB=0  
Côø traøn ( Overflow Flag - OF ) : OF=1 neáu xaûy ra  
traøn soá trong khi thöïc hieän caùc pheùp toaùn . Sau ñaây  
chuùng ta seõ phaân tích caùc tröôøng hôïp xaûy ra traøn trong  
khi thöïc hieän tính toaùn . Hieän töôïng traøn soá lieân quan ñeán  
vieäc bieãu dieãn soá trong maùy tính vôùi moät soá höõu haïn caùc  
bit . Caùc soá thaäp phaân coù daáu bieãu dieãn bôûi 1 byte laø -  
128 ñeán +127 . Neáu bieãu dieãn baèng 1 töø (16 bit) thì caùc  
soá thaäp phaân coù theå bieãu dieãn laø -32768 ñeán +32767 . Ñoái  
vôùi caùc soá khoâng daáu , daûi caùc soá coù theå bieãu dieãn trong  
Ñeà cöôn g ba øi g i aûn g H ôïp n göõ  
20  
moät töø laø 0 ñeán 65535 , trong moät byte laø 0 ñeán 255 . Neáu  
keát quûa cuûa moät pheùp toaùn vöôït ra ngoaøi daõi soá coù theå  
bieãu dieãn thì xaûy ra söï traøn soá . Khi coù söï traøn soá keát quûa  
thu ñöôïc seõ bò sai .  
2.2 Traøn ( overflow)  
Coù 2 loaïi traøn soá : Traøn coù daáu ( signed overflow)  
vaø traøn khoâng daáu ( unsigned overflow) . Khi thöïc hieän  
pheùp coäng soá hoïc chaúng haïn pheùp coäng , seõ xaûy ra 4 khaû  
naêng sau ñaây :  
1) khoâng traøn  
2) chæ traøn daáu  
3) chæ traøn khoâng daáu  
4) traøn caû daáu vaø khoâng daáu  
Ví duï cuûa traøn khoâng daáu laø pheùp coäng ADD AX,BX  
vôùi AX=0FFFFh , BX=0001h .Keát quûa döôùi daïng nhò phaân  
laø :  
1111 1111 1111 1111  
0000 0000 0000 0001  
10000 0000 0000 0000  
Neáu dieãn giaûi keát quûa döôùi daïng khoâng daáu thì keát  
quûa laø ñuùng ( 10000h=65536) . Nhöng keát quûa ñaõ  
vöôït quaù ñoä lôùn cuûa töø nhôù . Bit 1 ( bit nhôù töø vò trí  
Tải về để xem bản đầy đủ
pdf 108 trang baolam 21140 Free
Bạn đang xem 20 trang mẫu của tài liệu "Đề cương bài giảng Hợp ngữ", để 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:

  • pdfde_cuong_bai_giang_hop_ngu.pdf