TRÖÔØNG ÑAÏI HOÏC ÑAØ LAÏT
F
7 G
GIAÙO TRÌNH
HÔÏP NGÖÕ
NGUYEÃN HÖÕU LOÄC
2002
Hôïp Ngöõ
- 2 -
MUÏC LUÏC
LÔØI MÔÛ ÑAÀU ..................................................................................................................... 4
CHÖÔNG 1: GIÔÙI THIEÄU CHUNG ................................................................................... 5
I. CAÙC THANH GHI TRONG VI XÖÛ LYÙ HOÏ INTEL:................................................... 5
1. Caùc thanh ghi thoâng duïng: ....................................................................................... 6
2. Caùc thanh ghi phaân ñoaïn ......................................................................................... 7
3. Caùc thanh ghi chæ muïc vaø con troû:............................................................................ 7
4. Thanh ghi traïng thaùi (FLAG)................................................................................... 8
II. ÑÒA CHÆ OÂ NHÔÙ: ....................................................................................................... 8
III. MOÄT SOÁ LEÄNH CÔ BAÛN: ........................................................................................ 9
I. CAÙC LEÄNH GOÏI NGAÉT: ...........................................................................................11
II. TRÌNH DEBUG:........................................................................................................12
III. VAØI CHÖÔNG TRÌNH ÖÙNG DUÏNG :.....................................................................15
I. DOØNG LEÄNH:.............................................................................................................19
II. DÖÕ LIEÄU:...................................................................................................................20
1. Haèng: ......................................................................................................................20
2. Bieán: .......................................................................................................................21
1. Caùc leänh reõ nhaùnh coù ñieàu kieän: ............................................................................28
2. Caùc leänh reõ nhaùnh khoâng ñieàu kieän:......................................................................29
I. NGAÊN XEÁP:................................................................................................................38
II. THUÛ TUÏC: .................................................................................................................38
III. SÖÛ DUÏNG PTR VAØ LABEL: ...................................................................................40
IV. VAØI CHÖÔNG TRÌNH ÖÙNG DUÏNG:......................................................................41
1. Hieän soá thaäp phaân:..................................................................................................41
2. Hieän soá nhò phaân vaø thaäp luïc phaân..........................................................................44
3. Ñoïc töø baøn phím......................................................................................................46
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 3 -
CHÖÔNG 6: MOÑUN CHÖÔNG TRÌNH & CAÙC KIEÅU ÑÒNH VÒ ÑÒA CHÆ.............51
1. Ñònh höôùng bieân dòch extrn.....................................................................................51
2. Ñònh höôùng bieân dòch public ...................................................................................52
3. Laäp thö vieän - taïo vó leänh (macro) .........................................................................54
II. CAÙC KIEÅU ÑÒNH VÒ ÑÒA CHÆ..................................................................................56
III. CHÖÔNG TRÌNH ÖÙNG DUÏNG...............................................................................60
IV. TAÏO TAÄP TIN .COM ...............................................................................................67
1- Daïng cuûa moät chöông trình COM...........................................................................68
2- Öùng duïng taäp tin .com ............................................................................................69
CHÖÔNG 7: SÖÛ DUÏNG PHAÂN ÑOAÏN TOAØN PHAÀN.....................................................76
1. Segment..................................................................................................................76
2. Ñònh höôùng bieân dòch assume.................................................................................79
II - DAÏNG CUÛA CHÖÔNG TRÌNH .EXE SÖÛ DUÏNG TRONG CAÙC PHÖÔNG PHAÙP
CUÕ: .................................................................................................................................79
III- VÍ DUÏ CHÖÔNG TRÌNH COM..............................................................................83
II. ÑEÁM SOÁ TÖØ TRONG MOÄT TAÄP TIN ......................................................................86
III- ÑOÅI NGÖÔÏC CHUOÃI.............................................................................................89
IV. CHÖÔNG TRÌNH HIEÅN THÒ THÔØI GIAN .............................................................90
V. CHÖÔNG TRÌNH THÖÔØNG TRUÙ BOÄ NHÔÙ............................................................97
Phuï luïc A: MOÄT SOÁ CHÖÔNG TRÌNH PHUÏC VUÏ CUÛA DOS.......................................105
Phuï luïc B: MOÄT SOÁ CHÖÔNG TRÌNH PHUÏC VUÏ CUÛA ROM-BIOS............................108
TAØI LIEÄU THAM KHAÛO.................................................................................................110
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 4 -
LÔØI MÔÛ ÑAÀU
Hôïp ngöõ laø moät moân hoïc daønh cho sinh vieân caùc chuyeân ngaønh kyõ thuaät.
Laø moät ngoân ngöõ can thieäp saâu vaøo heä thoáng maùy tính, hôïp ngöõ thöôøng ñöôïc söû
duïng trong nhöõng phaàn vieäc töông ñoái tinh teá nhö ñieàu khieån heä thoáng, vi ñieàu
khieån ...
Tuy vaäy vôùi nhöõng ngöôøi laàn ñaàu tieân laøm quen vôùi ngoân ngöõ naøy, vieäc
tieáp thu quaû thaät raát khoù khaên bôûi leõ ngoân ngöõ naøy gaàn vôùi ngoân ngöõ maùy vaø söû
duïng caùc kyù töï gôïi nhôù neân khoù hieåu hôn söû duïng caùc ngoân ngöõ caáp cao nhö
Pascal, C..v.v...Ngoaøi ra, ngöôøi hoïc khoâng nhöõng phaûi bieát phaàn meàm maø coøn
phaûi hieåu phaàn cöùng ôû möùc ñoä naøo ñoù nöõa. Ñieàu naøy taïo ra moät aùp löïc raát lôùn gaây
khoù khaên cho ngöôøi hoïc.
Trong nhieàu naêm giaûng daïy moân naøy, toâi nhaän thaáy hieän coù raát nhieàu
saùch, taøi lieäu tham khaûo vieát veà hôïp ngöõ song ñeå coù moät taøi lieäu ñaùp öùng yeâu caàu
cuûa sinh vieân trong vieäc tieáp thu moân hôïp ngöõ tuaàn töï töø deã ñeán khoù coù phöông
phaùp thì thaät hieám.
Do vaäy toâi thöïc hieän giaùo trình naøy vôùi mong öôùc coù moät taøi lieäu ñaùp öùng
yeâu caàu treân. Trong giaùo trình, toâi coù ñöa vaøo raát nhieàu ví duï vaø öùng duïng töø thaáp
ñeán cao ñeå sinh vieân coù theå tieáp thu deã daøng moân hoïc naøy.
Tuy vaäy taøi lieäu naøy khoâng sao traùnh khoûi nhöõng sai soùt, raát mong caùc
ñoàng nghieäp, sinh vieân vaø baïn ñoïc goùp yù
Hoaøn thaønh giaùo trình naøy, toâi xin chaân thaønh caùm ôn ñeán caùc ñoàng
nghieäp trong Khoa Vaät lyù Tröôøng Ñaïi hoïc Dalat ñaõ ñoäng vieân, goùp yù vaø taïo ñieàu
kieän cho toâi trong quaù trình thöïc hieän. Toâi cuõng xin ghi nhaän söï ñoùng goùp cuûa
nhieàu theá heä sinh vieân khoa vaät lyù, khoa toaùn - tin ñeå giaùo trình naøy ñöôïc saép xeáp
ngaøy caøng deã hieåu vaø hôïp lyù hôn.
Nguyeãn Höõu Loäc
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 5 -
CHÖÔNG 1: GIÔÙI THIEÄU CHUNG
Taïi sao chuùng ta phaûi hoïc laäp trình vôùi hôïp ngöõ trong khi hieän nay
coù raát nhieàu ngoân ngöõ caáp cao nhö C hoaëc Pascal duøng ñeå laäp trình deã daøng
hôn? Coù theå noùi coù nhieàu caâu traû lôøi cho caâu hoûi naøy. Nhöng ban ñaàu, chuùng
ta coù theå xeùt ñoái vôùi hôïp ngöõ thì moãi leänh töông öùng vôùi moät leänh ngoân ngöõ
maùy. Noùi caùch khaùc, neáu moãi doøng leänh trong chöông trình laø moät leänh hôïp
ngöõ vaø moät töø maùy töông öùng vôùi moät leänh maùy nhö vaäy n doøng trong chöông
trình seõ taïo ra moät chöông trình maùy goàm n töø. Nhö vaäy hôïp ngöõ coù theå xem
laø ngoân ngöõ raát gaàn vôùi ngoân ngöõ maùy, chuùng ta coù theå tieáp caän ñeán taát caû caùc
ngoùc ngaùch cuûa maùy vaø quan troïng hôn laø chuùng ta thöïc hieän chöông trình
vieát baèng hôïp ngöõ nhanh hôn so vôùi vieát baèng nhöõng ngoân ngöõ caáp cao khaùc.
Tuy vaäy cuõng caàn thaáy raèng raát nhieàu ngoân ngöõ caáp cao hoå trôï giao dieän vôùi
hôïp ngöõ, noùi caùch khaùc laø chuùng ta coù theå vieát 1 ñoaïn hôïp ngöõ trong chöông
trình vieát baèng ngoân ngöõ caáp cao nhö C hoaëc Pascal... Ñieàu naøy cho pheùp
chuùng ta laäp trình hieäu quaû hôn vôùi nhöõng phaàn vieäc saùt vôùi heä thoáng vaø ñoøi
hoûi thôøi gian nhanh.
Trong kieán truùc maùy tính nhieàu caáp, vieäc chuyeån moät chöông trình
cuûa ngöôøi söû duïng töø moät ngoân ngöõ naøy sang chöông trình duøng ngoân ngöõ
khaùc goïi laø chöông trình dòch. Ngoân ngöõ söû duïng ñeå vieát chöông trình ban ñaàu
goïi laø ngoân ngöõ nguoàn coøn ngoân ngöõ sau khi dòch goïi laø ngoân ngöõ ñích.
Ngöôøi ta phaân bieät caùc chöông trình dòch ra laøm hai loaïi tuøy theo
moái quan heä giöõa ngoân ngöõ nguoàn vaø ngoân ngöõ ñích. Khi ngoân ngöõ nguoàn
goàm nhöõng kyù töï gôïi nhôù leänh cuûa ngoân ngöõ maùy thì chöông trình dòch seõ goïi
laø hôïp dòch (assembler) vaø ngoân ngöõ nguoàn laø hôïp ngöõ (assembly language).
Trong khi ñoù ngoân ngöõ nguoàn laø ngoân ngöõ caáp cao nhö C hoaëc Pascal thì
chöông trình dòch seõ goïi laø bieân dòch.
I. CAÙC THANH GHI TRONG VI XÖÛ LYÙ HOÏ INTEL:
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 6 -
Boä vi xöû lyù 8088 coù theå ñòa chæ hoùa ñeán 2
20
byte baét ñaàu töø ñòa chæ 0. Nhöõng
leänh cuûa 8088 coù theå thöïc hieän vôùi nhöõng töø 8 bit hay byte cuõng nhö vôùi nhöõng töø 16 bits.
8088 söû duïng nhöõng ñòa chæ 20 bits ñeå truy caäp ñeán 2
20
byte oâ nhôù. Vì caùc thanh ghi coù
chieàu daøi laø 16 bits neân caùc ñòa chæ duøng 20 bits seõ coù khoù khaên trong thöïc hieän. Ñeå giaûi
quyeát vaán ñeà naøy, nhöõng nhaø saûn xuaát boä vi xöû lyù ñaõ söû duïng 4 thanh ghi phaân ñoaïn (moät
duøng cho leänh, moät cho döõ lieäu, moät cho ngaên xeáp vaø moät döï tröõ)
Nhöõng thanh ghi coù theå xem laø nhöõng oâ nhôù naèm beân trong boä vi xöû lyù coù thôøi
gian truy xuaát cao, vôùi 8088, chuùng ta coù 14 thanh ghi chia ra laøm 4 loaïi:
- Caùc thanh ghi laøm vieäc;
- Caùc thanh phaân ñoaïn;
- Caùc thanh ghi böôùc nhaûy (offset);
- Thanh ghi traïng thaùi (Côø: FLAG)
1. Caùc thanh ghi thoâng duïng:
Bao goàm 4 thanh ghi. Moãi thanh ghi ñeàu coù nhöõng chöùc naêng rieâng maëc duø
chuùng cuõng laø nhöõng nôi löu tröõ nhöõng keát quaû trung gian:
AX laø thanh ghi 16 bit goïi laø thanh ghi tích luõy (Accumulator) söû duïng khi
thöïc hieän caùc pheùp tính soá hoïc.
BX laø thanh ghi 16 bit goïi laø thanh ghi neàn (Base register)
CX laø thanh ghi 16 bit goïi laø thanh ghi ñeám (Counter)
DX laø thanh ghi 16 bit goïi laø thanh ghi döõ lieäu (Data)
Neân bieát raèng moãi thanh ghi naøy ñeàu coù theå phaân ra laøm hai thanh ghi 8 bit söû
duïng rieâng reõ ñöôïc:
AX = AH vaø AL;
BX = BH vaø BL;
CX = CH vaø CL;
DX = DH vaø DL.
Cuõng neân nhôù raèng nhöõng pheùp toaùn thöïc hieän vôùi caùc thanh ghi luoân nhanh
khi chuùng thöïc hieän vôùi caùc oâ nhôù trong boä nhôù.
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 7 -
2. Caùc thanh ghi phaân ñoaïn
Goàm 4 thanh ghi:
CS vieát taét töø "Code Segment", laø nôi löu tröõ ñòa chæ cuûa phaân ñoaïn boä nhôù
taïi ñoù caùc leänh trong chöông trình naïp vaøo (maõ maùy).
DS vieát taét töø "Data Segment", laø nôi löu tröõ ñòa chæ cuûa phaân ñoaïn boä nhôù
taïi ñoù ñaët döõ lieäu (data) cuûa chöông trình.
SS vieát taét töø "Stack Segment", laø nôi löu tröõ ñòa chæ cuûa phaân ñoaïn ngaên
xeáp.
ES vieát taét töø "Extra Segment", laø nôi löu tröõ ñòa chæ cuûa phaân ñoaïn döï tröõ
thöôøng duøng ghi giöõ döõ lieäu.
3. Caùc thanh ghi chæ muïc vaø con troû:
Caùc thanh ghi naøy giöõ giaù trò böôùc nhaûy (offset ) keát hôïp vôùi ñòa chæ phaân ñoaïn.
Toång coäng coù 5 thanh ghi:
SI vieát taét töø "Source Index". Thanh ghi naøy laø thanh ghi 16 bit söû duïng khi
thöïc hieän caùc pheùp toaùn vôùi chuoãi (daõy kyù töï); thöôøng ñöôïc duøng keát hôïp vôùi thanh ghi
phaân ñoaïn DS.
DI vieát taét töø "Destination Index". Thanh ghi naøy cuõng laø thanh ghi
16 bit söû duïng khi thöïc hieän caùc pheùp toaùn vôùi chuoãi (daõy kyù töï); thöôøng ñöôïc
duøng keát hôïp vôùi thanh ghi phaân ñoaïn DS. Tuy nhieân trong tröôøng hôïp
chuyeån chuoãi thì noù seõ keát hôïp vôùi thanh ghi phaân ñoaïn ES.
BP hoaëc "Base Pointer". Thanh ghi 16 bit naøy keát hôïp vôùi thanh ghi phaân ñoaïn
SS (SS:BP) ñeå ñöa döõ lieäu vaøo trong ngaên xeáp khi goïi chöông trình con (CALL)
SP hoaëc "Stack Pointer". Thanh ghi 16 bit naøy cuõng keát hôïp vôùi thanh ghi phaân
ñoaïn SS (SS:SP) ñeå chæ ra phaàn töû cuoái cuûa ngaên xeáp.
IP goïi laø con troû leänh (Instruction Pointer). Thanh ghi 16 bit naøy keát hôïp vôùi
thanh ghi phaân ñoaïn CS (CS:IP) ñeå chæ ñeán leänh tieáp theo seõ thöïc hieän. Noäi dung cuûa
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 8 -
thanh ghi naøy khoâng theå thay ñoåi tröïc tieáp; noù chæ bò thay ñoåi moät caùch giaùn tieáp thoâng qua
caùc leänh nhaûy böôùc, qua caùc chöông trình con vaø qua caùc ngaét.
4. Thanh ghi traïng thaùi (FLAG)
Thanh ghi trang thaùi laø thanh ghi goàm 16 bit (Côø). Giaù trò cuûa töøng bit moät
trong thanh ghi naøy ñoäc laäp vôùi caùc bit khaùc trong cuøng thanh ghi. Ngöôøi ta thöôøng xöû lyù
töøng bit moät vaø moät soá bit coù aûnh höôûng ñeán hoaït ñoäng cuûa chöông trình. Nhöõng bit naøy
goïi laø caùc chæ baùo (indicator) coù theå chia ra laøm 2 loaïi:
Caùc chæ baùo traïng thaùi:
bit
yù nghóa
vieát taét
0
Nhôù
(Carry)
CF
2
Chaün leû (Parity)
PF
4
Nhôù phuï (Auxiliairy carry)
AF
6
Khoâng
(Zero)
ZF
7
Daáu
(Sign)
SF
11
Traøn
(Overflow)
OF
Caùc chæ baùo ñieàu khieån
bit
yù nghóa
vieát taét
8
Baåy
(Trap)
TF
9
Ngaét
(Interrupt)
IF
10
Höôùng (Direction)
DF
Caùc bit 1, 5, 12, 13, 14, 15 cuûa thanh ghi traïng thaùi 16 bit khoâng ñöôïc söû duïng.
II. ÑÒA CHÆ OÂ NHÔÙ:
Boä nhôù cuûa 1 maùy tính bao goàm 1 daõy tuaàn töï caùc oâ nhôù ñöôïc ñaùnh soá trong ñoù
löu giöõõ 1 giaù trò soá naøo ñoù. Soá töông öùng cuûa 1 oâ nhôù goïi laø ñòa chæ, moãi oâ nhôù giöõ 8 bit.
Treân nhöõng maùy tính IBM PC, boä nhôù ñöôïc chia thaønh caùc vuøng 65536 byte goïi laø phaân
ñoaïn, ñòa chæ cuûa 1 oâ nhôù seõ bao goàm 2 phaàn: soá phaân ñoaïn vaø böôùc nhaûy (offset) tính töø vò
trí ban ñaàu cuûa phaân ñoaïn; noù seõ coù daïng:
Phaân ñoaïn: böôùc nhaûy
(Segment:Offset)
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 9 -
Caùc leänh chieám moät hoaëc nhieàu oâ nhôù keá tieáp trong boä nhôù, ñieàu naøy phuï
thuoäc vaøo ñoä phöùc taïp cuûa leänh.
III. MOÄT SOÁ LEÄNH CÔ BAÛN:
MOV: laø moät trong nhöõng leänh chính cuûa hôïp ngöõ. Noäi dung cuûa toaùn haïng beân
phaûi seõ chuyeån sang toaùn haïng beân traùi
Ví duï:
MOV
AX,
10
MOV
AX,
BX
MOV
AX,
[BX]
LEA:(Load Effective Address) töông töï nhö MOV ....,OFFSET....
Ví duï:LEA DX,MSG thay vì MOV DX, OFSET MSG
ADD: coäng 2 soá 8 bit hoaëc 16 bit, keát quaû ñöa vaøo boä nhôù hoaëc thanh ghi.
Ví duï:
ADD
AX,
BX
ADD
AH,
AL
INC: theâm moät ñôn vò vaøo thanh ghi cho tröôùc, keát quaû nhaän ñöôïc seõ töông töï nhö
COÄNG vôùi 1.
Ví duï:
INC
AX
INC
BL
ADC: thöïc hieän leänh coäng nhö ADD sau ñoù theâm giaù trò coù trong chæ baùo CARRY
vaøo keát quaû nhaän ñöôïc
Ví duï:
ADC
DL,30
SUB: thöïc hieän tröø 1 löôïng töø 1 soá, keát quaû ñöôïc ñaët vaøo boä nhôù hoaëc thanh ghi.
Ví duï:
SUB
AL,
BL
MUL: nhaân toaùn haïng cho tröôùc vôùi moät löôïng ñaët trong thanh AX hoaëc AL
(accumulator). Keát quaû seõ ñaët vaøo AH vaø AL neáu caùc toaùn haïng laø byte vaø ñaët trong
DX vaø AX neáu toaùn haïng laø töø (word).
Ví duï:
MUL
BH
MUL
BX
DIV: chia 1 töø (soá bò chia trong AX) bôûi 1 toaùn haïng 8 bit (soá chia) hoaëc chia 1 töø
ñoâi - double word (trong DX, AX) bôûi moät toaùn haïng 16 bit. Thöông soá seõ ñaët trong
AL vaø soá dö ñaët trong AH neáu toaùn haïng laø moät byte vaø thöông soá seõ ñaët trong AX vaø
soá dö ñaët trong DX neáu söû duïng 1 töø-word.
Ví duï:
DIV
BX
DIV
BH
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 10 -
CMP: cho pheùp so saùnh noäi dung hai thanh ghi hoaëc oâ nhôù. So saùnh laø thöïc hieän 1
pheùp tröø tuy nhieân muïc ñích ñaït ñöôïc khoâng phaûi laø keát quaû cuûa pheùp trö ø maø chuû
yeáu laø so saùnh hai toaùn haïng do vaäy sau leänh so saùnh thöôøng thaáy leänh nhaûy böôùc coù
ñieàu kieän phuï thuoäc vaøo caùc chæ baùo trong quaù trình so saùnh.
Ví duï:
CMP
DL, 3A
JNZ: nhaûy böôùc ñeán moät nhaõn (label) cho tröôùc neáu chæ baùo zero laøø 0.
Ví duï:
JNZ
Tiep
JLE: nhaûy böôùc ñeán moät nhaõn (label) cho tröôùc neáu keát quaû laø nhoûù hôn hoaëc baèng 0.
Ví duï:
JLE
Lap
LOOP: laëp laïi luùc naøy thanh ghi CX giaûm 1 ñôn vò vaø thöïc hieän moät söï reõ nhaùnh
ñeán moät nhaõn cho tröôùc cho ñeán khi CX baèng 0.
Ví duï:
LOOP
Lap
RCL: dòch chuyeån taát caû caùc bit veà phía traùi moät vò trí hoaëc nhieàu vò trí. Nhöõng bit
ra khoûi beân TRAÙI seõ vaøo chæ baùo CARRY tröôùc khi ñöa laïi vaøo beân phaûi cuûa toaùn
haïng.
Ví duï:
RCL
AH,1
SHR: dòch chuyeån taát caû caùc bit veà phía phaûi moät vò trí hoaëc nhieàu vò trí.
Ví duï:
SHR
AH,1
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 11 -
CHÖÔNG 2: GOÏI NGAÉT VAØ TRÌNH DEBUG
I. CAÙC LEÄNH GOÏI NGAÉT:
Moät maùy tính thöôøng coù raát nhieàu loaïi thieát bò ngoaïi vi quan troïng nhö baøn
phím, maøn hình, ñóa, maùy in, v.v... Muoán ñieàu khieån caùc thieát bò naøy ñoøi hoûi chuùng ta phaûi
vieát chöông trình baèng caùc leänh maùy daøi doøng vaø phöùc taïp. Nhôø söï giuùp ñôõ cuûa heä ñieàu
haønh MSDOS hoaëc ROM-BIOS chuùng ta coù theå taùc ñoäng moät thieát bò ngoaïi vi baèng caùch
chæ söû duïng 1 haøm ñöôïc ñaùnh soá vaøo chöông trình keøm theo moät soá caùc thoâng soá. Taát caû
ñieàu naøy ñeàu thöïc hieän thoâng qua caùc thanh ghi. Nhöõng haøm naøy goïi laø ngaét.
Leänh INT laø leänh goïi ngaét ñöôïc ñaùnh soá taïi vò trí toaùn haïng ñöôïc xem nhö goïi
moät chöông trình con. Moät ngaét coù theå bao goàm nhieàu dòch vuï, soá cuûa dòch vuï ñöôïc ñöa
vaøo thanh ghi AH tröôùc khi goïi ngaét.
Ví duï 1: Hieän 1 kyù töï ASCII leân maøn hình
MOV
DL,41h
MOV
AH,02h
INT
21h
Ví duï 2: Ñoïc kyù töï tieáp töø baøn phím
MOV
AH,0
INT
16h
Ví duï 3: Hieän 1 thoâng baùo leân maøn hình
Chao
DB
'Chao cac ban $'
MOV
AH,09h
MOV
DX, OFFSET Chao
INT
21h
Ví duï 4: Keát thuùc chöông trình
INT
20h
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 12 -
Chuùng ta coù theå tham khaûo caùc haøm naøy trong taøi lieäu "Caåm nang cho ngöôøi
laäp trình maùy vi tính IBM PC" - taùc giaû Peter Norton
II. TRÌNH DEBUG:
Moät trong hai caùch ñeå vieát chöông trình baèng hôïp ngöõ laø söû duïng phaàn meàm
DEBUG. Chuùng ta caàn phaûi coù moät taäp tin teân DEBUG.EXE söû duïng trong heä ñieàu haønh
MSDOS
Coù theå xem DEBUG laø moät coâng cuï giuùp chuùng ta laäp trình baèng hôïp ngöõ ban
ñaàu vì nhöõng lyù do sau:
-
DEBUG söû duïng deã hôn MASM.
-
Chuùng ta coù theå thöû nghieäm caùc chöông trình nhoû deã daøng tröôùc khi ñöa
chuùng vaøo trong nhöõng chöông trình lôùn, phöùc taïp hôn.
DEBUG coù 19 leänh. Caùc leänh naøy duøng maãu töï ñaàu cuûa töø tieáng
Anh ñeå gôïi nhôù yù nghóa cuûa leänh.
LEÄNH
TÖØ TIEÁNG ANH
CHÖÙC NAÊNG
1 2
3
A
Assemble
Hôïp dòch 1 chöông trình
C
Compare
So saùnh 2 vuøng cuûa boä nhôù
D
Dump
Trình baøy moät vuøng cuûa boä nhôù baèng hex vaø
ASCII
E
Enter
Nhaäp maõ maùy vaøo boä nhôù
F
Fill
Laép ñaày moät vuøng nhôù
G
Go
Thöïc hieän moät chöông trình
H
Hexadecimal
Coäng vaø tröø 2 soá hex
I
Input
Nhaäp vaø trình baøy töø coång
L
Load
Nhaäp moät taäp tin töø ñóa vaøo boä nhôù
1 2
3
M
Move
Chuyeån moät khoái nhôù
N
Name
Ñaët teân moät taäp tin
O Out
Ñöa
ra
coång
P
Proceed
Thöïc hieän thuû tuïc hay moät ngaét
Q Quit
Thoaùt
khoûi
Debug
R
Register
Trình baøy giaù trò thanh ghi
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 13 -
S
Search
Tìm moät chuoãi byte trong boä nhôù
T
Trace
Cho chöông trình chaïy töøng leänh moät
U Unassemble
Dòch
ngöôïc
W
Write
Ghi leân ñóa
Ñeå khôûi ñoäng trình DEBUG, ngöôøi ta ñaùnh leänh sau:
DEBUG
- Moät gaïch ngang (hyphen) xuaát hieän thoâng baùo cho chuùng ta bieát DEBUG
ñang ñôïi leän tieáp.
Nhöõng leänh DEBUG thöôøng söû duïng:
Q (Quit): Döøng thöïc hieän DEBUG, veà laïi heä ñieàu haønh
D (Dump Memory): Hieän noäi dung moät vuøng nhôù.
Ví duï: D 100
xxxx:0100 E9 2D 0D BA DA E7 F5 53 - 00 75 1B 0A 7D 3E 89 90
xxxx:0110 00 67 8A C9 65 3E 7F 1D -5A 6B 7E 90 8B 5A 8F 39
xxxx:0120 E9 2D 0D BA DA E7 F5 53 - 00 75 1B 0A 7D 3E 89 90
xxxx:0130 00 67 8A C9 65 3E 7F 1D -5A 6B 7E 90 8B 5A 8F 39
U (UnAssemble): Cho hieän maõ maùy chöông trình.
Ví duï: U 100
xxxx:0100 E92D0D
JMP
0E30
xxxx:0103 BADA0A
MOV
DX,0ADA
xxxx:0106 3D0500
CMP
AX,0005
xxxx:0109 741B
JZ
0126
R (Registers): Hieän hoaëc thay ñoåi noäi dung caùc thanh ghi cuûa boä vi xöû lyù. Leänh
naøy cho hieän:
-
Noäi dung cuûa caùc thanh ghi trong heä cô soá 16 (hexadeùcimal).
-
Noäi dung cuûa thanh ghi traïng thaùi
Chæ baùo
=0
=1
OF NV
OV
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 14 -
DF UP
DN
IF EI
DI
SF PL
NG
ZF NZ
ZR
AF NA
AC
PF PO
PE
CF NC
CY
Ví duï:
R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=6800 ES=6800 SS=6800 CS=6800 IP=0100 NV UP EI PL NZ NA PO NC
6800:0100 E92D0D JMP 0E30
A (Assemble): nhaäp leänh hôïp ngöõ. Chuù yù, DEBUG chæ duøng soá trong heä cô soá
16 chöù khoâng duøng heä cô soá naøo khaùc.
Ví duï:
A 100
6800:0100 MOV AX,FFFF
6800:0103 MOV AH,5
6800:0105 MOV BH,6
6800:0107 MOV AL,BH
6800:0109
E (Entry): Thay ñoåi noäi dung oâ nhôù.
Ví duï:
E 120
G (Go): Thöïc hieän chöông trình
N (Name): Ñaët teân taäp tin
Ví
duï:
N
DIAMOND.COM
W (Write): Ghi laïi taäp tin leân ñóa, chuù yù tröôùc ñoù phaûi nhaäp CX (soá byte söû
duïng trong chöông trình) vaø BX= 0 (ñóa A)
L (Load): Laáy laïi noäi dung taäp tin vaøo boä nhôù, chuù yù tröôùc ñoù phaûi xaùc ñònh teân
taäp tin, oå ñóa ñang löu giöõ
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 15 -
T (Trace): thöïc hieän chöông trình tuaàn töï töøng leänh moät coù thoâng baùo noäi dung
cuûa caùc thanh ghi thay ñoåi sau moãi leänh.
III. VAØI CHÖÔNG TRÌNH ÖÙNG DUÏNG :
Chöông trình 1: Hieän 1 kyù töï (♦) leân maøn hình
-A
xxxx:0100
MOV
DL,4;
maõASCII
xxxx:0102
MOV
AH,2; kyù töï ♦
xxxx:0104
INT
21
xxxx:0106
INT
20
-G
-U
-N DIAMOND.COM
-R CX (=8)
-R BX (=0)
-W
-Q
Chöông trình 2: Hieän 1 chuoãi (Chao cac ban) leân maøn hình
Caùch 1:
-E 120
43 6F 68 61 20 63 61 63 20
62
61
6E
-A
xxxx:0100
MOV
BX,120
xxxx:0103
MOV
CX,0C
xxxx:0106
MOV
DL,[BX]
xxxx:0108
MOV
AH,2
xxxx:010A
INT
21
xxxx:010C
INC
BX
xxxx:010D
LOOP
106
xxxx:010F
INT
20
-U
-G
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 16 -
* Sinh vieân coù theå ñaët teân roài löu vaøo ñóa
Caùch 2: Söû duïng giaû leänh DB
-A
xxxx:0100
MOV
AH,9
xxxx:0102
MOV
DX,109
xxxx:0105
INT
21
xxxx:0107
INT
20
xxxx:0109
DB
'Chao cac ban! $'
-U
-G
Chöông trình 3: Coäng 10 soá nguyeân ñaàu tieân
-A
xxxx:0100
MOV
CX,1
xxxx:0103
MOV
AX,0
xxxx:0106
ADD
AX,CX
xxxx:0108
INC
CX
xxxx:0109
CMP
CX,0A
xxxx:010C
JLE
106
xxxx:010E
INT
20
-U
-T
Chöông trình 4: Hieän 5 kyù töï ABCDE leân maøn hình
-A
xxxx:0100
MOV
DL,41
xxxx:0102
MOV
CX,5
xxxx:0105
CALL
10E
xxxx:0108
LOOP
105
xxxx:010A
MOV
AH,4C
xxxx:010C
INT
21
xxxx:010E
MOV
AH,2
xxxx:0110
INT
21
xxxx:0112
INC
DL
xxxx:0114
RET
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 17 -
-N HIEN.COM
-R CX (=F)
-R BX (=0)
-W
-G
DEBUG
-N HIEN.COM
-L
-U
Chöông trình 5: Thöïc hieän caùc pheùp toaùn + , - , x , /
1 byte:
-A
xxxx:0100
MOV
AL,05
MOV
BL,03
ADD
AL,BL
MOV
BL,02
SUB
AL,BL
MOV
CL,03
MUL
CL
MOV
CL,02
DIV
CL
INT
20
-U
-T
1 word = 2 byte
-A
xxxx:0100
MOV
AX,3A62
MOV
CX,2B14
ADD
AX,CX
MOV
CX,1002
SUB
AX,CX
MUL
CX
MOV
AX,A034
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 18 -
MOV
DX,0001
MOV
BX,1002
DIV
BX
INT
20
-U
-T
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 19 -
CHÖÔNG 3: HÔÏP NGÖÕ DUØNG TRONG PC
Hieän nay khi vieát chöông trình baèng hôïp ngöõ, chuùng ta thöôøng söû duïng trình
dòch MICROSOFT MACRO ASSEMBLER (MASM). Cuõng gioáng taát caû caùc ngoân ngöõ laäp
trình khaùc nhö Basic, Pascal, C ñeàu phaûi thoâng qua dòch thì maùy tính môùi hieåu ñöôïc leänh
sau khi ñaõ taïo ra maõ nguoàn trong moät moâi tröôøng keát hôïp soaïn thaûo. Ñeå soaïn thaûo moät
chöông trình baèng hôïp ngöõ chuùng ta chæ caàn söû duïng moät trình soaïn thaûo vaên baûn ASCII ví
duï nhö Sidekick, phaàn soaïn thaûo trong Norton Commander...v.v... vaø sau ñoù seõ löu giöõ vaøo
taäp tin ASCII treân ñóa. Böôùc tieáp theo laø dòch maõ nguoàn sang maõ maùy nhôø trình dòch
(Assembler).
Chöông trình ñöôïc löu treân ñóa laø moät taäp tin coù phaàn môû roäng ASM ñöôïc soaïn
thaûo baèng moät phaàn meàm soaïn thaûo vaên baûn (ASCII) trong ñoù caùc chöõ caùi vieát HOA ñeàu
ñöôïc xöû lyù nhö nhöõng chöõ caùi vieát thöôøng tröø tröôøng hôïp ñaët trong 1 chuoãi (daõy kyù töï).
Caùc chöông trình bao goàm nhöõng doøng leänh. Moãi doøng leänh laø moät leänh ñöôïc
dòch sang maõ maùy baèng caùc trình dòch.
I. DOØNG LEÄNH:
Moãi doøng leänh goàm 4 vuøng
-
Teân (identifier)
-
Pheùp toaùn
-
Toaùn haïng
-
Chuù thích
Thöôøng theo thoùi quen ngöôøi ta chia laøm 4 coät duøng cho 4 vuøng ñeå chöông trình ñöôïc roõ
raøng maëc duø khoâng coù moät söï baét buoäc naøo veà vieäc chia naøy caû.
TEÂN
PHEÙP TOAÙN
TOAÙN HAÏNG ; CHUÙ THÍCH
Ví duï:
Batdau:
MOV CX,5 ; ñaët soá ñeám ban ñaàu
Caùc vuøng khaùc nhau phaûi ngaên caùch bôûi ít nhaát moät khoaûng troáng (space) hoaëc
TAB, caùc toaùn haïng trong moät leänh phaûi caùc nhau bôûi 1 daáu phaåy (trong tröôøng hôïp naøy
khoâng caàn thieát phaûi coù khoaûng troáng).
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 20 -
Caùc teân ñöôïc laäp trình vieân töï do ñaët ñeå xaùc ñònh nhaõn, bieán, thuû tuïc, v.v...Teân
goàm caùc kyù töï theo yeâu caàu sau: Kyù töï thöù nhaát laø chöõ caùi, soá kyù töï toái ña laø 31 vaø khoâng
coù khoaûng troáng trong teân.
Nhöõng pheùp toaùn laø nhöõng kyù töï gôïi nhôù leänh: MOV, ADD, INC... hoaëc giaû
leänh (pseudo-instruction): DB, PROC...
Nhöõng toaùn haïng trong moät leänh seõ ngaên caùch baèng moät daáu phaåy.
Neáu coù 2 toaùn haïng thì toaùng haïng thöù nhaát laø ñích coøn toaùn haïng thöù hai laø
nguoàn.
Chuùng ta cuõng thaáy coù theå ñöa theâm chuù thích ñeå deã theo doõi ñoïc chöông
trình. Daáu ";" phaûi ñöôïc söû duïng tröôùc khi ghi chuù thích.
II. DÖÕ LIEÄU:
1. Haèng:
Haèng laø moät giaù trò xaùc ñònh baèng moät leänh hay ñuùng hôn laø moät giaû leänh
hôïp ngöõ, giaù trò naøy ñöôïc laäp trình vieân ñònh nghóa laø khoâng thay ñoåi trong quaù trình thöïc
hieän chöông.
Giaû leänh EQU laø leänh hôïp ngöõ duøng ñeå ñònh nghóa moät haèng öùng vôùi moät
teân ñöôïc laäp trình vieân ñaët cho.
Ví duï:
Dung EQU 1
Sai
EQU
0
Nhöõng haèng töùc thôøi (immeùdiate) laø:
. Nhöõng chöõ soáá do laäp trình vieân ñaët ra coù theå söû duïng trong caùc heä cô soá
khaùc nhau. Do vaäy neân theâm chöõ caùi "h" sau nhöõng soá duøng trong heä cô soá 16, vaø theâm
chöõ caùi "b" sau taát caû caùc soá nhò phaân vì trình dòch hôïp ngöõ maëc nhieân chæ laøm vieäc trong
heä cô soá 10 (thaäp phaân) (caàn chuù yù laø trình DEBUG chæ laøm vieäc vôùi heä cô soá 16).
Ví duï: 1B4Dh, 1100b
Nhöõng chöõ soá trong heä cô soá 16 (hexadecimal) baét ñaàu baèng moät chöõ caùi
thì phaûi theâm vaøo moät soá "0" neáu khoâng trình dòch hôïp ngöõ seõ xem nhö moät TEÂN vaø
thoâng baùo loãi.
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 21 -
. Nhöõng kyù töï: Nhöõng kyù töï hoaëc chuoãi (daõy kyù töï) ñeàu phaûi
ñöôïc ñaùnh daáu nhaùy ñôn hoaëc ñoâi.
Ví duï: "A", 'Hello'
2. Bieán:
Caùc bieán seõ chieám caùc vuøng nhôù trong quaù trình dòch nhôø söû duïng caùc leänh giaû.
Leänh giaû DB khai baùo vuøng nhôù theo byte, laäp trình vieân coù theå ñaët teân cho
phaàn ñaàu vuøng nhôù. Leänh giaû naøy cuõng xaùc ñònh vuøng nhôù ñöôïc duøng cho chöõ soá hay caùc
chöõ caùi.
Chuù yù: neáu coù nhieàu phaàn töû duøng trong leänh naøy thì nhöõng phaàn töû
naøy phaûi ñöôïc ngaên caùch baèng nhöõng daáu phaåy.
Loaïi BYTE ñöôïc duøng cho caùc soá coù giaù trò trong khoaûng töø 0 ñeán
255.
Ví duï:
-
Khai baùo moät bieán loaïi BYTE coù giaù trò ban ñaàu laøø 0, Teân laø "So".
So DB 0
-
Khai baùo vuøng nhôù coù 3 phaàn töû loaïi BYTE
XYZ
DB 1,2,3
-
Khai baùo moät bieán khoâng coù giaù trò ban ñaàu
Khac
DB ?
-
Khai baùo moät maûng coù 5 phaàn töû khoâng coù giaù trò ban ñaàu loaïi BYTE:
Mang
DB 5 DUP(?)
-
Khai baùo moät maûng coù 25 phaàn töû, phaàn töû thöù nhaát laø 1, thöù hai laøø 2, v.v...:
Mangkhac
DB
5 DUP (1,2,3,4,5)
DUP baùo cho trình dòch bieát laø thöïc hieäp laëp laïi (DUPlicate). Nhö
vaäy nhöõng giaù trò coù trong ngoaëc ñôn seõ laëp laïi cho ñeán heát.
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 22 -
Leänh giaû DW khai baùo vuøng nhôù goàm caùc töø (word)
Leänh giaû DD khai baùo vuøng nhôù goàm caùc töø ñoâi (double word)
Leänh giaû DF, DP -> 6byte, DQ -> 8byte; DT-> 10byte
Chuoãi kyù töï: Leänh giaû DB cuõng ñöôïc söû duïng ñeå ñònh nghóa chuoãi kyù. Moät
chuoãi kyù töï luoân ñöôïc ñaët trong daáu nhaùy; neáu chuoãi ñöôïc cho hieän leân maøn hình thì
phaûi keát thuùc baèng daáu '$'
Ví duï:
Thongbao DB 'Chaøo caùc baïn $'
Baoloi DB 'Coù loãi, ñeà nghò laøm laïi $'
Maûng: Maûng laø moät taäp hôïp caùc döõ lieäu cuøng loaïi (byte, word...). Maûng seõ giuùp
cho laäp trình vieân deã daøng laäp caùc voøng laëp ñôn giaûn trong moät chöông trình, muïc
ñích laø truy caäp tuaàn töï ñeán caùc döõ lieäu caàn thieát theo thöù töï.
Ví duï 1:
Vôùi khai baùo SO DB 5,2,7
Chuùng ta coù:
SO
-
5
hoaëc xxxx:0100
- 5
SO+1 -
2
hoaëc xxxx:0101
- 2
SO+2 -
7
hoaëc xxxx:0102
- 7
Ví duï 2:
MANG
DW
12F9h,
15AEh
thì
MANG -
F9h
MANG+1
-
12h
MANG+2
-
AEh
MANG+3
-
15h
III. CAÁU TRUÙC CHÖÔNG TRÌNH:
Caùc chöông trình vieát baèng maõ maùy bao goàm caùc phaàn maõ pheùp toaùn, döõ lieäu,
ngaên xeáp. Moãi phaàn chieám moät phaân ñoaïn nhôù. Chöông trình vieát baèng hôïp ngöõ
cuõng theo caáu truùc nhö vaäy. Luùc aáy döõ lieäu vaø ngaên xeáp ñöôïc ghi thaønh caùc phaân
ñoaïn trong chöông trình . Moãi phaân ñoaïn cuûa chöông trình seõ ñöôïc dòch sang moät
phaân ñoaïn nhôù trong quaù trình dòch.
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 23 -
1. Loaïi nhôù:
Ngöôøi ta coù theå söû duïng ñònh höôùng bieân dòch (directive) ñeå xaùc ñònh loaïi nhôù:
CUÙ PHAÙP: .MODEL loaïi nhôù
Thöôøng ngöôøi ta söû duïng caùc loaïi sau:
SMALL, MEDIUM, COMPACT, LARGE....
SMALL: Caùc maõ pheùp toaùn ñaët trong moät phaân ñoaïn
Caùc döõ lieäu ñaët trong moät phaân ñoaïn.
MEDIUM:
Caùc maõ pheùp toaùn ñaët trong nhieàu phaân ñoaïn (hôn 1)
Caùc döõ lieäu ñaët trong moät phaân ñoaïn
COMPACT:
Caùc maõ pheùp toaùn ñaët trong moät phaân ñoaïn Caùc döõ lieäu ñaët
trong nhieàu phaân ñoaïn (hôn 1)
LARGE:
Caùc maõ pheùp toaùn ñaët trong nhieàu phaân ñoaïn (hôn 1)
Caùc döõ lieäu ñaët trong nhieàu phaân ñoaïn
(hôn 1)
Khoâng theå coù caùc maûng chieám nhieàu hôn 64Kbyte
2. Phaân ñoaïn döõ lieäu:
Phaân ñoaïn döõ lieäu trong moät chöông trình bao goàm taát caû nhöõng bieán xaùc ñònh.
Ngöôøi ta söû duïng ñònh höôùng bieân .DATA ñeå ñònh nghóa vuøng cho bieán vaø haèng.
Ví duï:
.DATA
WORD1
DW
2
MSG
DB
'Chao'
SO
EQU
10101111b
3. Phaân ñoaïn ngaên xeáp:
Ngöôøi ta thöôøng daønh moät phaàn cuûa boä nhôù ñeå taïo ngaên xeáp.
.STACK kích thöôùc
Kích thöôùc ñöôïc ñaët tuøy yù theo byte.
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 24 -
Ví duï:
.STACK 100h
Neáu chuùng ta khoâng ñaët kích thöôùc cho phaân ñoaïn naøy thì maëc nhieân phaân
ñoaïn ngaên xeáp seõ laáy kích thöôùc laø 1KByte
4. Phaân ñoaïn chöông trình
.CODE
teânchöôngtrình
"teânchöôngtrình" laø moät teân do laäp trình vieân ñaët cho chöông trình. Thöôøng teân
chöông trình coù theå khoâng caàn ñaët nhaát laø trong tröôøng hôïp loaïi nhôù laø SMALL.
Coù raát nhieàu phöông phaùp ñeå laäp chöông trình, tuy vaäy toát nhaát neân chia nhoû
chöông trình thaønh nhieàu chöông trình con (thuû tuïc)
Khi taïo moät thuû tuïc ngöôøi ta thöôøng söû duïng leänh giaû PROC ôû ñaàu cuûa thuû tuïc
vaø ENDP sau leânh cuoái cuûa thuû tuïc.
Daïng chung khi söû duïng caùc leänh giaû naøy laø:
teânthuûtuïc
PROC
;leänh
teânthuûtuïc
ENDP
Ví duï
.CODE
MAIN
PROC
; caùc leänh cuûa chöông trình chính
MAIN
ENDP
; nhöõng thuû tuïc khaùc
Toùm laïi:Ñeå vieát moät chöông trình chuùng ta coù theå coù caáu truùc ñôn giaûn chung
nhö sau
.MODEL SMALL
.STACK 100h
.DATA
;ñònh
nghóa
döõ
lieäu
.CODE
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 25 -
MAIN
PROC
;
leänh
MAIN
ENDP
; caùc thuû tuïc khaùc
END
MAIN
5. Caùc coâng cuï caàn thieát:
Coù raát nhieàu caùch ñeå maõ hoaù moät chöông trình hôïp ngöõ. Caùch ñaàu tieân laø maõ
hoaù tröïc tieáp caùc leänh trong boä nhôù baèng trình DEBUG. Caùch thöù hai laø maõ hoaù maõ
"nguoàn" trong moät taäp tin roài seõ dòch ñeå taïo ra moät chöông trình thöïc hieän ñöôïc.
Caùch naøy laø caùch maø ngöôøi ta thöôøng duøng nhaát vaø goàm caùc böôùc sau:
a- Chuaån bò laäp trình, taïo caáu truùc, xaùc laäp caùc pheùp tính,.. vaø xaùc ñònh löu ñoà
thuaät toaùn. Böôùc naøy chæ caàn vieát treân giaáy.
b- Vieát chöông trình baèng caùc leänh nhôø moät phaàn meàm soaïn thaûo vaên baûn
ASCII nhö EDLIN, Sidekick hoaëc moät phaàn meàm soaïn thaûo baát kyø mieãn sao ghi laïi
ñöôïc moät taäp tin theo maõ.
Taäp tin phaûi coù phaàn môû roäng laø ASM.
c- Dòch maõ nguoàn sang "maõ maùy" baèng caùc söû duïng trình dòch hôïp ngöõ
(MASM). Trong böôùc naøy thöôøng xuaát hieän caùc thoâng baùo loãi, trong tröôøng hôïp ñoù
phaûi söûa loãi roài laïi tieáp tuïc dòch cho ñeán khi khoâng coøn moät loãi naøo nöõa.
Sau böôùc naøy chuùng ta seõ thu nhaän ñöôïc moät taäp tin coù phaàn môû roäng laø OBJ
d- Ñeå taïo moät chöông trình thöïc hieän ñöôïc, chuùng ta söû duïng trình khaùc laø
LINK.EXE
Sau böôùc naøy chuùng ta seõ thu nhaän ñöôïc moät taäp tin coù phaàn môû roäng laø EXE
e- Kieåm tra laïi chöông trình coù thöïc hieän toát khoâng baèng caùch goõ phaàn teân taäp
tin vaø nhaán ENTER.
Meïo nhoû:
o
Chuùng ta coù theå vieát nhöõng chöông trình nhoû chaïy trong trình
DEBUG töøng leänh moät ñeå hieåu roõ caùch xöû lyù töøng leänh moät sau ñoù
coù theå gheùp laïi trong moät chöông trình lôùn hôn nhaèm taïo taäp tin
maõ nguoàn nhö neâu treân.
o
Chuùng ta coù theå thöïc hieän caùc böôùc treân tuaàn töï moät caùch töï ñoäng
neáu söû duïng taäp tin boù leänh vôùi phaàn môû roäng laø BAT
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 26 -
Cuõng caàn neân bieát raèng khi moät chöông trình thöôøng truù trong boä nhôù, DOS seõ
daønh 256 byte cho phaàn baét ñaàu PSP (Program Segment Prefix). PSP giöõ toaøn boä
caùc thoâng tin cuûa chöông trình. DS vaø ES giöõ ñòa chæ cuûa PSP tröôùc khi thöïc hieän
chöông trình. Nhö vaäy DS khoâng giöõ ñòa chæ cuûa phaân ñoaïn döõ lieäu. Ñeå giaûi quyeát
vaán ñeà naøy neáu coù söû duïng ñòa chæ phaân ñoaïn döõ lieäu ntrong chöông trình thì phaøi söû
duïng theâm 2 doøng leänh sau:
MOV
AX,@DATA
MOV
DS,AX
Ví du: Vieát moät chöông trình vôùi teân taäp tin laø CHAO.ASM duøng phaàn meàm
soaïn thaûo vaên baûn ASCII baát kyø
.MODEL SMALL
.DATA
MSG
DB
'Chao cac ban!$'
.STACK
100h
.CODE
MAIN
PROC
MOV
AX,@DATA
MOV
DS,AX
LEA
DX,MSG
MOV
AH,9
;Hieän
thoâng
baùo
INT
21h
MOV
AH,4Ch
;Döøngchöông
trình
INT
21h
MAIN
ENDP
END
MAIN
Sau khi ghi taäp tin vaøo ñóa, thöïc hieän caùc böôùc sau:
MASM
CHAO;
LINK
CHAO;
Sau ñoù ñeå thöïc hieän chöông trình, goõ CHAO ↵
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 27 -
CHÖÔNG 4: PHÖÔNG PHAÙP LAÄP TRÌNH
I. TOÅNG QUAN:
Laäp trình baèng hôïp ngöõ cuõng gioáng nhö raát nhieàu ngoân ngöõ laäp trình khaùc
khoâng khoù nhöng caàn phaûi toå chöùc toát. Thöôøng chuùng ta thaáy caùc chöông trình ñöa ra
thaät khoù ñoïc vaø khoâng tuaân theo luaät leä naøo caû, moãi laäp trình vieân laøm theo kieåu cuûa
hoï vaø keát quaû laø chöông trình chæ coù theå hieåu ñöôïc bôûi chæ chính taùc giaû cuûa noù maø
thoâi
Coù raát nhieàu phöông phaùp ñöôïc ñöa ra ngoõ haàu taïo ra moät soá qui taéc ñeå laäp
trình. Trong soá caùc phöông phaùp naøy, coù moät phöông phaùp baét chöôùc caùch laäp trình
baèng ngoân ngöõ caáp cao nhö C, Pascal trong ñoù coù nhieàu leänh CHUAÅN cho pheùp laäp
trình ñeán 90% vaán ñeà:
IF . . . THEN . . . ELSE
CASE . . . OF
FOR
WHILE . . .
REPEAT . . .
Coù theå thaáy raèng caùc leänh hôïp ngöõ coù chöùc naêng cuûa:
. IF laëp laïi nhôø nhaõn IF1, THEN1, ELSE1, ENDIF1; leänh IF tieáp theo nhôø IF2,
THEN2, ELSE2, ENDIF2,...;
. FOR seõ laëp laïi nhôø nhaõn FOR1.
II. CAÙC LEÄNH LIEÂN QUAN ÑEÁN REÕ NHAÙNH:
CMP ñích,
nguoàn
TEST ñích,
nguoàn
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 28 -
Leänh so saùnh CMP thöïc hieän gioáng pheùp tröø SUB nhöng keát quaû laïi khoâng giöõ
laïi, nghóa laø toaùn haïn nguoàn vaø ñích ñeàu khoâng bò aûnh höôûng. Nhöõng bit trong thanh
ghi traïng thaùi ñeàu bò taùc ñoäng nhö khi thöïc hieän pheùp tröø. Leänh naøy thöôøng ñöôïc söû
duïng ñeå tìm ra moái quan heä giöõa hai toaùn haïng (so saùnh).
Leänh TEST thöïc hieän gioáng pheùp VAØ logic (AND) nhöng keát quaû khoâng giöõ
laïi. Ñieàu naøy coù nghóa laø toaùn haïng ñích vaø nguoàn khoâng ñoåi chæ coù caùc bit trong
thanh ghi traïng thaùi seõ thay ñoåi. Chuùng chuû yeáu söû duïng ñeå xaùc ñònh laø 1 bit naøo ñoù
coù giaù trò laø 1 hoaëc laø 0 .
1. Caùc leänh reõ nhaùnh coù ñieàu kieän:
Nhöõng leänh reõ nhaùnh coù ñieàu kieän ñeàu thöïc hieän sau nhöõng leänh taùc ñoäng ñeán
thanh ghi traïng thaùi. Nhöõng leänh ñeán sau reõ nhaùnh seõ naèm trong khoaûng töø -128 ñeán
+127 byte tính töø leänh keá tieáp leänh reõ nhaùnh. Do vaäy ñeå môû roäng phaïm vi reõ nhaùnh
coù ñieàu kieän, chuùng ta coù theå keát hôïp vôùi leänh reõ nhaùnh khoâng ñieàu kieän.
Jcc
ñích
Nhöõng leänh reõ nhaùnh coù ñieàu kieän naøy luoân kieåm tra caùc bit trong thanh ghi
traïng thaùi ñaõ ñöôïc xaùc ñònh nhôø leänh tröôùc ñoù. Neáu ñieàu kieän ñuùng, böôùc nhaûy seõ
thöïc hieän ñeán ñòa chæ ñích. Trình dòch hôïp ngöõ seõ tính toaùn khoaûng caùch ñeán ñích ñeå
xaùc ñònh soá byte khoaûng caùch töø leänh keá tieáp sau reõ nhaùnh coù ñieàu kieän ñeán ñích.
Ñieàu kieän khoâng daáu
Ñieàu kieän
Moâ taû
Kieåm tra
A/NBE
Treân / Khoâng döôùi laãn baèng
CF ou ZF = 0
AE/NB
Treân hoaëc baèng/ Khoâng döôùi
CF=0
B/NAE
Döôùi / Khoâng treân laãn baèng
CF=1
BE/NA
Döôùi hoaëc baèng / Khoâng treân
CF ou ZF = 1
C
Nhôù baèng 1
CF=1
NC
Nhôù baèng 0
CF=0
P/PE Chaún
PF=1
NP/PO Leõ
PF=0
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 29 -
Ñieàu kieän coù daáu
Ñieàu kieän
Moâ taû
Kieåm tra
G/NLE
Lôùn hôn / khoâng nhoû hôn laãn baèng
((SF xor OF) or ZF)= 0
GE/NL
Lôùn hôn hoaëc baèng / khoâng nhoû hôn
(SF xor OF)=0
L/NGE
Nhoû hôn / khoâng lôùn hôn laãn baèng
(SF xor OF)=1
LE/NG
Nhoû hôn hoaëc baèng / Khoâng lôùn hôn
((SF xor OF) or ZF)= 1
O
Traøn baèng 1
OF=1
NO
Traøn baèng 0
OF=0
S Daáu
döông
SF=1
NS Daáu
aâm
SF=0
Ñieàu kieän zeùro
Ñieàu kieän
Moâ taû
Condition testeùe
E/Z
Baèng / zeùro
ZF = 1
NE/NZ
Khoâng baèng / Khoâng zeùro
ZF = 0
2. Caùc leänh reõ nhaùnh khoâng ñieàu kieän:
Ñoù laø nhöõng leänh nhaûy böôùc ñeán moät vò trí naøo ñoù trong chöông trình.
Leänh nhaûy khoâng ñieàu kieän coù daïng:
JMP
ñích
Leänh naøy coù theå nhaûy ñeán baát kyø moät vò trí naøo trong chöông trình.
III. CAÙC CAÁU TRUÙC ÑIEÀU KHIEÅN:
1- Löïa choïn
a. IF THEN
Ñieàu kieän
Leänh 1
Sai
Ñuùng
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 30 -
Neáu <ñieàu kieän> Thì <leänh 1>
Ví duï:
Neáu AX > 0 Thì AX -AX
Hôïp
ngöõ:
. . .
CMP
AX , 0
JNG
END_IF
NEG
AX
. . .
END_IF:
b. IF THEN ELSE
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Neáu <ñieàu kieän> Thì <Leänh 1>
Coøn laïi <leänh 2>
Leänh 2
Leänh 1
Ñuùng
ñieàu kieän
Sai
Ví duï: Neáu AL <= BL Thì hieän BL
Coøn
laïi
hieän
AL
Hôïp
ngöõ:
. . .
CMP
AL , BL
JNBE
EL_SE
MOV
DL , BL
JMP
HIEN
EL_SE:
MOV
DL,
AL
HIEN:
MOV
AH,2
Hôïp Ngöõ
- 31 -
INT
21h
. . .
END_IF:
c. CASE OF
Bieåu thöùc
choïn
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Leänh 1
Leänh 2
Leänh 3
Leänh n
. . .
Tröôøng hôïp
BX=1: AX <- 1
BX=2: AX <- 5
BX=3: AX <- 10
Coøn laïi
AX
<-
0
HetTruonghop
Hôïp ngöõ
Case1:
Case1C1:
CMP
BX,
1
JNZ
Case1C2
MOV
AX,
1
JMP
EndCase1
Case1C2:
CMP
BX,
2
JNZ
Case1C3
MOV
AX,
5
JMP
EndCase1
Case1C3:
CMP
BX,
3
JNZ
Other1
MOV
AX,
10
Hôïp Ngöõ
- 32 -
JMP
EndCase1
Other1:
MOV
AX,
0
ENDCase1:
d. Caùc ñieàu kieän phöùc:
Daïng:
ñieàu kieän 1 VAØ ñieàu kieän 2
ñieàu kieän 1 HOAËC ñieàu kieän 2
* Ñieàu kieän VAØ:
Ñieàu kieän phöùc (VA)Ø ñuùng chæ khi caû 2 ñieàu kieän ñeàu ñuùng. Ngöôïc laïi, neáu
moät trong caùc tröôøng hôïp laø sai thì ñieàu kieän phöùc (VAØ) laø sai.
Ví duï: Ñoïc moät kyù töï. Neáu laø chöõ caùi HOA thì seõ cho hieän leân.
Ñoïc moät kyù töï
Neáu ( kyù töï >='A' ) VAØ (kyù töï <= 'Z' )
Thì
Hieän kyù töï
HetNeu
Hôïp ngöõ
; ñoïc moät kyù töï
MOV
AH,
1
INT
21h
; Neáu ( 'A' <= kyù töï ) VAØ (kyù töï <= 'Z' )
CMP
AL,
'A'
JNAE
FSI
CMP
AL,
'Z'
JNBE
FSI
MOV
DL,AL
MOV
AH,2
INT
21h
HetNeu:
* Ñieàu kieän HOAËC
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 33 -
(Ñieàu kieän 1 HOAËC ñieàu kieän 2) laø ñuùng neáu ñieàu kieän 1 hoaëc ñieàu kieän 2
ñuùng. Ñieàu kieän phöùc seõ sai neáu caû hai ñieàu kieän ñeàu sai.
Ví duï: Ñoïc moät kyù töï. Neáu kyù töï laø 'C' hoaëc 'c', cho hieän kyù töï aáy. Coøn
khoâng thì döøng chöông trình.
Ñoïc moät kyù töï
Neáu (kyù töï='C') hoaëc (kyù töï='c')
Thì
hieän kyù töï
Coøn khoâng thì döøng chöông trình
Hôïp ngöõ:
; Ñoïc moät kyù töï
MOV
AH,1
INT
21h
; Neáu (kyù töï='C') hoaëc (kyù töï='c')
CMP
AL,
'C'
JE
THI
CMP
AL,
'c'
JE
THI
JMP
CONKHONG
THI:
MOV
AH,2
MOV
DL,AL
INT
21h
JMP
HET
CONKHONG:
MOV
AH,4Ch
INT
21h
HET:
2- Voøng laëp:
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 34 -
Hôïp ngöõ coù nhöõng leänh ñaëc bieät cho pheùp taïo caùc voøng laëp trong moät
chöông trình.
LOOP ñích
Leänh LOOP laøm giaûm noäi dung cuûa thanh ghi CX moät ñôn vò vaø nhaûy ñeán
ñòa chæ ñích neáu noäi dung CX khoâng baèng 0. Neáu thanh ghi CX baèng 0, voøng laëp
keát thuùc vaø leänh keá tieáp leänh LOOP seõ ñöôïc thöïc hieän. Ñòa chæ ñích caàn naèm trong
khoaûng -128 vaø 127 byte. Leänh naøy khoâng taùc ñoäng ñeán caùc bit cuûa thanh ghi
traïng thaùi
JCXZ ñích
Leänh JCXZ thöïc hieän nhaûy böôùc ñeán ñòa chæ ñích neáu thanh ghi CX baèng 0.
Leänh naøy thöôøng söû duïng ôû ñaàu moät voøng laëp.
a - Voøng laëp FOR:
Soá voøng laëp laø coá ñònh.
CHO soá ban ñaàu THÖÏC HIEÄN leänh
KEÁT THUÙC
Leänh thöïc hieän
Ñeám <- Ñeám -1
Ñeám=0?
Xaùc ñònh soá voøng laëp
Sai
Ñuùng
; Ñaët CX = soá voøng laëp
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 35 -
Dau:
;leänh
LOOP
Dau
Ví duï:
FOR 80 DO hieän '*'
Hôïp ngöõ
MOV
CX,80
MOV
AH,2
MOV
DL,'*'
Dau:
INT
21h
LOOP
Dau
b - Voøng laëp WHILE
Voøng laëp naøy thöïc hieän theo moät ñieàu kieän.
KHI ñieàu kieän THÖÏC HIEÄN
leänh
KEÁT THUÙC
Ñieàu kieän
leänh
Ñuùng
Sai
Ví duï:
BX <-- 5
Khi BX>0 thöïc hieän BX <-- BX -1
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 36 -
Keát
thuùc
Hôïp ngöõ
MOV
BX,
5
While1:
CMP
BX,0
JLE
EndWhile1
DEC
BX
JMP
While1
EndWhile1:
c - Voøng laëp REPEAT... UNTIL
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Ví duï:
BX <-- 10
leänh
Ñieàu kieän
Sai
Ñuùng
Laëp
laïi
BX < BX-1
Ñeán khi BX <= 0
Hôïp ngöõ
MOV
BX,10
Repeat1:
DEC
BX
CMP
BX,
0
JNLE
Repeat1
EndRepeat1:
Hôïp Ngöõ
- 37 -
Thöïc hieän laäp trình theo trình töï nhö treân ñoøi hoûi moät söï caàn maãn naøo ñoù
nhöng laïi giuùp laäp trình vieân thaáy ñöôïc moïi thöù raát roõ raøng. Chính vì vaäy vieäc laäp
trình trôû neân ñôn giaûn hôn raát nhieàu. Moãi laäp trình vieân coù theå coù moät phöông
phaùp laäp trình song caàn neân bieát raèng neáu chuùng ta laøm vieäc theo nhoùm hoaëc moät
chöông trình ñöôc phaân thaønh nhieàu moñun thì vieäc tuaân theo nhöõng qui öôùc laø
cöïc kyø caàn thieát: ví duï nhö taát caû caùc nhaõn ñaët ra phaûi gôïi nhôù vaø tuaân theo qui
öôùc giuùp cho nhöõng ngöôøi khaùc deã hieåu vaø söû duïng vieát caùc moñun chung.
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 38 -
CHÖÔNG 5: NGAÊN XEÁP VAØ THUÛ TUÏC
I. NGAÊN XEÁP:
Ngaên xeáp laø nôi löu tröõ döõ lieäu töùc thôøi trong boä nhôù. Dung löôïng boä nhôù
daønh cho ngaên xeáp ñöôïc laäp trình vieân ñaët ra trong chöông trình nguoàn.
Nguyeân taéc hoaït ñoäng cuûa ngaên xeáp laø döõ lieäu vaøo sau thì ra tröôùc goïi laø
ngaên xeáp LIFO (Last In, First Out). Döõ lieäu ñöa vaøo trong ngaên xeáp choàng leân
nhau do vaäy ngöôøi ta coøn goïi laø xeáp choàng vaø thanh ghi SP (Stack pointer) ñöôïc
söû duïng nhö con troû ngaên xeáp xaùc ñònh vò trí cuoái trong ngaên.
Ngaên xeáp löu giöõ noäi dung caùc thanh ghi hoaëc caùc bieán.
Leänh ñeå ñöa döõ lieäu vaøo ngaên xeáp laø:
PUSH nguoàn
Leänh PUSH giaûm giaù trò cuûa thanh ghi xuoáng 2 ñôn vò neáu nguoàn laø thanh
ghi 16 bit vaø luùc aáy vò trí ñænh cuûa ngaên xeáp seõ ghi trong con troû ngaên xeáp SP.
Leänh ñeå laáy döõ lieäu ra khoûi ngaên xeáp laø:
POP ñích
Leänh POP traû laïi noäi dung löu giöõ trong ngaên xeáp cho caùc thanh ghi. Noäi
dung thanh ghi SP taêng leân 2 ñôn vò neáu thanh ghi nhaän döõ lieäu 16 bit.
II. THUÛ TUÏC:
Caùc thuû tuïc (hoaëc chöông trình con) bao goàm moät daõy caùc doøng leänh noái
tieáp nhau ñeå thöïc hieän moät coâng vieäc ñaõ xaùc ñònh. Coâng vieäc naøy coù theå ñöôïc goïi
ñeán nhieàu laàn trong moät chöông trình. Thay vì cöù vieát laäp laïi ñoaïn leänh naøy trong
chöông trình, laäp trình vieân ñaët taát caû caùc doøng leänh naøy vaøo moät khoái goïi laø thuû
tuïc. Sau ñoù khi caàn laäp trình vieân cöù goïi thuû tuïc naøy baát cöù luùc naøo tuøy thích.
Caùc thuû tuïc ñöôïc chia ra laøm hai loaïi:
- Caùc thuû tuïc NEAR ñöôïc khai baùo trong cuøng phaân ñoaïn maõ cuûa chöông
trình goïi. Ñòa chæ trôû veà ghi trong ngaên xeáp chæ laø IP (maõ 16 bit).
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 39 -
- Caùc thuû tuïc FAR söû duïng phaân ñoaïn maõ khaùc vôùi phaân ñoaïn maõ cuûa
chöông trình goïi. Ñòa chæ trôû veà ghi trong ngaên xeáp laø CS vaø IP (maõ 16 bit)
Caùc thuû tuïc ñöôïc goïi baèng leänh CALL. Leänh naøy giöõ ñòa chæ trôû veà cuûa
chöông trình trong ngaên xeáp vaø giaûm giaù trò con troû ngaên xeáp 2 ñôn vò neáu thuû tuïc
laø NEAR. Sau ñoù nhaûy böôùc ñeán vò trí ñaõ xaùc ñònh. Con troû ngaên xeáp seõ giaûm 4
neáu thuû tuïc laø FAR.
Moät thuû tuïc ñöôïc söû duïng vôùi caùc ñònh höôùng bieân dòch PROC...ENDP. Ñeå
coù theå trôû veà chöông trình chính, cuoái moãi thuû tuïc caàn coù theâm leänh RET. Ñieàu
naøy giuùp laáy laïi ñòa chæ ñaõ ghi vaøo trong ngaên xeáp vaø taêng giaù trò con troû ngaên xeáp
leân 2 neáu thuû tuïc laø NEAR vaø leân 4 neáu thuû tuïc laø FAR.
Caáu truùc chung cuûa moät thuû tuïc nhö sau:
Teân
PROC
NEAR (hoaëc FAR)
;
; thaân thuû tuïc
;
;
RET
Teân ENDP
Chöông trình chính
thuû tuïc
TEMPO
PROC
CALL TEMPO
CALL TEMPO
RET
TEMPO
ENDP
Goïi thuû tuïc
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 40 -
III. SÖÛ DUÏNG PTR VAØ LABEL:
a- Neáu moät ñòa chæ ví duï [BX] xuaát hieän nhö moät soá haïng, 8088 phaûi bieát
choïn xöû lyù 1 hoaëc 2 byte taïi ñòa chæ ñoù, ñeå cho roõ raøng caàn phaûi duøng BYTE PTR
hoaëc WORD PTR
Ví duï 1:
MOV
[BX],1
nghóa
laø
MOV
BYTE
PTR
[BX],
1
hoaëc
MOV
WORD
PTR
[BX],
1
Ví duï 2:
.DATA
....
DOLLARS
DB
1Ah
CENTS
DB
52h
....
.CODE
...
MOV
AX,WORD
PTR
DOLLARS
; naïp 521A ---> AX
b- Ngöôøi ta coøn söû duïng ñònh höôùng bieân dòch LABEL ñeå ñònh nghóa laïi moät
bieán theo loaïi khaùc
Daïng: teân
LABEL
loaïi
Ví duï 1:
WORD_ARR
LABEL
WORD
BYTE_ARR
DB
100
DUP
(0)
WORD_ARR ñònh nghóa moät maûng 50 töø vaø BYTE_ARR ñònh nghóa moät
maûng 100 byte.
Ví duï 2:
.DATA
...
MONEY
LABEL
WORD
DOLLARS
DB
1Ah
CENTS
DB
52h
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 41 -
...
.CODE
...
MOV
AX,
MONEY
Ñieàu naøy gioáng nhö
MOV
AL,
DOLLARS
MOV
AH,CENTS
IV. VAØI CHÖÔNG TRÌNH ÖÙNG DUÏNG:
1. Hieän soá thaäp phaân:
Ñeå hieän moät soá leân maøn hình chuùng ta caàn phaûi taïo moät thuû tuïc. Ñeå laøm
vieäc naøy chuùng ta caàn phaûi phaân tích soá sau ñoù hieän tuaàn töï töøng chöõ soá moät. Do
ñoù chuùng ta caàn coù 2 thuû tuïc:
Hieän moät chöõ soá;
Hieän moät soá.
a- Hieän moät chöõ soá:
Haøm 2 ngaét 21h duøng ñeå hieän moät kyù töï leân maøn hình trong ñoù maõ ASCII
cuûa kyù töï ñöôïc ñöa vaøo DL, ví vaäy chuùng ta caàn chuyeån chöõ soá sang maõ ASCII
baèng caùch coâng theâm vaøo soá 48:
Maõ ASCII
Kyù töï
48
(30h)
0
49
(31h)
1
50
(32h)
2
...
Hienchuso PROC
PUSH
AX
;giöõAX
PUSH
DX
ADD
AL, 48 ;Chöõ soá 0...9
MOV
DL,
AL
MOV
AH, 2 ;Hieän kyù töï
INT
21h
POP
DX
POP
AX
RET
Hienchuso ENDP
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 42 -
b- Hieän soá:
Baây giôø chuùng ta phaân tích soá cho hieän. Chuùng ta söû duïng pheùp chia cho 10,
ñaët soá bò chia vaøo AX (neáu nhö soá naøy töông öùng vôùi moät töø). Thöông soá seõ naèm
trong AL vaø soá dö trong AH. Neáu chia 1 soá laø töø ñoâi (double word) chuùng ta ñaët
soá ñoù trong DX:AX vaø nhö vaäy thöông soá seõ ñaët trong AX vaø soá dö trong DX.
Nhö vaäy,
8765 DIV
10 = 876
dö 5
876 DIV
10 = 87 dö 6
87 DIV
10 = 8 dö 7
8
DIV
10 = 0 dö 8
Chuùng ta thaáy caùc soá dö laø nhöõng chöõ soá taïo thaønh keát quaû baèng soá tuy vaäy
chuùng ta khoâng theå cho hieän caùc soá dö ngay sau khi chia vì nhö vaäy seõ ñaûo soá
(5678), chuùng ta caàn phaûi naïp caùc chöõ soá tuaàn töï vaøo ngaên xeáp sau ñoù laáy ra vaø
cho hieän leân maøn hình thì môùi ñaùp öùng ñöôïc yeâu caàu.
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 43 -
HienSoTP PROC
PUSH BX
PUSH CX
MOV
BX, 10
; soá chia
;
taùch soá vaø ñaët nhöõng chöõ soá theo thöù töï phuø hôïp trong ngaên xeáp
MOV
CX,0
Tach:
MOV
DX,0
DIV
BX
PUSH DX
INC
CX
CMP
AX,
0
JNZ
Tach
Hienlen:
POP
AX
CALL Hienchuso
LOOP Hienlen
POP CX
POP BX
RET
HienSoTP ENDP
c- Caùc soá aâm:
Thuû tuïc treân khoâng duøng ñeå hieän caùc soá coù daáu. Neân nhôù raèng
neáu moät soá coù daáu thì bit lôùn nhaát laø bit daáu, caàn phaûi kieåm tra xem
neáu soá laø soá aâm thì phaûi theâm daáu '-' ñoàng thôøi phaûi tính buø 2 cho soá
ñoù
HienAscii PROC
PUSH AX
PUSH DX
MOV DL,AL
MOV AH,
2
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 44 -
INT
21h
POP DX
POP AX
RET
HienAscii ENDP
Ñeå kieåm tra xem moät soá aâm chuùng ta coù theå coäng theâm soá 0 roài
kieåm tra bit chæ baùo SF ñeå bieát daáu cuûa keát quaû:
HienDauTP PROC
PUSH AX
PUSHF
ADD AX,
0
JNS Khongdau
PUSH AX
MOV AL,'-'
CALL HienAscii
POP AX
NEG AX
Khongdau:
CALL HienSoTP
POPF
POP AX
RET
HienDauTP ENDP
2. Hieän soá nhò phaân vaø thaäp luïc phaân
a- Hieän soá nhò phaân:
Trong moät soá tröôøng hôïp, chuùng ta laïi muoán bieåu dieãn moät soá nhò
phaân. Chuùng ta phaûi laáy töøng bit ra sau ñoù cho hieän leân maøn hình.
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 45 -
HienNP PROC
PUSHF
PUSH BX
PUSH CX
MOV
BL,AL
MOV
CX,8
Hienbit:
RCL
BL,1
MOV
AL,0
ADC
AL,30h
CALL
HienAscii
LOOP
Hienbit
POP
CX
POP
BX
POPF
RET
HienNP ENDP
b- Hieän Thaäp Luïc Phaân
Nhöõng chöõ soá thaäp luïc phaân thöôøng ñöôïc söû duïng trong caùc
chöông trình hôïp ngöõ, trong thöïc teá ñoâi khi caàn thieát phaûi hieän soá döôùi
daïng naøy.
HienTLP PROC
PUSH
CX
PUSH
DX
MOV
DH,DL ; DL laø moät kyù töï
MOV
CX,4
SHR
DL,CL
CALL
HienChusoTLP
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 46 -
MOV
DL,DH
AND
DL,0FH
CALL
HienChuSoTLP
POP
DX
POP
CX
RET
HienTLP ENDP
HienChuSoTLP PROC
PUSH
DX
CMP
DL,10
JAE
ChuSoTLP
ADD
DL,'0'
JMP
HienChuSo
ChuSoTLP:
ADD
DL,'A'-10
HienChuSo:
MOV
AL,
DL
CALL
HienAscii
POP
DX
RET
HienChuSoTLP ENDP
3. Ñoïc töø baøn phím
a- Ñoïc moät chuoãi kyù töï:
Ñeå ñoïc moät chuoãi kyù töï, chuùng ta goïi ngaét 21h, dòch vuï 0Ah cho
pheùp ñaët caùc kyù töï goõ treân baøn phím vaøo vuøng ñeäm DS:DX (buffer).
Haøm naøy keát thuùc khi nhaán RETURN, trong vuøng ñeäm goàm caùc thoâng
tin sau:
Byte Noäi
dung
0
Giaù trò qui ñònh soá toái ña caùc kyù töï coù theå ñoïc, giaù
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 47 -
trò naøy phaûi ñöôïc ñaët tröôùc khi goïi haøm
1
Soá kyù töï thöïc teá ñoïc vaøo (Khoâng tính RETURN),
giaù trò naøy ñöôïc ñaët khi haøm thöïc hieän.
2
Töø vò trí naøy chuùng ta thaáy caùc kyù töï ñoïc vaøo.
Phaûi ñònh nghóa moät vuøng döõ lieäu (vuøng ñeäm) trong chöông trình
ñeåõ giöõ caùc kyù töï.
DocChuoi PROC
PUSH
BX
PUSH
CX
MOV
BX,DX ;
Offset cuûa vuøng ñeäm
PUSH [BX];
giöõ 2byteñaàu cuûa vuøngñeäm
MOV
[BX],
AL
MOV
AH,
0Ah
INT
21h
MOV
AL,[BX+1]
POP
CX
MOV
[BX],CH
POP
CX
POP
BX
RET
DocChuoi ENDP
Neáu chuùng ta taïo ra moät chöông trình nhoû:
.MODEL SMALL
.STACK 100h
.DATA
VungDem DB 255 DUP (?) ; Vuøng giöõ kyù töï ñoïc
Thongbao DB 'Kyù töï ñoïc ', 13,10, '$'
.CODE
Main
PROC
MOV
AX,@Data
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 48 -
MOV DS,
AX
MOV
DX, OFFSET VungDem
MOV
AL, 5 ; Ñoïc toái ña 5 kyù töï
CALL DocChuoi
MOV AH,0
CALL HienSoTP
MOV
DX, Offset Thongbao
CALL
Hienchuoi
MOV
AH,4Ch
INT
21h
Main
ENDP
Hienchuoi PROC
PUSH
AX
MOV
AH,
09h
INT
21h
POP
AX
RET
Hienchuoi ENDP
....
END
MAIN
Baây giôø, chuùng ta thöïc hieän chöông trình, neáu chuùng ta goõ vaøo
treân 5 kyù töï, ngaét 21h gaây ra 1 tieáng BÍP; chuùng ta coù theå söû duïng
phím BACKSPACE ñeå xoaù 1 kyù töï trong quaù trình goõù.
b- Ñoïc moät soá thaäp phaân
Ñeå ñoïc moät soá thaäp phaân, chuùng ta seõ söû duïng thuû tuïc
Docchuoi vaø sau ñoù chuyeån chuoãi thaønh soá.
NB
Soá <-- 0
Laëp Chöõ soá <-- 1 kyù töï cuûa chuoãi
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 49 -
Soá <-- Soá * 10 + chöõ soá
NB <-- NB-1
Neáu NB > 0 ñeán Laëp
Ví duï, ñeå chuyeån '827', ta coù
Soá <--0
Chöõ soá <-- 8
Soá
<-- Soá *10 + chöõ soá = 0*10 +8 = 8
Chöõ soá <-- 2
Soá
<-- Soá * 10 + chöõ soá = 8*10 +2 = 82
Chöõ soá <-- 7
Soá
<-- Soá * 10 + chöõ soá = 82*10 +7 = 827
Giatri PROC
PUSH BX
PUSH
CX
PUSH
DX
PUSH
SI
MOV
AX,0
MOV BX,DX
;
Bx chæ ñeán ñaàu vuøng ñeäm
MOV
CX,[DX+1]
MOV
SI,
2
Laplai:
MOV
DX,10
MUL
DX
MOV
DL,
[BX+SI]
INC
SI
SUB
DL,48
MOV
DH,0
ADD
AX,
DX
LOOP
Laplai
POP
SI
POP
DX
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 50 -
POP
CX
POP
BX
RET
Giatri ENDP
Chuù yù: thuû tuïc treân khoâng kieåm tra xem daõy kyù töï coù trong
vuøng ñeäm coù ñuùng nhö yeâu caàu khoâng? nghóa laø taát caû ñeàu laø chöõ soá
coù giaù trò töø 0 ñeán 9. Ngoaøi ra trong thuû tuïc naøy cuõng khoâng giaûi
quyeát ñöôïc xem giaù trò cuûa soá coù vöôït quaù 65.535: caàn phaûi kieåm
tra xem pheùp nhaân cuoái cuøng coù taïo ra nhôù khoâng? nghóa laø DX coù
giaù trò khaùc 0 )
DocSoTP PROC
PUSH DX
MOV
AL,
5
MOV
DX,
Offset
temp1
CALL DocChuoi
CALL Giatri
POP
DX
RET
DocSoTP ENDP
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 51 -
CHÖÔNG 6: MOÑUN CHÖÔNG TRÌNH &
CAÙC KIEÅU ÑÒNH VÒ ÑÒA CHÆ
I. MOÑUN CHÖÔNG TRÌNH
Ñoái vôùi caùc chöông trình lôùn vôùi raát nhieàu thuû tuïc thì thaät tieän
lôïi neáu chuùng ta ñaët caùc thuû tuïc trong caùc file rieâng bieät. Coù 2
nguyeân nhaân chuû yeáu ñeå laøm ñieàu ñoù:
. Caùc thuû tuïc coù theå ñöôïc vieát, hôïp dòch vaø kieåm tra rieâng bieät
baèng caùc laäp trình vieân khaùc nhau
. Khi caùc thuû tuïc ñöôïc hôïp dòch taùch bieät, chuùng coù theå söû duïng
laïi caùc teân cho caùc bieán hay caùc nhaõn leänh. Sôõ dó coù ñöôïc ñieàu ñoù laø
vì trình bieân dòch cho pheùp caùc teân mang tính chaát cuïc boä ñoái vôùi
moãi file vaø noù seõ khoâng xung ñoät ñoái vôùi caùc teân gioáng nhö vaäy
trong moät file khaùc.
1. Ñònh höôùng bieân dòch extrn
Trong khi bieân dòch moät moñun, trình bieân dòch phaûi ñöôïc
thoâng baùo nhöõng teân ñöôïc duøng trong moñun hieän thôøi nhöng ñaõ
khai baùo trong caùc mod8un khaùc, neáu khoâng chuùng seõ bò coi laø caùc
teân chöa khai baùo.
EXTRN teân:loaïi [,teân:loaïi]
baùo cho trình dòch hôïp ngöõ coù moät teân ngoaïi truù nghóa laø coù
moät teân ñaõ ñònh nghóa trong moät moñun khaùc. Loaïi töông öùng phaûi
gioáng nhö loaïi ñaõ ñònh nghóa trong moñun khaùc. Nhöõng loaïi naøy laø:
NEAR, FAR, PROC, BYTE, WORD...
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 52 -
2. Ñònh höôùng bieân dòch public
Moät thuû tuïc hay bieán phaûi ñöôïc khai baùo vôùi ñònh höôùng bieân
dòch PUBLIC neáu noù ñöôïc söû duïng trong caùc moñun khaùc nhau
PUBLIC teân[, teân]
ÔÛ ñaây 'teân' laø moät bieán, moät nhaõn trong moñun giöõ ñònh höôùng
bieân dòch PUBLIC
ÖÙng duïngï:
Taïo moät chöông trình goàm 2 thuû tuïc ñeå noái chuoãi, moãi thuû tuïc
naèm trong 1 taäp tin khaùc nhau.
Taäp tin thöù 1 coù teân MAIN.ASM
Noäi dung laø
EXTRN NoiChuoi:NEAR
public ChuoiCuoi
.MODEL SMALL
.STACK 200H
.DATA
Chuoi1 DB 'Chao ',0
Chuoi2 DB 'cac ban ',0dh,0ah,'$',0
Chuoicuoi DB 50 DUP (?)
.CODE
ProgramStart PROC
mov ax,@data
mov ds,ax
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 53 -
mov ax,OFFSET Chuoi1
mov bx,OFFSET Chuoi2
call NoiChuoi
; Noái 2 chuoãi laïi vôùi nhau
mov ah,9
mov dx,OFFSET ChuoiCuoi
int 21h
; Hieän chuoãi
mov ah,4ch
int 21h
ProgramStart ENDP
END ProgramStart
Taäp tin thöù 2 coù teân SUB.ASM coù noäi dung laø
EXTRN ChuoiCuoi:byte
PUBLIC NoiChuoi
.MODEL SMALL
.CODE
NoiChuoi PROC
cld ; Chuoãi taêng daàn
mov di,SEG ChuoiCuoi
mov es,di
mov di,OFFSET ChuoiCuoi ;ES:DI chæ ñeán ñích
mov si,ax ; Chuoãi ñaàu ñöôïc cheùp ñi
LapChuoi1:
lodsb ; nhaän trong chuoãi 1 kyù töï
and al,al ; baèng 0?
jz Chuoitiep ;ñuùng thì chuyeån sang chuoåi tieáp
stosb ; löu 1 kyù töï vaøo chuoãi
jmp LapChuoi1
Chuoitiep:
mov si,bx ; Cheùp chuoãi thöù hai
LapChuoi2:
lodsb ; laáy 1 kyù töï töø chuoãi 2
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 54 -
stosb ; giöõ kyù töï cuûa chuoãi 2 vaøo
; (keå caû soá 0 neáu coù)
and al,al ; baèng 0?
jnz LapChuoi2 ; khoâng, naïp kyù töï khaùc
ret ; xong
NoiChuoi ENDP
END
3. Laäp thö vieän - taïo vó leänh (macro)
Thay vì lieân keát caùc moñun ñoái töôïng rieâng bieät ñeå taïo thaønh
moät file .EXE , chuùng ta coù theå taïo ra moät file thö vieän cuûa caùc
moñun ñoái töôïng chöùa thuû tuïc. Khi thö vieän ñöôïc xaùc ñònh trong
quaù trình lieân keát, chöông trình LINK laáy ra baát kyø thuû tuïc naøo maø
chöông trình caàn thö vieän vaø taïo ra file EXE.
Chuùng ta coù daïng
Teân MACRO {thoâng soá [ ,thoâng soá] }
Leänh
ENDM
Taïo taäp tin vaên baûn ASCII laø thö vieän
Ví duï:
THUVIEN.MAC
Thoat MACRO
MOV
AH,4Ch
INT
21h
ENDM
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 55 -
HienCh MACRO Chuoi1
MOV
AH,9
LEA
DX,
Chuoi1
INT
21h
ENDM
Dockt MACRO
MOV
AH,1
INT
21h
ENDM
HienKt MACRO
MOV
AH,2
INT
21H
ENDM
ÖÙng duïng: Hieän soá nhò phaân
EXTRN HienSoNP: NEAR
.MODEL SMALL
.STACK 100H
.DATA
Thongbao1 DB 'Nhaäp vaøo moät kyù töï: $'
Thongbao2 DB 'Maõ ASCII soá nhò phaân: $'
.CODE
INCLUDE THUVIEN.MAC
Batdau PROC
MOV
AX,
@Data
MOV
DS,
AX
HienCh Thongbao1
DocKt
HienCh Thongbao2
Call
HienSoNP
Thoat
Batdau ENDP
END
Batdau
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 56 -
II. CAÙC KIEÅU ÑÒNH VÒ ÑÒA CHÆ
Chuùng ta ñaõ bieát, moãi leänh ñeàu coù 2 phaàn chính:
Phaàn pheùp toaùn thöïc hieän (coäng, tröø, dòch chuyeån,...)
Phaàn döõ lieäu lieân quan. Caùc döõ lieäu naøy naèm trong caùc thanh
ghi hoaëc trong boä nhôù.
Ñeå laáy döõ lieäu trong boä nhôù, boä vi xöû lyù phaûi bieát ñòa chæ vaø soá
byte duøng cho noù.
Sau ñaây laø caùc loaïi ñònh vò ñòa chæ khaùc nhau:
1. Kieåu ñònh vò ñòa chæ töùc thôøi
Thanh ghi <--- Giaù trò töùc thôøi
Moät giaù trò töùc thôøi (coù theå laø moät haèng) seõ ñöa vaøo noäi dung
cuûa thanh ghi
Ví duï: MOV AH,12
1- Kieåu ñònh vò ñòa chæ tröïc tieáp:
Thanh ghi <-- boä nhôù(ñòa chæ tröïc tieáp)
Noäi dung cuûa moät vuøng nhôù ñöôïc ñaët teân seõ ghi vaøo trong
thanh ghi 8 bit hoaëc 16 bit phuï thuoäc vaøo loaïi döõ lieäu vaø kích thöôùc
thanh ghi, neáu 2 yeáu toá naøy khoâng baèng nhau thì trình dòch hôïp ngöõ
seõ baùo loãi.
Ví duï:
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 57 -
Id1 DB 2 ; 1 byte
Id2 DW 5
; 1 word = 2 byte
......
MOV
AH,Id1
MOV
BX,Id2
3. Kieåu ñònh vò ñòa chæ neàn:
Thanh ghi <-- [BX] ñòa chæ neàn döïa treân DS
Laáy noäi dung trong vuøng boä nhôù ñòa chæ DS:[BX] ñöa vaøo
trong thanh ghi. Trong tröôøng hôïp naøy [BX] cho bieát laø laáy noäi dung
cuûa oâ nhôù coù phaàn offset cuûa ñòa chæ laø . Coù theå thöïc hieän vôùi 8 hoaëc
16 bit.
Ví
duï:
MOV
BX,8
MOV
AX,
[BX]
AX <-- noäi dung cuûa vuøng nhôù coù ñòa chæ laø DS:0008
4. Kieåu ñònh vò ñòa chæ chæ soáù:
Thanh ghi <-- [SI] hoaëc [DI] ñòa chæ chæ soá
Kieåu ñònh vò ñòa chæ naøy thöôøng duøng cho chuoãi kyù töï hay caùc
phaàn töû cuûa maõng. Thöôøng neàn laø DS.
Ví
duï:
MOV
SI,
0
MOV
AX,
[SI]
AX <-- noäi dung cuûa vuøng boä nhôù ôû ñòa chæ DS:0
5- Kieåu ñònh vò ñòa chæ neàn-chæ soá:
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 58 -
Thanh ghi <-- [BX][SI] ñòa chæ neàn-chæ soá döïa treân
DS
Thanh ghi <-- [BX][DI] ñòa chæ neàn-chæ soá döïa treân DS
Loaïi ñòa chæ naøy söû duïng BX vaø, SI hoaëc DI, neàn laø DS
Ghi chuù: ngöôøi ta coù theå duøng qui öôùc sau:
Thanh
ghi
<-- [BX+SI]
Ví
duï:
MOV
BX,
2
MOV
SI,
5
MOV
AH,
[BX]
[SI]
AH <-- noäi dung cuûa oâ nhôù coù ñòa chæ laø DS:7 nghóa laø DS:5+2
6- Kieåu ñònh vò ñòa chæ neàn-dòch chuyeån:
Thanh ghi <-- döõ lieäu[BX] ñòa chæ neàn döïa treân DS
Thanh ghi <-- döõ lieäu[BX] ñòa chæ neàn döïa treân SS
Loaïi ñònh vò ñòa chæ naøy laø toå hôïp cuûa caùc loaïi treân.
Ghi chuù: Coù theå söû duïng qui öôùc sau:
Thanh ghi <-- [BX+döõ lieäu]
Ví duï:
Id1
DW
5
DUP
(?)
....
MOV
BX,2
MOV
AX,
Id1[BX]
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 59 -
AX <-- phaàn töû thöù 3 cuûa maûng Id1
7. Ñònh vò ñòa chæ chæ soá-dòch chuyeån:
Thanh ghi <-- döõ lieäu[SI]
Thanh ghi <-- döõ lieäu[DI]
Loaïi ñònh vò naøy laø toå hôïp cuûa caùc loaïi treân.
Ghi chuù: Chuùng ta coù theå söû duïng qui öôùc sau:
Thanh ghi <-- [SI+döõ lieäu]
Ví
duï:
.....
MOV
SI,4
MOV
AX,
[SI+1]
AX <-- noäi dung cuûa vuøng nhôù taïi ñòa chæ DS:4+1
8- Kieåu ñònh vò ñòa chæ neàn-chæ soá-dòch chuyeån
Thanh ghi <-- döõ lieäu[BX][SI]
Thanh ghi <-- döõ lieäu[BX][DI]
Thanh ghi <-- döõ lieäu[BP][SI]
Thanh ghi <-- döõ lieäu[BP][DI]
Loaïi ñònh vò naøy laø toå hôïp cuûa caùc loaïi treân.
Ghi chuù: Coù theå söû duïng kyù hieäu sau:
Thanh ghi <-- [BX+SI+döõ lieäu]
Ví duï:
Id1 DB 15 DUP(?)
.....
MOV
BX,5
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 60 -
MOV
SI,4
MOV
AX,
Id1[BX][SI]
AX <-- phaàn töû thöù 9 cuûa maûng Id1
III. CHÖÔNG TRÌNH ÖÙNG DUÏNG
TAÄP TIN - THÖ MUÏC
Chuùng ta tham khaûo moät soá thuû tuïc lieân quan ñeán caùc taäp tin
baèng caùc goïi ngaét 21h:
Taïo moät taäp tin;
Môû moät taäp tin;
Ñoùng moät taäp tin;
Ñoïc moät taäp tin;
Vieát vaøo moät taäp tin....
a - Caàn bieát:
. Moät soá thuû tuïc söû duïng moät töø ñeå maõ hoaù thuoäc tính cuûa taäp
tin. Caùc bit cuûa töø naøy coù yù nghóa nhö sau:
Bit
YÙ
nghóa
0
Chæ
ñoïc
1
AÅn
2
Heä
thoáng
5
Löu
. Moät soá thuû tuïc söû duïng theû (handle), ñoù laø moät soá do heä ñieàu
haønh MSDOS gaùn cho moät taäp tin khi môû hoaëc taïo taäp tin, con soá
naøy seõ caàn thieát trong quaù trình ñoïc, vieát, ñoùng .v.v... taäp tin.
Handle DW ?
Chuù yù: neáu moät chöông trình xöû lyù nhieàu taäp tin thì phaûi coù
nhieàu theû, moãi theû öùng vôùi moãi taäp tin.
b - Taïo, môû, ñoùng taäp tin ñeå coù theå ghi noâi dung vaøo taäp tin.
.MODEL SMALL
.STACK 100H
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 61 -
.DATA
TBAO1 DB 'Ñöa noâi dung vaên baûn vaøo: ',13,10,'$'
NOIDUNG DB 10000 DUP(?)
TENTT DB 'A:\THUCTAP.TXT',0
SO
DW ?
LFCR DB 13,10,'$'
.CODE
INCLUDE THUVIEN.MAC
MAIN PROC
PRODATA
HIENCH
TBAO1
XOR
BX,BX
MOV
AH,1 ;
LAP1:
INT
21H
;
CMP
AL,1AH ; CTRL+Z
JE
CONT
MOV NOIDUNG[BX],AL
CMP AL,13
;
ENTER
JNE
NHAY1
MOV NOIDUNG[BX],0Dh
INC
BX
MOV
NOIDUNG[BX],0Ah
LEA DX,LFCR
MOV AH,9
INT
21H
MOV AH,1
NHAY1:
INC
BX
JMP LAP1
TIEP: MOV
SO,BX
MOV
AH,3CH ;
LEA
DX,TENTT ; TAO MOT TAP TIN
MOV
CX,20H ; THUOÄC TI'NH
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 62 -
INT
21H ;
MOV BX,AX
LEA
DX,TENTT ;
MOV
AL,1 ;
MOV
AH,3DH ; MÔÛ TAÄP TIN
INT
21H ;
PUSH AX
;
GHI THEÛ ÑEÅ SÖÛ DUÏNG SAU NAØY
MOV
BX,AX
MOV
AH,40H ; GHI VAØO TAÄP TIN
LEA
DX,NOIDUNG; ÑEÄM
MOV
CX,SO ;SOÁ BYTE ÑOÏC
INT
21H ;
POP
BX ;
MOV
AH,3EH ;ÑOÙNG TAÄP TIN
INT
21H
THOAT
MAIN ENDP
END MAIN
c- Ñoïc noäi dung taäp tin
EXTRN WRITE_HEX:NEAR
.MODEL SMALL
.STACK 100H
.DATA
NOIDUNG
DB 10000 DUP(?)
TENTT
DB 50 DUP (?)
CAUHOI
DB 'NHAP DUONG DAÃN: '
LFCR
DB 10,13,'$'
.CODE
INCLUDE THUVIEN.MAC
MAIN PROC
PRODATA
HIENCH
CAUHOI
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 63 -
XOR
BX,BX
MOV
AH,1
LAP1:
INT
21H
MOV
TENTT[BX],AL
INC
BX
CMP
AL,13
JNE
LAP1
DEC
BX
MOV
TENTT[BX],'0'
HIENCH LFCR
LEA
DX,TENTT
MOV
AL,2
MOV
AH,3DH ; THEÛ
INT
21H ;
PUSH
AX ; LÖU THEÛ
MOV
BX,AX
; DÒCH VUÏ 3F : BX <-- THEÛ
MOV
AH,3FH ; ÑOÏC TAÄP TIN
LEA
DX,NOIDUNG;
MOV
CX,0FFFFH ; SO BYTE
INT
21H ;
POP
BX
PUSH
AX ;
CALL
DONG
XOR
BX,BX
POP
CX
TIEP1:
MOV
DL,NOIDUNG[BX]
CALL
HIENSOTLP
CALL TRONG
INC
BX
LOOP TIEP1
THOAT
MAIN ENDP
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 64 -
DONG PROC
MOV
AH,3Eh
INT
21h
RET
DONG ENDP
TRONG PROC
PUSH DX
PUSH AX
MOV
DL,'
'
MOV
AH,2
INT
21H
POP
AX
POP
DX
RET
TRONG ENDP
END MAIN
d-ÑOÅI TEÂN, XOAÙ TAÄP TIN
Ñoåi teân taäp tin: Haøm 56h - Ngaét 21h
Xoaù taäp tin: Haøm 41h - Ngaét 21h
.MODEL SMALL
.STACK 100H
.DATA
VUNGDEM DB 20
LOAI DB ?
TENTT DB 50 DUP (0),0,'$'
DUONG
DB
'[A:] <DUONG> TEN TAP TIN[.EXT] $'
LOI
DB
'KHOÂNG THEÅ XOAÙ TAÄP TIN NAØY$'
.CODE
INCLUDE THUVIEN.MAC
MAIN PROC
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 65 -
PRODATA
HIENCH DUONG
MOV
AH,0Ah
LEA
DX,VUNGDEM
INT
21h
XOR
BX,BX
MOV
BL,LOAI
ADD
BX,OFFSET
TENTT
MOV
BYTE PTR [BX],0
LEA
DX,TENTT
MOV
AH,41h
INT
21h
JNC
RA
HIENCH LOI
RA: THOAT
MAIN ENDP
END MAIN
e- THAY ÑOÅI THUOÄC TÍNH - CHEÙP TAÄP TIN:
THAY ÑOÅI THUOÄC TÍNH TAÄP TIN: Haøm 43h - Ngaét 21h
CHEÙP TAÄP TIN
.MODEL SMALL
.DATA
BUFFER DB 14
TYPE1 DB
0
FILE1
DB 12 DUP(00),0
FILE2
DB 8 DUP(00),".TXT",0
HANDLE1 DW
0
HANDLE2 DW 0
THONGBAO DB 'VAO TEN PHAI COPY : $'
DATA1
DB 10000 DUP(?)
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 66 -
.STACK 100H
.CODE
INCLUDE THUVIEN.MAC
MAIN PROC
PRODATA
HIENCH
THONGBAO
MOV
AH,0AH
LEA
DX,BUFFER
INT
21H
MOV
[FILE1+12],0
MOV
CX,08
LEA
SI,FILE1
MOV
DI,
SEG
FILE2
MOV
ES,
DI
LEA
DI,FILE2
REP
MOVSB
LEA
DX,FILE1
MOV
AX,3D02H
INT
21H
MOV
HANDLE1,AX
MOV
DX,OFFSET FILE2
MOV
AH,3CH
MOV
CX,0
INT
21H
MOV
HANDLE2,AX
MOV
AH,3FH
MOV
CX,10000
MOV
DX,OFFSET DATA1
MOV
BX,HANDLE1
INT
21H
MOV
CX,AX
MOV
AH,40H
MOV
BX,HANDLE2
INT
21H
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 67 -
MOV
AH,3EH
MOV
BX,HANDLE1
INT
21H
MOV
BX,HANDLE2
INT
21H
THOAT
MAIN ENDP
END
MAIN
f. CAÙC THÖ MUÏC:
Dòch vuï 39h cuûa ngaét 21h söû duïng ñeå taïo thö muïc môùi
(MKDIR)
Dòch vuï 3Ah cuûa ngaét 21h söû duïng ñeå xoaù thö muïc (RMDIR)
Dòch vuï 3Bh cuûa ngaét 21h söû duïng ñeå chuyeån thö muïc
(CHDIR)
IV. TAÏO TAÄP TIN .COM
Nhöõng chöông trình trong ñoù döõ lieäu vaø leänh ñeàu naèm trong
cuøng moät phaân ñoaïn ñeàu laø nhöõng chöông trình COM. Ñieàu naøy coù
nghóa laø dung löôïng cuûa chöông trình coù giôùi haïn laø 64KByte. Ngay
töø khi thöïc hieän chöông trình loaïi naøy, MSDOS ñöa vaøo boä nhôù
toaøn boä taäp tin naøy vaø ñaët giaù trò ban ñaàu cho caùc thanh ghi CS, DS,
SS, ES nhö nhau. Thanh ghi SP (Stack Pointer) ñöôïc ñaët laø FFFEh.
Thanh ghi IP ñöôïc ñaët laøø 0100h vì moãi chöông trình ñaët ôû ñaàu boä
nhôù moät vuøng100h byte (PSP), ñieàu naøy giaûi thích vì sao leänh thöù
nhaát cuûa chöông trình (ñieåm vaøo) phaûi ñaët ôû ñaàu cuûa chöông trình
vaø chuùng ta phaûi söû duïng ñònh höôùng bieân dòch ORG 100h. Vì vaäy
chuùng ta coù hình aûnh cuûa boä nhôù nhö sau:
Offset PSP
100h JMP
Batdau
Döõ lieäu
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 68 -
IP --->
Batdau:
SP=FFFE Ngaên
xeáp
1- Daïng cuûa moät chöông trình COM
.MODEL SMALL
.CODE
ORG
100h
BATDAU:
JMP
CHINH
; Ñaët döõ lieäu ôû ñaây
CHINH PROC
; Caùc leänh
MOV
AH,4Ch
INT
21h
CHINH ENDP
; Caùc thuû tuïc khaùc
END
BATDAU
Ví duï:
Taäp tin KIEMTRA.ASM
.MODEL SMALL
.CODE
ORG
100h
BATDAU:
JMP
CHINH
TBAO DB 'Chao cac ban! $'
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 69 -
CHINH PROC
LEA
DX,TBAO
MOV
AH,09
INT
21h
MOV
AH,4Ch
INT
21h
CHINH ENDP
END
BATDAU
Hôïp dòch chöông trình naøy:
MASM KIEMTRA;
LINK KIEMTRA;
Ñeå chuyeån taäp tin EXE sang COM söû duïng EXE2BIN
EXE2BIN KIEMTRA KIEMTRA.COM
2- Öùng duïng taäp tin .com
a- ÖÙng duïng 1:
Xem soá ñóa cöùng, soá ñaàu töø, soá töø truï, soá cung treân raõnh
.MODEL SMALL
.CODE
ORG
100h
BATDAU:
JMP DIACUNG
SODIA
DB 10,13,'Soá ñóa cöùng: $'
SODAU
DB 10,13,'Soá ñaàu töø : $'
SOTUTRU
DB 10,13,'Soá töø truï : $'
SOCUNG
DB 10,13,'Soá cung : $'
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 70 -
DIACUNG PROC
MOV
AH,8
MOV
DL,80H
INT
13H
PUSH CX
PUSH CX
PUSH DX
PUSH DX
LEA
DX,SODIA
CALL HIENCHUOI
POP
DX
AND
DX,00FFH
CALL HIENSOTP
LEA
DX,SODAU
CALL HIENCHUOI
POP
DX
AND
DX,0FF00H
MOV
DL,DH
MOV
DH,00
ADD
DL,1
CALL
HIENSOTP
LEA
DX,SOTUTRU
CALL HIENCHUOI
POP
CX
AND
CX,1111111111000000B
XCHG CH,CL
MOV
DX,CX
MOV
CX,2
ROL
DH,CL
ADD
DL,2
CALL
HIENSOTP
LEA
DX,SOCUNG
CALL HIENCHUOI
POP
CX
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 71 -
AND
CX,0000000000111111B
MOV
DX,CX
CALL
HIENSOTP
MOV
AH,4CH
INT
21H
DIACUNG ENDP
; Nhöõng thuû tuïc khaùc
END
BATDAU
b - ÖÙng duïng 2: Ñoïc noäi dung cuûa moät cung
DOS baét ñaàu ñoïc töø cung 1, töø truï 0, maët 1 goïi laø cung 0
moãi raõnh coù 17 cung
* Moãi taäp tin chieám nhieàu nhoùm cung do vaäy phaûi coù moät baûng
quaûn lyù taäp tin -> FAT File Allocation Table coù 16 BIT ->
2
16
=65536 nhoùm cung
* Vôùi ñóa meàm:
Maët 0, raõnh 0, cung 1 -> löu phaàn khôûi ñoäng DOS BOOT
RECORD (DBR)
* Vôùi ñóa cöùng:
Baét ñaàu laø phaàn MASTER BOOT RECORD (MBR)
PARTITION
sau ñoù maët 1, raõnh 0, cung 1 -> löu phaàn khôûi ñoäng DOS BOOT
RECORD (DBR)
Taäp tin DIACUNG.ASM
.MODEL SMALL
.CODE
ORG
100h
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 72 -
BATDAU:
JMP
DOCCUNG
VUNGDEM
DB 512 DUP (?)
DB
'$'
THONGBAO
DB 'Ñoïc toát ',13,10,'$'
BAOLOI
DB 'Khoâng theå ñoïc',13,10,'$'
TRONG
DB '
$'
GACH
DB ' - $'
DEM
DW ?
CHU
DW
?
HANG
DW ?
LFCR
DB
13,10,'$'
DOCCUNG PROC
MOV
DS,AX
XOR
AX,AX
MOV
AH,2
MOV
AL,1 ; 1 Cung
MOV
DL,1 ; Ñóa meàm B
MOV
DH,1 ; Ñaàu töø 1
MOV
CH,0 ; raõnh 0
MOV
CL,9 ; cung 9
LEA
BX,VUNGDEM
INT
13H
JNC
TOT
LEA
DX,BAOLOI
MOV
AH,9
INT
21H
JMP
RA
TOT:
LEA
DX,THONGBAO
MOV
AH,9
INT
21H
RA:
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 73 -
MOV
CX,300
MOV
DEM,0
MOV
CHU,0
MOV
HANG,0
LAP9:
MOV
BX,DEM
MOV
DX,WORD PTR VUNGDEM[BX]
CALL
HIENSOTLP
LEA
DX,TRONG
CALL
HIENCHUOI
INC
DEM
INC
CHU
INC
HANG
CMP
CHU,10
JNE
TIEP1
MOV
CHU,0
CMP
HANG,10
JA
TIEP1
LEA
DX,GACH
CALL
HIENCHUOI
TIEP1:
CMP
HANG,20
JNE
TIEP2
MOV
HANG,0
LEA
DX,LFCR
CALL
HIENCHUOI
TIEP2:
LOOP
LAP9
CALL
THOAT
DOCCUNG ENDP
; Caùc thuû tuïc khaùc
END BATDAU
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 74 -
c - Öùng duïng 3:
Ghi 1 cung
.MODEL SMALL
.CODE
ORG 100h
BATDAU:
JMP GHICUNG
VUNGDEM
DB 512 DUP (00)
DB
'$'
THONGBAO
DB 13,10,'Ñoïc toát ',13,10,'$'
BAOLOI
DB 13,10,'Khoâng theå ñoïc ',13,10,'$'
NHAP
DB 'Goõ vaøo baøn phím :'
LFCR
DB
13,10,'$'
DEM
DW ?
GHICUNG PROC
LEA
DX,NHAP
CALL HIENCHUOI
MOV
DEM,0
MOV
AH,1
LAP9:
INT
21H
CMP
AL,1AH ; CTRL+Z
JE TIEP1
MOV
BX,DEM
MOV
VUNGDEM[BX],AL
INC
DEM
JNE
LAP9
TIEP1:
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 75 -
XOR
AX,AX
MOV
AH,3
MOV
AL,1 ; 1 Cung
MOV
DL,1 ; Ñóa meàm B
MOV
DH,1 ; Ñaàu töø 1
MOV
CH,0 ; Raõnh 0
MOV
CL,9 ; Cung 9
LEA
BX,VUNGDEM
INT
13H
JNC
TOT
LEA
DX,BAOLOI
CALL
HIENCHUOI
JMP
THOATRA
TOT:
LEA
DX,THONGBAO
CALL HIENCHUOI
THOATRA:
CALL THOAT
GHICUNG ENDP
;Caùc thuû tuïc khaùc
END BATDAU
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 76 -
CHÖÔNG 7: SÖÛ DUÏNG PHAÂN ÑOAÏN TOAØN PHAÀN
Phöông phaùp ñònh nghóa phaân ñoaïn ñôn giaûn hoaù maø chuùng ta vaãn
thöôøng söû duïng töø tröôùc ñeán nay ñaõ aùp duïng ñöôïc haàu heát caùc muïc tieâu.
Trong phaàn naøy chuùng ta xem xeùt caùch ñònh nghóa phaân ñoaïn toøn phaàn. Döôùi
ñaây laø nguyeân nhaân chính ñeå söû duïng phöông phaùp naøy:
. Vôùi caùc trình bieân dòch phieân baûn 5.0 trôû veà tröôùc chuùng ta chæ coù theå
söû duïng phöông phaùp ñònh nghóa phaân ñoaïn toaøn phaàn.
. Vôùi phöông phaùp ñònh nghóa phaân ñoaïn toaøn phaàn, laäp trình vieân coù
theå ñieàu khieån ñöôïc thöù töï caùc phaân ñoaïn , vieäc keát hôïp chuùng vôùi nhau vaø söï
lieân keát giöõa chuùng trong boä nhôù
I- SÖÛ DUÏNG CAÙC ÑÒNH HÖÔÙNG BIEÂN DÒCH
1. Segment
Teân SEGMENT lieân keát keát hôïp 'lôùp'
;
;
Teân ENDS
Ví duï:
D_SEG SEGMENT
; caùc döõ lieäu
D_SEG ENDS
a - Loaïi lieân keát (align):
PARA
Phaân ñoaïn baét ñaàu töø phaân ñoaïn tröôùc ñoù.
BYTE Phaân ñoaïn baét ñaàu töø byte tröôùc ñoù.
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 77 -
WORD Phaân ñoaïn baét ñaàu töø töø tröôùc ñoù.
PAGE Phaân ñoaïn baét ñaàu töø trang tröôùc ñoù.
Maëc ñònh ngöôøi ta söû duïng loaïi PARA
Ví duï:
SEG1
SEGMENT
PARA
DB
11h
DUP
(1)
SEG1
ENDS
SEG2
SEGMENT
PARA
DB
10H
DUP
(2)
SEG2
ENDS
1010:0000 01
01
01
01
01
01 - 01
01
01
01
01
1010:0010 01 00 00 00 00 00
-
00 00 00 00 00
1010:0020 02 02 02 02 02 02
-
02 02 02 02 02
SEG1
SEGMENT
PARA
DB
11h
DUP
(1)
SEG1
ENDS
SEG2
SEGMENT
BYTE
DB
10H
DUP
(2)
SEG2
ENDS
1010:0000 01 01 01 01 01 01
-
01 01 01 01 01
1010:0010 01 02 02 02 02 02
-
02 02 02 02 02
1010:0020 02 00 00 00 00 00
-
00 00 00 00 00
b - Loaïi keát hôïp (combine):
PUBLIC:Nhöõng phaân ñoaïn coù cuøng teân ñeàu gom laïi trong cuøng moät
khoái nhôù keá tieáp nhau vaø thoáng nhaát.
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 78 -
COMMON: Nhöõng phaân ñoaïn coù cuøng teân seõ gom laïi taïi moät vò trí
boä nhôù vaø xeáp choàng leân nhau.
STACK: Taùc duïng gaàn nhö PUBLIC ngoaïi tröø taát caû caùc ñòa chæ
nhaûy böôùc (offset) cuûa caùc leänh vaø caùc döõ lieäu ñöôïc tính
töông ñoái so vôùi thanh ghi SS. SP ñöôïc ñaët ban ñaàu troû
ñeán cuoái phaân ñoaïn.
AT paragraph: Phaân ñoaïn ñöôïc baét ñaàu töø moät phaân ñoaïn xaùc ñònh
Thöôøng ngöôøi ta söû duïng loaïi PUBLIC ñeå gom caùc phaân ñoaïn maõ
coù cuøng teân trong nhöõng moñun khaùc nhau ñeå taïo ra moät phaân ñoaïn
duy nhaát. Ñieàu naøy cuõng coù nghóa laø chuùng ta coù nhöõng thuû tuïc
NEAR trong chöông trình.
c - Loaïi lôùp (class):
Loaïi lôùp chuùng ta ñònh nghóa chæ ra thöù töï vò trí cuûa caùc phaân ñoaïn
trong boä nhôù. Chuùng ta caàn ñaët loaïi naøy vaøo trong daáu nhaùy ( ' ).
Ví duï:
Neáu chuùng ta ñònh nghóa THUNHAT.ASM:
C_SEG SEGMENT
'CODE'
; thuû tuïc chính
C_SEG ENDS
Vaø trong THUHAI.ASM
C1_SEG
SEGMENT
'CODE'
; caùc thuû tuïc khaùc
C1_SEG
ENDS
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 79 -
Sau khi thöïc hieän leänh
LINK THUNHAT+THUHAI
C1_SEG seõ naèm sau C_SEG trong boä nhôù.
2. Ñònh höôùng bieân dòch assume
Khi moät chöông trình ñöôïc hôïp dòch, trình hôïp dòch phaûi bieát phaân
ñoaïn naøo laø phaân ñoaïn maõ, phaân ñoaïn naøo laø phaân ñoaïn döõ lieäu, phaân ñoaïn
naøo laø phaân ñoaïn ngaên xeáp. Muïc tieâu cuûa ñònh höôùng bieân dòch ASSUME laø
lieân keát caùc thanh ghi CS, DS, SS vaø ngay caû ES vaøo caùc phaân ñoaïn ñaõ bieát.
II - DAÏNG CUÛA CHÖÔNG TRÌNH .EXE SÖÛ DUÏNG TRONG CAÙC
PHÖÔNG PHAÙP CUÕ:
S_SEG SEGMENT
STACK
DB
100h
S_SEG ENDS
D_SEG SEGMENT
; döõ lieäu
D_SEG ENDS
C_SEG SEGMENT
ASSUME
CS:C_SEG,
SS:S_SEG,
DS:
D_SEG
MAIN
PROC
;Xaùc ñònh ban ñaàu DS
MOV
AX,
D_SEG
MOV
DS,
AX
;
caùc
leänh
khaùc
MAIN
ENDP
; caùc thuû tuïc khaùc
C_SEG ENDS
END
MAIN
Moät ví duï chöông trình EXE
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 80 -
Ñoåi ra chöõ HOA:
* Taäp tin CTR11.ASM
EXTRN CONVERS:FAR
S_SEG SEGMENT
STACK
DB
100
DUP
(0)
S_SEG ENDS
D_SEG SEGMENT
MSG DB 'Nhaäp vaøo moät chöõ caùi thöôøng: $'
D_SEG ENDS
C_SEG SEGMENT
ASSUME CS:C_SEG, DS: D_SEG, SS: S_SEG
MAIN
PROC
MOV
AX,
D_SEG
MOV
DS,
AX
MOV
AH,
09
LEA
DX,
MSG
INT
21H
MOV
AH,
1
INT
21H
CALL
CONVERS
MOV
AH,4CH
INT
21H
MAIN
ENDP
C_SEG ENDS
END
MAIN
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 81 -
Taäp tin CTR21.ASM
PUBLIC CONVERS
D_SEG SEGMENT
MSG
DB 0DH,0AH, 'Chöõ HOA laø: '
CARAC
DB -20h,' $'
D_SEG ENDS
C_SEG SEGMENT
ASSUME CS: C_SEG, DS: D_SEG
CONVERT
PROC
FAR
PUSH DS
PUSH DX
MOV
DX,
D_SEG
MOV
DS,
DX
ADD
CARAC,
AL
MOV
AH,
09
LEA
DX,
MSG
INT
21H
POP
DX
POP
DS
RET
CONVERS
ENDP
C_SEG ENDS
END
Coù theå toái öu hoaù chöông trình treân:
* CTR12.ASM
EXTRN CONVERS:NEAR
S_SEG SEGMENT
STACK
DB
100
DUP
(0)
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 82 -
S_SEG ENDS
D_SEG
SEGMENT BYTE
PUBLIC 'DATA'
MSG DB 'Nhaäp vaøo moät chöõ caùi thöôøng: $'
D_SEG ENDS
C_SEG
SEGMENT BYTE
PUBLIC 'CODE'
ASSUME CS:C_SEG, DS: D_SEG, SS: S_SEG
MAIN
PROC
MOV
AX,
D_SEG
MOV
DS,
AX
MOV
AH,
09
LEA
DX,
MSG
INT
21H
MOV
AH,
1
INT
21H
CALL
CONVERS
MOV
AH,4CH
INT
21H
MAIN
ENDP
C_SEG ENDS
END
MAIN
Taäp tin CTR22.ASM
PUBLIC CONVERS
D_SEG
SEGMENT BYTE
PUBLIC 'DATA'
MSG
DB 0DH,0AH, 'Chöõ HOA laø : '
CARAC
DB -20h,' $'
D_SEG ENDS
C_SEG
SEGMENT BYTE
PUBLIC 'CODE'
ASSUME CS: C_SEG, DS: D_SEG
CONVERT
PROC
NEAR
PUSH DX
ADD
CARAC,
AL
MOV
AH,
09
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 83 -
LEA
DX,
MSG
INT
21H
POP
DX
RET
CONVERS
ENDP
C_SEG ENDS
END
MASM CTR21;
MASM CTR22;
LINK CTR21+CTR22
III- VÍ DUÏ CHÖÔNG TRÌNH COM
MyProg SEGMENT
Org
100h
ASSUME
CS:MyProg,
DS:MyData
Start:
JMP
Main
Main
PROC
MOV
AH,9
LEA
DX,CS:MSG
INT
21h
INT
20h
Main
ENDP
MyProg ENDS
MyData SEGMENT
MSG
DB 'Chaøo caùc baïn, heïn gaëp laïi $'
MyData ENDS
END
Start
MASM CTCUOI;
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 84 -
LINK CTCUOI;
EXE2BIN CTCUOI CTCUOI.COM
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 85 -
CHÖÔNG 8: CHÖÔNG TRÌNH ÖÙNG DUÏNG
I. IN NOÄI DUNG VAÊN BAÛN RA MAÙY IN:
1. Söû duïng haøm 40h ngaét 21h (DOS) ñeå thöïc hieän
.MODEL SMALL
.STACK 100h
.DATA
HelloMessage DB 'Hello, world',13,10,12 ; 12 Form Feed
HELLO_MESSAGE_LENGTH EQU $ - HelloMessage
.CODE
mov ax,@data
mov ds,ax ;set DS to point to the data segment
mov ah,40h ;DOS write to device function #
mov bx,4 ;printer handle
mov cx,HELLO_MESSAGE_LENGTH ;number of characters to print
mov dx,OFFSET HelloMessage ;string to print
int 21h ;print "Hello, world"
mov ah,4ch ;DOS terminate program function #
int 21h ;terminate the program
END
2. Söû duïng haøm 01h ngaét 17h (ROMBIOS)
.model small
.stack 100h
.data
printe equ
17h
prin_first
equ
0
.code
printe_char proc
mov
ax,@data
mov
ds,ax
mov
dx,prin_first
mov
ah,01
int
printe
mov
cx,0ffh
conti:
mov
al,41h
call
pri
dec
cx
cmp
cx,0
jnz
conti
mov
al,0dh
call
pri
mov
ah,4ch
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 86 -
int
21h
printe_char endp
pri proc
mov
ah,0
int
printe
ret
pri endp
end
printe_char
II. ÑEÁM SOÁ TÖØ TRONG MOÄT TAÄP TIN
;
; Program to count the number of words in a file. Words are
; delimited by whitespace, which consists of spaces, tabs,
; carriage returns, and linefeeds.
.MODEL SMALL ;code and data each fit in 64K
.STACK 200h ;512-byte stack
.DATA
Count DW 0 ;used to count words
InWhitespace DB ? ;set to 1 when the last
; character read was whitespace
TempChar DB ? ;temporary storage used by
; GetNextCharacter
Result DB 'So tu la: ', 5 DUP (?)
;string printed to report the count
CountInsertEnd DB 0dh,0ah,'$'
;DOS fn #9 expects strings to end with
; a dollar sign
.CODE
ProgramStart:
mov ax,@data
mov ds,ax ;point DS to the .DATA segment
mov [InWhitespace],1 ;assume we're in whitespace, since
; the first non-whitespace we'll find
; will mark the start of a word
CountLoop:
call GetNextCharacter ;get next character to check
jz CountDone ;...if any
call IsCharacterWhitespace ;is it whitespace?
jz IsWhitespace ;yes
cmp [InWhitespace],0 ;character is not
; whitespace-are we currently in
; whitespace?
jz CountLoop ;we're not in whitespace, and the
; character isn't whitespace, so
; we're done with this character
inc [Count] ;we are in whitespace, and the
; character is not whitespace, so
; we just found the start of a new word
mov [InWhitespace],0 ;mark that we're no longer
;in whitespace
jmp CountLoop ;do the next character
IsWhitespace:
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 87 -
mov [InWhitespace],1 ;mark that we're in whitespace
jmp CountLoop ;do the next character
;
; We're done counting--report the results.
CountDone:
mov ax,[Count] ;number to convert to a string
mov bx,OFFSET CountInsertEnd-1 ;point to the end of
; the string to put the number in
mov cx,5 ;number of digits to convert
call ConvertNumberToString ;make the number a string
mov bx,OFFSET Result ;point to result string
call PrintString ;print the count
mov ah,4ch ;DOS terminate program fn #
int 21h ;end the program
;
; Subroutine to get the next character from the standard input.
;
; Input: None
;
; Output:
; AL = character, if one was available
; Z flag = 0 (NZ) if character available,
; = 1 (Z) if end of file reached
;
; Registers destroyed: AH, BX, CX, DX
;
GetNextCharacter PROC
mov ah,3fh ;DOS read from file fn #
mov bx,0 ;standard input handle
mov cx,1 ;read one character
mov dx,OFFSET TempChar ;put the character in TempChar
int 21h ;get the next character
jc NoCharacterRead ;if DOS reports an error, then treat
; it as the end of the file
cmp [TempChar],1ah ;was it Control-Z?
; (marks end of some files)
jne NotControlZ ;no
NoCharacterRead:
sub ax,ax ;mark no character read
NotControlZ:
and ax,ax ;set Z flag to reflect whether a
; character was read (NZ), or the
; end of the file was reached (Z).
; Note that DOS fn #3fh sets AX to
; the number of characters read
mov al,[TempChar] ;return the character read
ret ;done
GetNextCharacter ENDP
;
; Subroutine to report whether a given character is whitespace.
;
; Input:
; AL = character to check
;
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
; Output:
Hôïp Ngöõ
- 88 -
; Z flag = 0 (NZ) if character is not whitespace
; = 1 (Z) if character is whitespace
;
; Registers destroyed: none
;
IsCharacterWhitespace PROC
cmp al,' ' ;is it a space?
jz EndIsCharacterWhitespace ;if so, it's whitespace
cmp al,09h ;is it a tab?
jz EndIsCharacterWhitespace ;if so, it's whitespace
cmp al,0dh ;is it a carriage return?
jz EndIsCharacterWhitespace ;if so, it's whitespace
cmp al,0ah ;is it a linefeed? If so,
; it's whitespace, so return Z;
; if not, it's not whitespace,
; so return NZ as set by cmp
EndIsCharacterWhitespace:
ret
IsCharacterWhitespace ENDP
;
; Subroutine to convert a binary number to a text string.
;
; Input:
; AX = number to convert
; DS:BX = pointer to end of string to store text in
; CX = number of digits to convert
;
; Output: None
;
; Registers destroyed: AX, BX, CX, DX, SI
;
ConvertNumberToString PROC
mov si,10 ;used to divide by 10
ConvertLoop:
sub dx,dx ;convert AX to doubleword in DX:AX
div si ;divide number by 10. Remainder is in
; DX--this is a one-digit decimal
; number. Number/10 is in AX
add dl,'0' ;convert remainder to a text character
mov [bx],dl ;put this digit in the string
dec bx ;point to the location for the
; next most-significant digit
loop ConvertLoop ;do the next digit, if any
ret
ConvertNumberToString ENDP
;
; Subroutine to print a string on the display.
;
; Input:
; DS:BX = pointer to string to print
;
; Output: None
;
; Registers destroyed: None
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
;
Hôïp Ngöõ
- 89 -
;
;
PrintString PROC
push ax
push dx ;reserve registers in this subroutine
mov ah,9 ;DOS print string function #
mov dx,bx ;point DS:DX to the string to print
int 21h ;invoke DOS to print the string
pop dx ;restore registers we changed
pop ax
ret
PrintString ENDP
END ProgramStart
III- ÑOÅI NGÖÔÏC CHUOÃI
.MODEL SMALL
.STACK 100h
.DATA
MAXIMUM_STRING_LENGTH EQU 1000
StringToReverse DB MAXIMUM_STRING_LENGTH DUP(?)
ReverseString DB MAXIMUM_STRING_LENGTH DUP(?)
.CODE
mov ax,@data
mov ds,ax ;set DS to point to the data segment
mov ah,3fh ;DOS read from handle function #
mov bx,0 ;standard input handle
mov cx,MAXIMUM_STRING_LENGTH ;read up to maximum
;number of characters
mov dx,OFFSET StringToReverse ;store the string here
int 21h ;get the string
and ax,ax ;were any characters read?
jz Done ;no, so you're done
mov cx,ax ;put string length in CX, where
; you can use it as a counter
push cx ;save the string length
mov bx,OFFSET StringToReverse
mov si,OFFSET ReverseString
add si,cx
dec si ;point to the end of the
; reverse string buffer
ReverseLoop:
mov al,[bx] ;get the next character
mov [si],al ;store the characters in reverse order
inc bx ;point to next character
dec si ;point to previous location in reverse buffer
loop ReverseLoop ;move next character, if any
pop cx ;get back the string length
mov ah,40h ;DOS write from handle function #
mov bx,1 ;standard output handle
mov dx,OFFSET ReverseString ;print this string
int 21h ;print the reversed string
Done:
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 90 -
mov ah,4ch ;DOS terminate program function #
int 21h ;terminate the program
END
IV. CHÖÔNG TRÌNH HIEÅN THÒ THÔØI GIAN
Chöông trình bao goàm caùc böôùc sau ñaây:
1- Laáy thôøi gian
2- Ñoåi giôø, phuùt, giaây sang daïng chöõ soá ASCII
3- Hieån thò caùc chöõ soá ASCII
Taäp tin thöù 1: PGM1_1.ASM
EXTRN GET_TIME:NEAR
.MODEL SMALL
.STACK 100h
.DATA
TIME_BUF
DB '00:00:00$' ; boä ñeäm thôøi gian
;hr:min:sec
.CODE
MAIN PROC
MOV
AX,@DATA
MOV
DX,AX
; khôûi taïo DS
;laáy vaø hieån thò thôøi gian
LEA
BX,TIME_BUF
CALL
GET_TIME
;
ñöa thôøi gian
;
hieän taïi vaøo DX
LEA
DX,TIME_BUF
MOV
AH,09H
INT
21H
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 91 -
;trôû veà DOS
MOV
AH,4CH
INT
21H
MAIN ENDP
END
MAIN
Taäp tin thöù 2: PGM1_2.ASM
PUBLIC GET_TIME
.MODEL SMALL
.CODE
GET_TIME PROC
;laáy thôøi gian trong ngaøy vaø chöùa caùc chöõ soá ASCII ;trong boä
ñeäm thôøi gian
MOV
AH,2CH
INT
21H
;ñoåi giôø sang daïng ASCII vaø löu tröõ
MOV
AL,CH
CALL
CONVERT
MOV
[BX],AX
;ñoåi phuùt sang daïng ASCII vaø löu tröõ
MOV
AL,CL
CALL
CONVERT
MOV
[BX+3],AX
;ñoåi giaây sang daïng ASCII vaø löu tröõ
MOV
AL,CH
CALL
CONVERT
MOV
[BX+6],AX
RET
GET_TIME ENDP
;
;
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 92 -
CONVERT PROC
;
; ñoåi soá kieåu byte (0-59) sang caùc chöõ soá ASCII
; vaøo:
AL = soá
; ra:AX = caùc chöõ soá ASCII, AL = chöõ soá haøng chuïc
; AH = chöõ soá haøng ñôn vò
;
MOV
AH,0
MOV
DL,10
DIV
DL
OR
AX, 0303H
; ñoåi sang daïng ASCII
RET
CONVERT END
END
Chöông trình hieån thò thôøi gian vaø keát thuùc
* Ñeå taïo chöông trình thôøi gian thuù vò hôn, chuùng ta cho hieån thò thôøi
gian vaø caäp nhaät laïi sau moãi giaây
Thuû tuïc SETUP_INT trong chöông trình PGM2_2.ASM caát vectô ngaét
cuõ vaø thieát laäp vectô ngaét môùi. Noù nhaän soá hieäu ngaét trong AL, boä ñeäm ñeå caát
vectô cuõ taïi DS:DI vaø boä ñeäm chöùa vectô ngaét môùi taïi DS:SI. Baèng vieäc hoaùn
ñoåi hai boä ñeäm, SET_INT coù theå ñöôïc duøng ñeå phuïc hoài laïi vectô cuõ.
Taäp tin PGM2_2.ASM
PUBLIC
SETUP_INT
.MODEL SMALL
.CODE
SETUP_INT PROC
;caát vectô cuõ
MOV
AH,35H
INT
21H ;ES:BX=vectô ngaét
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 93 -
MOV
[DI],BX ; caát offset
MOV
[DI+2],ES
;
caát ñòa chæ phaân ñoaïn
; thieát laäp vectô môùi
MOV
DX,[SI] ;DX chöùa offset
PUSH DS
;caát DS
MOV
DS,[SI+2];DS chöùa soá hieäu ñoaïn
MOV
AH,25H
INT
21H
POP
DS ; phuïc hoài DS
RET
SETUP_INT END
END
Ñieàu khieån con troû:
Moãi khi hieån thò thôøi gian baèng haøm 9 ngaét 21h, con troû bò dòch ñi.
Laàn hieån thò sau seõ xuaát hieän taïi moät vò trí khaùc treân maøn hình. Nhö vaäy
ñeå thaáy thôøi gian caäp nhaät laïi ôû cuøng moät vò trí treân maøn hình, chuùng ta
phaûi phuïc hoài con troû taïi vò trí nguyeân thuûy cuûa noù tröôùc khi hieån thò thôøi
gian. Muoán thöïc hieän ñieàu naøy, tröôùc heát chuùng ta phaûi xaùc ñònh vò trí
hieän taïi cuûa con troû, tieáp ñoù sau moãi thao taùc in chuoãi chuùng ta laïi
chuyeån con troû troû veà vò trí ban ñaàu cuûa noù.
Chuùng ta söû duïng caùc haøm 3 vaø 2 cuûa ngaét 10h ñeå caát vò trí cuûa
con troû vaø di chuyeån con troû ñeán vò trí ban ñaàu cuûa noù sau moãi thao taùc in
chuoãi.
Thuû tuïc ngaét:
Khi moät thuû tuïc ngaét ñöôïc kích hoaït, khoâng theå xem thanh ghi DS
chöùa ñòa chæ phaân ñoaïn döõ lieäu cuûa chöông trình. Vì theá neáu muoán söû
duïng baát cöù bieán naøo, phaûi khôûi taïo thanh ghi DS. Thanh ghi DS phaûi
ñöôïc phuïc hoài laïi tröôùc khi keát thuùc trình phuïc vuï ngaét vôùi leänh IRET
(Interrupt Return)
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 94 -
PGM2_1.ASM chöùa thuû tuïc MAIN vaø thuû tuïc ngaét TIME_INT.
Caùc böôùc cuûa thuû tuïc MAIN goàm:
Caát vò trí con troû hieän taïi
Thieát laäp vectô ngaét cho TIME_INT
Ñôïi vaøo 1 phím
phuïc hoài laïi ngaét cuõ vaø keát thuùc
Thöïc hieän böôùc thöù 2, chuùng ta söû duïng toaùn töû giaû OFFSET vaø
SEG ñeå laáy offset vaø ñòa chæ phaân ñoaïn cuûa thuû tuïc TIEME_INT, vectô
naøy sau ñoù ñöôïc löu vaøo trong boä ñeäm NEW_VEC. Thuû tuïc SETUP_INT
ñöôïc goïi ñeå thieát laäp vectô cho ngaét nhòp thôøi gian 1Ch. Ngaét 16h, haøm 0
ñöôïc duøng trong böôùc 3 ñeå vaøo 1 phím. Thuû tuïc SETUP_INT laïi ñöôïc
goïi moät laàn nöõa trong böôùc 4, laàn naøy SI troû ñeán vectô cuõ vaø DI troû ñeán
vectô cuûa thuû tuïc TIME_INT.
Caùc böôùc cuûa thuû tuïc TIME_INT goàm
(1) Thieát laäp DS
(2) Laáy thôøi gian môùi
(3) Hieån thò thôøi gian
(4) phuïc hoài vò trí con troû
(5) Phuïc hoài DS
Chöông trình ñöôïc tieán haønh nhö sau: sau khi thieát laäp con troû vaø
caùc vectô ngaét, thuû tuïc MAIN ñôïi 1 phím nhaán. Khi aáy thuû tuïc ngaét
TIME_INT caäp nhaät thôøi gian môùi moãi khi coù xung nhòp cuûa maïch thôøi
gian. Sau khi moät phím ñöôïc nhaán, vectô cuõ ñöôïc phuïc hoài vaø chöông
trình keát thuùc.
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 95 -
PGM2_1.ASM
EXTRN GET_TIME:NEAR, SETUP_INT:NEAR
.MODEL SMALL
.STACK 100H
.DATA
TIME_BUF DB
'00:00:00$'
CURSOR_POS DW
?
NEW_VEC DW
?,?
OLD_VEC DW
?,?
;
.CODE
MAIN PROC
MOV
AX,@DATA
MOV
DS,AX
;Khôûi
taïo
DS
;caát vò trí con troû
MOV
AH,3
MOV
BH,0
;trang
0
INT
10H
MOV
CURSOR_POS,DX; caát vò trí con troû
;thieát laäp thuû tuïc ngaét baèng caùch
; ñöa segment:offset cuûa TIME_INT vaøo NEW_VEC
MOV
NEW_VEC,
OFFSET
TIME_INT
MOV
NEW_VEC+2,SEG
TIME_INT
LEA DI, OLD_VEC ;DI troû ñeán boä ñeäm vectô
LEA SI, NEW_VEC ;SI troû ñeán vectô môùi
MOV
AL,1CH ; ngaét thôøi gian
CALL
SETUP_INT
; thieát laäp vectô môùi
; ñoïc baøn phím
MOV
AH,0
INT
16H
;phuïc hoài vectô ngaét cuõ
LEA
DI,NE_VEC
LEA
SI,OLD_VEC
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 96 -
MOV
AL,1CH
CALL
SETUP_INT
;trôû veà DOS
MOV
AH,4CH
INT
21H
MAIN ENDP
;
TIME_INT PROC
;thuû tuïc ngaét
;kích hoaït bôûi maïch thôøi gian
PUSH
DS; caát giaù trò töùc thôøi cuûa DS
MOV
AX,@DATA
MOV
DS,AX
;DS troû ñeán ñoaïn döõ lieäu
;laáy thôøi gian môùi
LEA
BX, TIME_BUF ; BX troû ñeán boä ñeäm
;thôøi
gian
CALL
GET_TIME ; caát thôøi gian trong boäñeäm
;hieån thò thôøi gian
LEA
DX,TIME_BUF
MOV
AH,09H
INT
21H
;phuïc hoài vò trí con troû
MOV
AH,2
MOV
BH,0
MOV
DX,CURSOR_POS
INT
10H
IRET
TIME_INT ENDP
;
END
MAIN
Leänh LINK goàm caùc moñun PGM2_1.ASM, PGM1_2.ASM,
PGM2_2.ASM
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 97 -
V. CHÖÔNG TRÌNH THÖÔØNG TRUÙ BOÄ NHÔÙ.
Cuõng vaãn hieån thò giôø nhöng baây giôø laø ôû thöôøng truù trong boä nhôù
(terminate and stay resident)
Thoâng thöôøng khi keát thuùc moät chöông trình, boä nhôù maø noù chieám
giöõ ñöôïc DOS söû duïng ñeå naïp chöông trình khaùc. Tuy nhieân khi moät
chöông trình TSR keát thuùc, boä nhôù khoâng bò thu hoài laïi. Chính vì theá moät
chöông trình TSR coøn ñöôïc goïi laø chöông trình thöôøng truù boä nhôù
(memory resident program)
Ñeå trôû veà DOS, moät chöông trình TSR keát thuùc baèng caùch söû duïng
ngaét 27h hay ngaét 21h (haøm 31h)
Chuùng ta seõ taïo moät chöông trình .COM vì ñeå söû duïng ngaét 27h
chuùng ta caàn xaùc ñònh soá byte ñöôïc ôû laïi thöôøng truù trong boä nhôù. Caáu
truùc cuûa moät chöông trình .COM khieán vieäc tính toaùn deã daøng hôn vì noù
chæ coù moät phaân ñoaïn chöông trình.
Moät khi muoán keát thuùc hoaøn toaøn nghóa laø chöông trình TSR
khoâng hoaït ñoäng. Chöông trình naøy phaûi ñöôïc kích hoaït bôûi caùc taùc ñoäng
ngoaøi nhö moät toå hôïp phím naøo ñoù (Ví duï:Ctrl+Shift). Öu ñieåm cuûa
chöông trình thöôøng truù laø chuùng coù theå ñöôïc kích hoaït khi ñang chaïy
moät chöông trình naøo khaùc.
Chöông trình goàm 2 phaàn: Phaàn khôûi taïo thieát laäp vectô ngaét vaø
phuïc vuï ngaét
Taäp tin PGM3_1.ASM
EXTRN MAIN:NEAR,
SETUP_INT:NEAR
EXTRN NEW_VEC:DWORD,
OLD_VEC:DWORD
PUBLIC INITIALIZE
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 98 -
C_SEG SEGMENT PUBLIC
ASSUME
CS:C_SEG
INITIALIZE PROC
;thieát laäp vectô ngaét
MOV
NEW_VEC,OFFSET
MAIN;
löu ñòa chæ
MOV
NEW_VEC+2,CS
LEA DI, OLD_VEC ;
DI troû veà vectô cuõ
LEA SI, NEW_VEC ;
SI troû veà vectô môùi
MOV
AL,09H ;
ngaét baøn phím
CALL
SETUP_INT
; thieát laäp vectô ngaét
;trôû veà DOS
LEA
DX,
INITIALIZE
INT 27H ;
Keát thuùc vaø ôû laïi thöôøng truù
INITIALIZE ENDP
C_SEG ENDS
END
INITIALIZE
Caùch ñôn giaûn ñeå nhaän bieát caùc phím ñieàu khieån laø kieåm tra caùc
côø phím (haøm 2- ngaét 16h). Chuùng ta seõ söû duïng toå hôïp phím Ctrl vaø
Shift phaûi ñeå kích hoaït vaø keát thuùc söï hieån thò ñoàng hoà. Khi kích hoaït,
thôøi gian hieän taïi seõ ñöôïc hieån thò taïi goùc phaûi treân cuûa maøn hình . Ñaàu
tieân phaûi cheùp laïi döõ lieäu maøn hình ñeå sau khi keát thuùc hieån thò ñoàng hoà
ta coù theå phuïc hoài laïi maøn hình cuõ.
Thuû tuïc SET_CURSOR thieát laäp vò trí con troû taïi haøng 0 vaø coät
trong DL
Thuû tuïc SAVE_SCREEN cheùp döõ lieäu maøn hình vaøo boä ñeäm
Thuû tuïc RESTOR_SCREEN traû laïi döõ lieäu cho boä ñeäm maøn hình
Taäp tin PGM3_2.ASM
EXTRN SS_BUF:BYTE
PUBLIC SAVE_SCREEN,RESTOR_SCREEN, SET_CURSOR
C_SEG SEGMENT
PUBLIC
ASSUME
CS:C_SEG
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 99 -
;
SAVE_SCREEN PROC
;löu giöõ 8 kyù töï ôû goùc phaûi treân cuûa maøn hình
LEA
DI,SS_BUF ; Boä ñeäm maøn hình
MOV
CX,8
MOV DL,72 ;coät 72
CLD ; xoaù DF cho thao taùc chuoãi
SS_LOOP:
CALL SET_CURSOR;thieát laäp con troû
MOV AH,08H ; ñoïc kyù töï treân maøn hình
INT
10H ;AH=thuoäc tính/AL=kyù töï
STOSW ; caát kyù töï vaø thuoäc tính
INC
DL ; coät tieáp theo
LOOP
SS_LOOP
RET
SAVE_SCREEN ENDP
;
RESTOR_SCREEN PROC
;phuïc hoài maøn hình ñaõ caát
LEA
SI,SS_BUF ;SI troû ñeán boä ñeäm
MOV DI,8
;laëp 8 laàn
MOV
DL,72
;coät
72
MOV CX,1
; moãi laàn 1 kyù töï
RS_LOOP:
CALL SET_CURSOR ;di chuyeån con troû
LODSW
;AL=kyù töï/AH=thuoäc tính
MOV
BL,AH
MOV AH,9 ; vieát kyù töï vaø thuoäc tính
MOV
BH,0
;trang
0
INT
10h
INC
DL ;vò trí kyù töï tieáp theo
DEC
DI
JG
RS_LOOP
RET
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 100 -
RESTOR_SCREEN END
;
SET_CURSOR PROC
;chuyeån con troû ñeán haøng 0, coät DL
; vaøo DL=soá hieäu coät
MOV
AH,2
MOV
BH,0
MOV
DH,0
INT
10H
SET_CURSOR END
;
C_SEG ENDS
END
Baây giôø chuùng ta ñaõ saün saøng ñeå vieát thöôøng trình ngaét. Ñeå xaùc
ñònh xem söï hieån thò thôøi gian coù ñöôïc kích hoaït hay khoâng ta söû duïng côø
bieán ñoåi ñöôïc ON_FLAG. Côø naøy ñöôïc thieát laäp baèng 1 khi thôøi gian
ñöôïc hieån thò. MAIN laø thuû tuïc ngaét
Taäp tin PGM3_3.ASM
;chöông trình thöôøng truù boä nhôù chæ thôøi gian
; kích hoaït baèng toå hôïp phím Ctrl+Shift phaûi
EXTRN INITIALIZE:NEAR,SAVE_SCREEN:NEAR
EXTRN RESTOR_SCREEN:NEAR,SET_CURSOR:NEAR
EXTRN GET_TIME:NEAR
PUBLIC MAIN
PUBLIC NEW_VEC,OLD_VEC,CURSOR_POS
C_SEG SEGMENT
ASSUME CS:C_SEG, DS:C_SEG, SS:C_SEG
ORG
100H
START:
JMP
MAIN
;
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 101 -
SS_BUF
DB
16DUP(?) ;boä ñeäm löu giöõ maøn hình
TIME_BUF DB '00:00:00$'
CURSOR_POS
DW ?
;vò trí con troû
ON_FLAG DB
0
;1=chaïy thuû tuïc ngaét
NEW_VEC DW ?,?
; chöùa vectô môùi
OLD_VEC DW ?,?
;chöùa vectô cuõ
;
MAIN
PROC
;thuû tuïc ngaét
; caát caùc thanh ghi
PUSH
DS
PUSH
ES
PUSH
AX
PUSH
BX
PUSH
CX
PUSH
DX
PUSH
SI
PUSH
DI
MOV
AX,CS
;
thieát laäp DS
MOV
DS,AX
MOV
ES,AX
;Goïi thuû tuïc ngaét baøn phím cuõ
PUSHF
CALL
INITIALIZE
;laáy caùc côø baøn phím
MOV
AX,CS
;
thieát laäp laïi DS
MOV
DS,AX
MOV
ES,AX
;
ES cho phaân ñoaïn hieän haønh
MOV
AH,02
;
xem côø baøn phím
INT
16H
;
AL chöùa caùc côø baøn phím
TEST
AL,1
;
Shift phaûi
?
JE
I_DONE
;
khoâng, thoaùt
TEST
AL,100B
;
Ctrl?
JE
I_DONE
;
khoâng, thoaùt
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 102 -
;ñuùng, xöû lyù
CMP
ON_FLAG,1;
thuû tuïc ñang ñöôïc kích hoaït?
JE
RESTOR
;
ñuùng, khöû kích hoaït
MOV
ON_FLAG,1
;
khoâng, kích hoaït
;caát vò trí con troû vaø thoâng tin maøn hình
MOV
AH,03
;
laáy vò trí con troû
MOV
BH,0
;
trang 0
INT
10H
;
DH=haøng,DL=coät
MOV
CURSOR_POS,DX
;
löu vò trí con troû
CALL
SAVE_SCREEN
;
löu maøn hình
;
hieån thò thôøi gian
;
ñònh vò con troû ñeán goùc treân beân phaûi
MOV
DL,72
;
coät 72
CALL
SET_CURSOR
LEA
BX,TIME_BUF
CALL GET_TIME ;
laáy thôøi gian hieän taïi
;
hieån thò thôøi gian
LEA
SI,TIME_BUF
MOV
CX,8
;
8kyù töï
MOV
BH,0
; trang 0
MOV
AH,0EH
;
vieát kyù töï
M1:
LODSB
;
kyù töï trong AL
INT
10H
;
con troû ñöôïc chuyeån
;
ñeán haøng tieáp theo
LOOP
M1
; laëp laïi 8 laàn
JMP
RES_CURSOR
RESTOR:
;phuïc hoài maøn hình
MOV
ON_FLAG,0
;
xoaù côø
CALL
RESTOR_SCREEN
;phuïc hoài vò trí con troû löu tröõ
RES_CURSOR:
MOV
AH,02
;
thieát laäp con troû
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 103 -
MOV
BH,0
MOV
DX,CURSOR_POS
INT
10H
;phuïc hoài caùc thanh ghi
I_DONE: POP DI
POP
SI
POP
DX
POP
CX
POP
BX
POP
AX
POP
ES
POP
DS
IRET
;
trôû veà töø ngaét
MAIN ENDP
C_SEG ENDS
END
START
Taäp tin PGM3_4.ASM
PUBLIC GET_TIME,SETUP_INT
C_SEG SEGMENT
PUBLIC
ASSUME
CS:C_SEG
;
GET_TIME PROC
MOV
AH,2CH
INT
21H
MOV
AL,CH
CALL
CONVERT
MOV
[BX],AX
MOV
AL,CL
CALL
CONVERT
MOV
[BX+3],AX
MOV
AL,DH
CALL
CONVERT
MOV
[BX+6],AX
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 104 -
RET
GET_TIME ENDP
;
CONVERT PROC
MOV
AH,0
MOV
DL,10
DIV
DL
OR
AX,0303H
RET
CONVERT ENDP
;
SETUP_INT PROC
MOV
AH,35H
INT
21H
MOV
[DI],BX
MOV
[DI+2],ES
MOV
DX,[SI]
PUSH
DS
MOV
DS,[SI+2]
MOV
AH,25H
INT
21H
POP
DS
RET
SETUP_INT ENDP
;
C_SEG ENDS
END
LINK PGM3_3+PGM3_2+PGM3_4+PGM3_1.
Chuù yù PGM3_1 ñöôïc lieân keát cuoái cuøng ñeå thuû tuïc INITIALIZE
ñöôïc ñöa vaøo cuoái chöông trình. Vieát caùc chöông trình TSR raát phöùc taïp,
neáu nhö ñaõ coù moät chöông trình TSR khaùc trong heä thoáng, chöông trình
hieän coù coù theå khoâng coøn thöïc hieän ñuùng nöõa
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 105 -
PHUÏ LUÏC A: MOÄT SOÁ CHÖÔNG TRÌNH PHUÏC VUÏ CUÛA DOS
Chöùc naêng
Ngaét
(Hex)
TG vaøo
Keát thuùc chöông trình
20
Keát thuùc nhöng naèm
thöôøng tröïc (max 64KB)
27
DS:DX=ñòachæ byte sau vuøng ñöôïc giöõ
laïi thöôøng truù
CAÙC CHÖÔNG TRÌNH PHUÏC VUÏ CUÛA DOS (NGAÉT 21h)
Chöùc naêng
Soá (Hex)
TG vaøo
TG ra
Ñöa vaøo töø baøn phím
01
AH=01
AL=kyù töï vaøo 8 bit
Ñöa ra maøn hình moät kyù
töï
02
AH=02
DL=kyù töï ra 8 bit
Ñöa ra maùy in
05
AH=05
DL=kyù töï
Ñöa vaøo tröïc tieáp töø baøn
phím vaø khoâng hieän
07
AH=07
AL=kyù töï vaøo 8 bit
Ñöa ra maøn hình moät
chuoãi
09
AH=09
DS:DX = troû ñeán
chuoãi keát thuùc baèng
'$'
Ñöa vaøo ñeäm baøn phím
0A
AH=0A
DS:DX=troû ñeán ñeäm
baøn phím
Thieát laäp vectô ngaét
25
AH=25
AL= soá hieäu ngaét
DS:DX= troû tôùi
chöông trình xöû lyù
ngaét
Laáy ngaøy thaùng naêm
2A
AH=2A
AL=thöù trong tuaàn
CX=naêm (1980-2099
DH=thaùng
DL=ngaøy
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 106 -
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Chöùc naêng
Soá (Hex)
TG vaøo
TG ra
Ñaët ngaøy thaùng naêm
2B
AH=2B
CX=naêm (1980-2099
DH=thaùng
DL=ngaøy
AL=maõ traû veà
Laáy thôøi gian
2C
AH=2C CL=phuùt
CH=giôø
DL=phaàn traêm giaây
DH=giaây
Ñaët thôøi gian
2D
AH=2D
CL=phuùt
CH=giôø
DL=phaàn traêm giaây
DH=giaây
Keát thuùc chöông trình vaø
thöôøng truù
31
AH=31
AL=maõ traû veà
DX=ñòa chæ ñoaïn
chöông trình treân boä
nhôù ñeå giaûi phoùng
AX=maõ traû veà
Laáy vectô ngaét
35
AH=35
AL=soá hieäu ngaét
ES:BX=vectô ngaét
AX=maõ traû veà
Taïo thö muïc
39
AH=39
DS:DX = troû ñeán
chuoãi ASCII teân
ñöôøng
Neáu sai CF=01,
AX= maõ loãi
Neáu toát: CF=00
Xoaù thö muïc
3A
AH=3A
DS:DX = troû ñeán
chuoãi ASCII teân
ñöôøng
Neáu sai CF=01,
AX= maõ loãi
Ñoåi thö muïc hieän thôøi
3B
AH=3B
DS:DX = troû ñeán
chuoãi ASCII teân
ñöôøng
Neáu sai CF=01,
AX= maõ loãi
Taïo file
3C
AH=3C
CX=ñaëc tính file
DS:DX= troû ñeán
AX=theû file hoaëc maõ
traû veà
CF=00 (toát), 01 (sai)
Hôïp Ngöõ
- 107 -
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Chöùc naêng
Soá (Hex)
TG vaøo
TG ra
chuoãi ASCII teân file
Môû theû
3D
AH=3D
CX=maõ truy nhaäp
DS:DX = troû ñeán
chuoãi ASCII teân file
AX=theû file hoaëc maõ
traû veà
Ñoùng theû
3E
AH=3E
BX=theû file
AX=theû file hoaëc maõ
traû veà
Ñoïc file hoaëc töø thieát bò
3F
AH=3F
BX=theû file
CX=soá byte caàn ñoïc
DS:DX= troû ñeán
vuøng ñeäm döõ lieäu
AX=soá byte ñoïc ñöôïc
hoaëc maõ traû veà
Ghi file hoaëc ra thieát bò
40
AH=40
BX=theû file
CX=soá byte caàn ghi
DS:DX= troû ñeán
vuøng ñeäm döõ lieäu
AX=soá byte ghi ñöôïc
hoaëc maõ traû veà
Xoaù file
41
AH=41
DS:DX = troû ñeán
chuoãi ASCII teân file
Neáu sai CF=01, AX=
maõ traû veà
Keát thuùc quaù trình
4C
AH=4C
AL= maõ traû veà
Ñoåi teân file
56
AH=56
DS:DX = troû ñeán
chuoãi ASCII teân cuõ
ES:DI = troû ñeán
chuoãi ASCII teân môùi
Neáu sai CF=01, AX=
maõ traû veà
Hôïp Ngöõ
- 108 -
PHUÏ LUÏC B: MOÄT SOÁ CHÖÔNG TRÌNH PHUÏC VUÏ CUÛA ROM-
BIOS
Chöùc naêng
Ngaét
(Hex)
TG vaøo
TG ra
Di chuyeån con troû
10
AH=2
BH=soá hieäu trang
DH=soá hieäu doøng
DL=soá hieäu coät
Laáy vò trí con troû
10
AH=3
BH=soá hieäu trang
DH=soá hieäu coät
DL=soá hieäu doøng
CH=doøng queùt ñaàu
cuûa con troû
CL=doøng queùt cuoái
cuûa con troû
Ñoïc moät kyù töï vaø thuoäc
tính
10
AH=8
BH=trang maøn hình
AH=thuoäc tính
AL=kyù töï
Ghi 1 kyù töï
10
AH=0E
AL=kyù töï
BL=maøu trong kieåu
ñoà thò
Ñoïc moät cung
13
AH=02
AL= soá cung
CH=raõnh
CL=cung
DL=oå ñóa
ES:BX=con troû ñeán
ñeäm
CF=baùo keát quaû
toát/hoûng
AH=maõ traïng thaùi
AL=soá cung ñöôïc
ñoïc
Ghi moät cung
13
AH=03
AL= soá cung
CH=raõnh
CL=cung
DL=oå ñóa
ES:BX=con troû ñeán
ñeäm
CF=baùo keát quaû
toát/hoûng
AH=maõ traïng thaùi
AL=soá cung ñöôïc ghi
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Hôïp Ngöõ
- 109 -
Nguyeãn Höõu Loäc
Khoa Vaät Lyù
Chöùc naêng
Ngaét
(Hex)
TG vaøo
TG ra
Laáy caùc tham soá hieän
thôøi cuûa oå ñóa
13
AH=08
DL=soá hieäu ñóa
DL=soá oå ñóa
DH=soá löôïng maët
max
CL[0,5]=soá hieäu
cung max
CL[6,7]=2 bit cao
cuûa soá löôïng töø truï
max
CH=ca'c bit thaáp cuûa
soá löôïng töø truï max
CF=côø baùo keát quaû
toát/hoûng
AH=maõ traïng thaùi
Ñoïc kyù töï tieáp töø baøn
phím
16
AH=00
AH=maõ queùt baøn
phím
AL=maõ ASCII
Laáy côø baøn phím
16
AH=02 AL=côø
caùc
phím
bit 0=1: Shift phaûi
bit 1=1: Shift traùi
bit 2=1: Ctrl
bit 3=1: Alt
bit 4=1: Scroll lock
bit 5=1: Num Lock
bit 6=1:Caps lock
bit 7=1: Cheá ñoä cheøn
Göûi moät byte ra maùy in
17
AH=00
AL=kyù töï
DX=soá maùy in
Giaù trò caùc bit:
0: quaù thôøi gian
1: khoâng söû duïng
2: khoâng söû duïng
3=1:loái vaøo/ra
4=1: ñaõ ñöôïc choïn
5=1:heát giaáy
6=1:xaùc nhaän
7=1:khoâng baän
Hôïp Ngöõ
- 110 -
TAØI LIEÄU THAM KHAÛO
1. Ngoân ngöõ laäp trình Assembly vaø maùy vi tính IBM-PC - Ytha Yu vaø
Charles Marut (Quaùch Tuaán Ngoïc-Ñoã Tieán Duõng- Nguyeãn Quang
Khaûi bieân dòch) - Nhaø xuaát baûn Giaùo duïc
2. Laäp trình Hôïp ngöõ Turbo Assembler 2.0 - Phan Tröông Daàn - Nhaø xuaát
baûn Giaùo duïc
3. Caåm nang laäp trình - Peter Norton (Nguyeãn Minh San dòch) - Nhaø xuaát
baûn Giaùo Duïc
4. Caåm nang cho ngöôøi laäp trình treân maùy vi tính IBM- Peter Norton -
Nhaø xuaát baûn Thoáng keâ - Vieän Ñieän töû - Tin hoïc
5. Assembleur facile - PhMercier- Marabout
6. Hardware Reference Manual 8088 - Intel
7. Macro Assembler Programmer's Guide 5.0 - Microsoft
Nguyeãn Höõu Loäc
Khoa Vaät Lyù