Thông tin tài liệu
Vi xử lí
CHÖÔNG 4
LAÄP TRÌNH BAÈNG HÔÏP NGÖÕ VÔÙI 8088
Môû ñaàu
Trong chöông tröôùc ta ñaõ giôùi thieäu khaù tæ mæ taäp leänh cuûa boä vi xöû lyù
8086/88. Trong chöông naøy ta seõ giôùi thieäu caùch laäp trình duøng hôïp ngöõ treân
caùc maùy IBM PC hoaëc töông thích vôùi IBM PC (töø nay ñöôïc goïi chung laø IBM
PC), vì ñoù laø moâi tröôøng phoå thoâng vaø tieän lôïi nhaát ñeå taïo ra vaø thöû nghieäm
caùc chöông trình vieát baèng hôïp ngöõ. Noùi nhö vaäy laø vì a) veà phaàn cöùng, maùy
IBM PC coù caáu truùc khaù tieâu bieåu cuûa moät heä vi xöû lyù, b) veà phaàn meàm, ta coù
theå taän duïng caùc chöông trình soaïn thaûo vaên baûn hoaëc raát nhieàu chöùc naêng saün
coù khaùc cuûa maùy IBM PC cho caùc chöông trình cuûa ta thoâng qua caùc dòch vuï
(caùc chöông trình con phuïc vuï ngaét) cuûa caùc ngaét cuûa DOS (Disk Operating
System, heä ñieàu haønh) vaø cuûa BIOS (Basic Inpus Output System, heä thoáng
vaøo ra cô sôû). Tuy nhieân, moät heä thoáng vi xöû lyù cuï theå coù theå coù keát caáu khaùc
moät maùy vi tính IBM PC, do ñoù khi laäp trình cho caùc heä thoáng giaû ñònh kieåu
nhö vaäy, seõ coù nhöõng chöông trình maø ta khoâng theå ñem thöû nghieäm treân maùy
IBM PC ñöôïc. Caùc chöông trình naøy seõ ñöôïc ñaùnh daáu caån thaän baèng daáu ///
ñeå ta khoâng ñem chuùng cho chaïy thöû treân IBM PC nhaèm traùnh caùc haäu quaû
ñaùng tieác coù theå xaûy ra. Ta seõ söû duïng chöông trình dòch hôïp ngöõ MASM 5.0
(Macro assemler phieân baûn 5.0) cuûa Microsoft vôùi caùch ñònh nghóa ñoaïn ñôn
giaûn vaø cheá ñoä boä nhôù nhoû. Ñieàu naøy hoaøn toaøn ñuû ñeå ñaùp öùng caùc yeâu caàu
naûy sinh khi ta thöïc hieän caùc chöông trình ñôn giaûn ban ñaàu. Ta cuõng coù theå
duøng chöông trình dòch hôïp ngöõ TASM 4.0 (Turbo assembler phieân baûn 4.0)
cuûa Borland International ñeå thöû nghieäm caùc chöông trình hôïp ngöõ.
1. Giôùi thieäu chung cuûa chöông trình hôïp ngöõ
1.1. Cuù phaùp cuûa chöông trình hôïp ngöõ
Tröôùc khi trình baøy caùch laäp trình baèng hôïp ngöõ ta phaûi tìm hieåu qua cuù
phaùp cuûa ngoân ngöõ naøy, bôûi vì nhö ta ñaõ bieát, ñeå laøm vieäc ñöôïc vôùi baát kyø moät
ngoân ngöõ laäp trình naøo ta cuõng caàn naém ñöôïc cuù phaùp cuûa noù. Chöông trình
döôùi daïng hôïp ngöõ maø ta vieát ra, neáu ñuùng veà cuù phaùp, seõ ñöôïc chöông trình
dòch hôïp ngöõ MASM dòch ra maõ maùy, töø chöông trình maõ maùy naøy ta coù theå
taïo ra caùc chöông trình chaïy (thöïc hieän) ñöôïc ngay baèng caùch dòch tieáp ra caùc
teäp coù ñuoâi EXE hoaëc COM. Do vaäy khi vieát moät chöông trình hôïp ngöõ ta
97
Vi xử lí
phaûi tuaân thuû nhöõng quy taéc cuù phaùp nhaát ñònh ñeå chöông trình MASM coù theå
hieåu vaø dòch ñöôïc noù.
Moät chöông trình hôïp ngöõ bao goàm caùc doøng leänh, moät doøng leänh coù
theå laø moät leänh thaät döôùi daïng kyù hieäu (symbolic), maø ñoâi khi coøn ñöôïc goïi laø
daïng gôïi nhôù (mnemonic) cuûa boä vi xöû lyù, hoaëc moät höôùng daãn cho chöông
trình dòch (assembler directive). Leänh gôïi nhôù seõ ñöôïc dòch ra maõ maùy coøn
höôùng daãn cho chöông trình dòch thì khoâng ñöôïc dòch, vì noù chæ coù taùc duïng chæ
daãn rieâng thöïc hieän coâng vieäc. Ta coù theå vieát caùc doøng leänh naøy baèng chöõ hoa
hoaëc chöõ thöôøng vaø chuùng seõ ñöôïc coi laø töông ñöông vì ñoái vôùi doøng leänh
chöông trình dòch khoâng phaân bieät kieåu chöõ.
Moät doøng leänh cuûa chöông trình hôïp ngöõ coù theå coù nhöõng tröôøng sau
(khoâng nhaát thieát phaûi coù ñuû heát taát caû caùc tröôøng):
Nhãn
Maõ leänh
Caùc toaùn daïng
Chuù giaûi
Moät ví duï doøng leänh gôïi nhôù:
TIEP : MOV AH, {BX} {SI} ; naïp vaøo AH noäi dung oâ
; nhôù coù ñòa chæ DS : (BX+SI)
Trong ví duï treân, taïi tröôøng teân ta coù nhaõn TIEP, taïi tröôøng maõ leänh ta
coù leänh MOV, taïi tröôøng toaùn haïng ta coù caùc thanh ghi AH, BX vaø SI vaø phaàn
chuù giaûi goàm coù caùc doøng
; naïp vaøo AH noäi dung oâ
; nhôù coù ñòa chæ DS : (BX+SI)
Moät ví duï khaùc laø caùc doøng leänh vôùi caùc höôùng daãn cho chöông trình
dòch:
MAIN
PROC
vaø
MAIN
ENDP
Trong ví duï naøy, ôû tröôøng teân ta coù teân thuû tuïc laø MAIN, ôû tröôøng maõ
leänh ta coù caùc leänh giaû PROC vaø ENDP. Ñaây laø caùc leänh giaû duøng ñeå baét ñaàu
vaø keát thuùc moät thuû tuïc coù teân laø MAIN.
• Tröôøng teân
Tröôøng teân chöùa caùc nhaõn, teân bieán hoaëc teân thuû tuïc. Caùc teân vaø nhaõn
naøy seõ ñöôïc chöông trình dòch gaùn baèng caùc ñòa chæ cuï theå cuûa oâ nhôù. Teân vaø
nhaün coù theå coù ñoä daøi 1..31 kyù töï, khoâng ñöôïc chöùa daáu caùch vaø khoâng ñöôïc
baét ñaàu baèng soá. Caùc kyù töï ñaëc bieät khaùc coù theå duøng trong teân laø ?.@_$%.
Neáu daáu chaám ('.') ñöôïc duøng thì noù phaûi ñöôïc ñaët ôû vò trí ñaàu tieân cuûa teân.
Noùi chung ta cöù ñaët caùc teân bình thöôøng vaø coù yù nghóa laø seõ ít khi bò sai. Moät
nhaõn thöôøng keát thuùc baèng daáu hai chaám (:).
• Tröôøng maõ leänh
98
Vi xử lí
Trong tröôøng maõ leänh noùi chung seõ coù caùc leänh thaät hoaëc leänh giaû.
Ñoái vôùi caùc leänh thaät thì tröôøng naøy chöùa caùc maõ leänh gôïi nhôù. Maõ leänh
naøy seõ ñöôïc chöông trình dòch dòch ra maõ maùy.
Ñoái vôùi caùc höôùng daãn chöông trình dòch thì tröôøng naøy chöùa caùc leänh
giaû vaø seõ khoâng ñöôïc dòch ra maõ maùy.
• Tröôøng toaùn haïng
Ñoái vôùi moät leänh thì tröôøng naøy chöùa caùc toaùn haïng cuûa leänh. Tuøy theo
töøng loaïi leänh maø ta coù theå coù 0,1 hoaëc 2 toaùn haïng trong moät leänh. Trong
tröôøng hôïp caùc leänh vôùi 1 toaùn haïng thoâng thöôøng ta coù toaùn haïng laø ñích
hoaëc goác, coøn trong tröôøng hôïp leänh vôùi 2 toaùn haïng thì ta coù 1 toaùn haïng laø
ñích vaø 1 toaùn haïng laø goác.
Ñoái vôùi höôùng daãn chöông trình dòch thì tröôøng naøy chöùa caùc thoâng tin
khaùc nhau lieân quan ñeán caùc leänh giaû cuûa höôùng daãn.
• Tröôøng chuù giaûi
Lôøi giaûi thích ôû tröôøng chuù giaûi phaûi ñöôïc baét ñaàu baèng daáu chaám phaåy
(;) Tröôøng chuù giaûi naøy ñöôïc daønh rieâng cho ngöôøi laäp trình ñeå ghi caùc lôøi giaûi
thích cho caùc leänh cuûa chöông trình vôùi muïc ñích giuùp cho ngöôøi ñoïc chöông
trình deã hieåu caùc thao taùc cuûa chöông trình hôn. Lôøi chuù giaûi cuõng coù lôïi ngay
cho chính taùc giaû cuûa noù vì sau moät thôøi gian khoâng xem ñeán chöông trình thì
moïi vieäc laïi nhö môùi. Khi ñoïc thaáy daáu chaám phaåy, chöông trình dòch boû qua
khoâng dòch töø phaàn naøy trôû ñi. Chính vì vaäy ngöôøi ta cuõng thöôøng hay duøng
daáu naøy ñeå loaïi boû moät doøng leänh naøo ñoù trong chöông trình. Thoâng thöôøng
lôøi chuù giaûi caàn phaûi mang ñuû thoâng tin ñeå giaûi thích veà thao taùc cuûa leänh
trong hoaøn caûnh cuï theå vaø nhö theá thì môùi coù ích cho ngöôøi ñoïc. Ñoái vôùi
nhöõng ngöôøi môùi laäp trình baèng hôïp ngöõ coøn thieáu kinh nghieäm thì lôøi chuù giaûi
coøn phaûn aûnh söï hieåu bieát veà vaán ñeà phaûi giaûi quyeát cuûa hoï, vì neáu khoâng
hieåu thaáu ñaùo vaán ñeà thì khoâng ñeå ñöa ra lôøi chuù giaûi toát ñöôïc. Toùm laïi laø ta
neân traùnh vieäc ñöa ra moät lôøi chuù giaûi voâ boå (khoâng mang thoâng tin) kieåu nhö:
MOV BX, 0
; ñöa 0 vaøo thanh ghi BX
Vì töï thaân leänh gôïi nhôù ñoù ñaõ coù yù nghóa nhö lôøi giaûi thích roài. Neáu trong baøi
toaùn cuï theå thanh ghi BX ñöôïc choïn duøng laøm toång tích luyõ cho moät tính toaùn
nhaát ñònh ta coù theå coù lôøi chuù giaûi hôn nhö sau:
MOV BX, 0 ;
toång tích luyõ ôû BX luùc ñaàu baèng 0.
Ta cuõng coù theå duøng moät vaøi doøng leänh chæ ñeå laøm chuù giaûi cho moät
coâng vieäc naøo ñoù. Caàn löu yù laø moãi doøng chuù giaûi ñoù phaûi baét ñaàu baèng daáu
chaám phaåy. Ví duï:
; khôûi ñaàu thanh ghi DS vaø ES trong ñoaïn döõ lieäu
MOV AX, @DATA
99
Vi xử lí
MOV DS, AX
MOV ES, AX
1.2. Döõ lieäu cho chöông trình
Döõ lieäu cuûa moät chöông trình hôïp ngöõ laø raát ña daïng. Caùc döõ lieäu coù
theå ñöôïc cho döôùi daïng soá heä hai, heä möôøi, heä möôøi saùu hoaëc döôùi daïng kyù töï
(caàn chuù yù laø treân caùc maùy IBM PC trong chöông trình DEBUG, moät coâng cuï
tìm loãi raát thoâng duïng cho caùc chöông trình hôïp ngöõ ñôn giaûn, döõ lieäu baèng soá
ñöôïc ngaàm ñònh phaûi ôû heä möôøi saùu).
Khi cung caáp soá lieäu cho chöông trình, soá cho ôû heä naøo phaûi ñöôïc keøm
ñuoâi cuûa heä ñoù nhö ta ñaõ noùi roõ ôû chöông I (tröø heä möôøi thì khoâng caàn vì laø
tröôøng hôïp ngaàm ñònh cuûa assembler). Rieâng ñoái vôùi soá heä möôøi saùu neáu soá
ñoù baét ñaàu baèng caùc chöõ (a.f hoaëc A.. F) thì ta phaûi theâm 0 ôû tröôùc ñeå chöông
trình dòch coù theå hieåu ñöôïc ñoù laø moät soá heä möôøi saùu chöù khoâng phaûi laø moät
teân hoaëc moät nhaõn.
Ví duï caùc soá vieát ñuùng:
0011B
; Soá heä hai.
1234
; Soá heä möôøi
0ABBAH
; Soá heä möôøi saùu, khoâng nhaàm ñöôïc vôùi
; teân cuûa moät ban nhaïc noåi tieáng ABBA.
1EF1H
; Soá heä möôøi saùu.
Neáu döõ lieäu laø kyù töï hoaëc chuoãi kyù töï thì chuùng phaûi ñöôïc ñoùng trong
caêpk daáu trích daãn ñôn hoaëc keùp, thí duï 'A' hay "abcd". Chöông trình dòch seõ
dòch kyù töï ra maõ ASCII töông öùng cuûa noù, vì vaäy trong khi cung caáp döõ lieäu
kieåu kyù töï cho chöông trình ta coù theå duøng baûn thaân kyù töï ñöôïc ñoùng trong daáu
trích daãn hoaëc maõ ASCII cuûa noù. Ví duï, ta coù theå söû duïng lieäu kyù töï laø "0"
hoaëc maõ ASCII töông öùng laø 30H, ta cps theå duøng '$' hoaëc 26H hoaëc 34...
1.3. Bieán vaø haèng
Bieán trong chöông trình hôïp ngöõ coù vai troø nhö noù coù ôû ngoân ngöõ baäc
cao. Moät bieán phaûn ñöôïc ñònh kieåu döõ lieäu laø kieåu byte hay kieåu töø vaø seõ ñöôïc
chöông trình dòch gaùn cho moät ñòa chæ nhaát ñònh trong boä nhôù. Ñeå ñònh nghóa
caùc kieåu döõ lieäu khaùc nhau ta thöôøng duøng caùc leänh giaû sau:
DB (define byte)
: ñònh nghóa bieán kieåu byte
DW (define word)
: ñònh nghóa bieán kieåu töø
DD (define double word)
: ñònh nghóa bieán kieåu töø keùp
Bieán byte
100
Vi xử lí
Bieán kieåu byte seõ chieám 1 byte trong boä nhôù. Höôùng daãn chöông trình
dòch ñeå ñònh nghóa bieán kieåu byte coù daïng toång quaùt nhö sau:
Teân DB giaù_ trò_khôûi_ñaàu
Ví duï:
B1
DB 4
Ví duï treân ñònh nghóa bieán byte coù teân laø B1 vaø daønh 1 byte trong boä
nhôù cho noù ñeå chöùa giaù trò khôûi ñaàu baèng 4.
Neáu trong leänh treân ta duøng daáu? thay vaøo vò trí cuûa soá 4 thì bieán B1 seõ
ñöôïc daønh choã trong boä nhôù nhöng khoâng ñöôïc gaùn giaù trò khôûi ñaàu. Cuï theå
doøng leänh giaû:
B2
DB ?
chæ ñònh nghóa 1 bieán byte coù teân laø B2 vaø daønh cho noù moät byte trong boä nhôù.
Moät tröôøng hôïp ñaëc bieät cuûa bieán byte laø bieán kyù töï. Ta coù theå coù ñònh
nghóa bieán kyø töï nhö sau:
C1
DB ' $'
C2
DB 34
• Bieán töø
Bieán töø cuõng ñöôïc ñònh nghóa theo caùch gioáng nhö bieán byte. Höôùng
daãn chöông trình dòch ñeå ñònh nghóa bieán töø coù daïng nhö sau:
Teân DB giaù_ trò_khôûi_ñaàu
Ví duï:
W1 DW 40
Ví duï treân ñònh nghóa bieán töø coù teân laø W1 vaø daønh 2 byte trong boä nhôù
cho noù ñeå chöùa giaù trò khôûi ñaàu baèng 40.
Chuùng ta cuõng coù theå söû duïng daáu? chæ ñeå ñònh nghóa vaø daønh 2 byte
trong boä nhôù cho bieán töø W2 maø khoâng gaùn giaù trò ñaàu cho noù baèng doøng leänh
sau:
W2 DW ?
• Bieán maûng
Bieán maûng laø bieán hình thaønh töø moät daõy lieân tieáp caùc phaàn töû cuøng
loaïi byte hoaëc töø, khi ñònh nghóa bieán maûng ta gaùn teân cho moät daõy lieân tieáp
caùc byte hay töø trong boä nhôù cuøng vôùi caùc giaù trò ban ñaàu töông öùng.
Ví duï:
M1 DB 4, 5, 6, 7, 8, 9
Ví duï treân ñònh nghóa bieán maûng coù teân laø M1 goàm 6 byte vaø daønh choã
cho noù trong boä nhôù töø ñòa chæ öùng vôùi M1 ñeå chöùa caùc giaù trò khôûi ñaàu baèng 4,
5, 6, 7, 8, 9. Phaàn töû ñaàu toûng maûng laø 4 vaø coù ñòa chæ truøng vôùi ñòa chæ cuûa
M1, phaàn töû thöù hai laø 5 vaø coù ñòa chæ M1+1...
101
Vi xử lí
Khi chuùng ta muoán khôûi ñaàu caùc phaàn töû cuûa maûng vôùi cuøng moät giaù trò
chuùng ta coù theå duøng theâm toaùn töû DUP trong leänh.
Ví duï:
M2 DB 100 DUP (0)
M3 DB 100 DUP (?)
Ví duï treân ñònh nghóa moät bieán maûng teân laø M2 goàm 100 byte, daønh
choã trong boä nhôù cho noù ñeå chöùa 100 giaù trò khôûi ñaàu baèng 0 vaø bieán maûng
khaùc teân laø M3 goàm 100byte, daønh saün choã cho noù trong boä nhôù ñeå chöùa 100
giaù trò nhöng chöa ñöôïc khôûi ñaàu.
Toaùn töû DUP coù theå loàng nhau ñeå ñònh nghóa ra 1 maûng.
Ví duï: doøng leänh
M4 DB 4, 3, 2, 2 DUP(1,2 DUP(5),6)
Seõ ñònh nghóa ra moät maûng M4 töông ñöông vôùi leänh sau:
M4 DB 4,3,2,1,5,5,6,1,5,5,6
Moät ñieàu caàn chuù yù nöõa laø ñoái vôùi caùc boä vi xöû lyù cuûa Intel, neáu ta coù
moät töø ñeå trong boä nhôù thì byte thaáp cuûa noù seõ ñöôïc ñeå ôû oâ nhôù coù ñòa chæ
thaáp, byte cao seõ ñöôïc ñeå ôû oâ nhôù coù ñòa chæ cao. Caùch löu giöõ soá lieäu kieåu
naøy cuõng coøn coù theå thaáy ôû caùc maùy VAX cuûa Digital hoaëc cuûa moät soá haõng
khaùc vaø thöôøng goïi laø 'quy öôùc ñaàu beù' (little endian, byte thaáp ñöôïc caát taïi
ñòa chæ thaáp). Cuõng neân noùi theâm ôû ñaây laø caùc boä vi xöû lyù cuûa motorola laïi coù
caùch caát soá lieäu theo thöù töï ngöôïc laïi hay coøn ñöôïc goïi laø 'quy öôùc ñaàu to' (big
endian byte cao ñöôïc caát taïi ñòa chæ thaáp)
.
Ví duï: Sau khi ñònh nghóa bieán töø coù teân laø WORDA nhö sau:
WORDA
DW OFFEEH
Thì ôû trong boä nhôù thaáp (EEH) seõ ñöôïc ñeå taïi ñòa chæ WORDA coøn byte
cao (FFH) seõ ñöôïc ñeå taïi ñòa chæ tieáp theo, töùc laø taïi WORDA+1.
• Bieán kieåu xaâu kí töï
Bieán kieåu xaâu kí töï laø moät tröôøng hôïp ñaëc bieät cuûa bieán maûng, trong ñoù
caùc phaàn töû cuûa maûng laø caùc kí töï. Moät xaâu kí töï coù theå ñöôïc ñònh nghóa
baèng caùc kí töï hoaëc baèng maõ ASCII cuûa caùc kí töï ñoù.
Caùc ví duï sau ñeàu laø caùc leänh ñuùng vaø ñeàu ñònh nghóa cuøng moät
xaâu kí töï nhöng gaén noù cho caùc teân khaùc nhau:
STR1 DB 'string'
STR2 DB 73h, 74h, 72h, 69h, 6Eh, 67h
STR3 DB 73h, 74h, 'x' 'i', 6Eh, 67h
102
Vi xử lí
• Haèng coù teân
Caùc haèng trong chöông trình hôïp ngöõ thöôøng ñöôïc gaùn teân ñeå laøm cho
chöông trình trôû neân deã ñoïc hôn.
Haèng coù theå laø kieåu soá hay kieåu kyù töï. Vieäc gaùn teân cho haèng ñöôïc
thöïc hieän nhôø leänh giaû EQU (equate) nhö sau:
CR EQU 0Dh ;CR laø carriage return
LE
EQU 0Ah ;LF laø line feed
Trong ví duï treân leänh giaû EQU gaùn giaù trò soá 13 (maõ ASCII cuûa kí töï trôû
veà ñaàu doøng) cho teân CR vaø 10 (maõ ASCII cuûa kyù töïu theâm doøng môùi) cho teân
LF.
Haèng cuõng coù theå laø moät chuoãi kyù töï. trong ví duï döôùi ñaây sau khi ñaõ
gaùn moät chuoãi kyù töï cho moät teân:
CHAO EQU 'Hello'
ta coù theå söû duïng haèng naøy ñeå ñònh nghóa moät bieán maûng khaùc.
MSG DB CHAO, '$'
Vì leänh giaû EQU khoâng daønh choã cuûa boä nhôù cho teân cuûa haèng neân ta
coù theå ñaët noù khaù töï do taïi nhöõng choã thích hôïp beân trong chöông trình. Tuy
nhieân trong thöïc teá ngöôøi ta thöôøng ñaët caùc ñònh nghóa naøy trong ñoaïn döõ lieäu.
1.4. Khung cuûa moät chöông trình hôïp ngöõ
Moät chöông trình maõ maùy trong boä nhôù thöôøng bao goàm caùc vuøng nhôù
khaùc nhau ñeå chöùa maõ leänh, chöùa döõ lieäu cuûa chöông trình vaø moät vuøng nhôù
khaùc ñöôïc duøng laøm ngaên xeáp phuïc vuï hoaït ñoäng cuûa chöông trình. Chöông
trình vieát baèng hôïp ngöõ cuõng phaûi coù caáu truùc töông töï ñeå khi ñöôïc dòch noù seõ
taïo ra maõ töông öùng vôùi chöông trình maõ maùy noùi treân. Ñeå taïo ra söôøn cuûa
moät chöông trình hôïp ngöõ chuùng ta seõ söû duïng caùch ñònh nghóa ñôn giaûn ñoái
vôùi moâ hình boä nhôù daønh cho chöông trình vaø ñoái vôùi caùc thanh ghi ñoaïn, caùch
ñònh nghóa ñöôïc pheùp töø phieân baûn 5.0 cuûa Microsoft Macro Aesembler,...
• Khai baùo quy moâ söû duïng boä nhôù
Kích thöôùc cuûa boä nhôù daønh cho ñoaïn maõ vaø ñoaïn döõ lieäu trong moät
chöông trình ñöôïc xaùc ñònh nhôø höôùng daãn chöông trình dòch MODEL nhö sau
(höôùng daãn naøy phaûi ñöôïc ñaët tröôùc caùc höôùng daãn khaùc trong chöông trình
hôïp ngöõ, nhöng sau höôùng daãn veà loaïi CPU):
.MODEL
Kieåu_ kích_thöôùc_boä_nhôù
103
Vi xử lí
Coù nhieàu Kieåu_ kích_thöôùc_boä_nhôù cho caùc chöông trình vôùi ñoøi hoûi
dung löôïng boä nhôù khaùc nhau. Ñoái vôùi ta thoâng thöôøng caùc öùng duïng ñoøi hoûi
maõ chöông trình daøi nhaát cuõng chæ caàn chöùa trong moät ñoaïn (64KB), döõ lieäu
cho chöông trình nhieàu nhaát cuõng chæ caàn chöùa trong moät ñoaïn, thích hôïp nhaát
neân choïn Kieåu_ kích_thöôùc_boä_nhôù laø Small (nhoû) hoaëc neáu nhö taát caû maõ
vaø döõ lieäu coù theå goùi troïn ñöôïc trong moät ñoaïn thì coù theå choïn Tiny(heïp):
.Model
small
hoaëc
.Model
Tiny
Ngoaøi Kieåu_ kích_thöôùc_boä_nhôù nhoû hoaëc heïp noùi treân, tuyø theo nhu
caàu cuï theå MASM coøn cho pheùp söû duïng caùc Kieåu_ kích_thöôùc_boä_nhôù khaùc
nhö lieät keâ trong baûng 4.1
Baûng 4.1. Caùc kieåu kích thöôùc boä nhôù cho chöông trình hôïp ngöõ
Kieåu kích thöôùc Moâ taû
Tiny
Maõ leänh vaø döõ lieäu goùi goïn trong moät ñoaïn
(Heïp)
Small
Maõ leänh goùi goïn trong moät ñoaïn , döõ lieäu
(Nhoû)
naèm trong moät ñoaïn.
Medium
Maõ leänh khoâng goùi goïn trong moät ñoaïn , döõ
(Trung bình)
lieäu naèm trong moät ñoaïn.
Compact
Maõ leänh khoâng goùi goïn trong moät ñoaïn , döõ
(Goïn)
lieäu khoâng goùi goïn trong moät ñoaïn.
Large
Maõ leänh khoâng goùi goïn trong moät ñoaïn , döõ
(lôùn)
lieäu khoâng goùi goïn trong moät ñoaïn.
khoâng coù maûng naøo lôùn hôn 64KB.
Huge
Maõ leänh khoâng goùi goïn trong moät ñoaïn , döõ
(Ñoà soä)
lieäu khoâng goùi goïn trong moät ñoaïn.
caùc maûng coù theå lôùn hôn 64KB
• Khai baùo ñoaïn ngaên xeáp
Vieäc khai baùo ñoaïn ngaên xeáp laø coát ñeå daønh ra moät vuøng nhôù ñuû lôùn
duøng laøm ngaên xeáp phuïc vuï cho hoaït ñoäng cuûa chöông trình khi coù
chöông trình con. Vieäc khai baùo ñöôïc thöïc hieän nhôø höôùng daãn chöông
trình dòch nhö sau.
.STACK
Kích_thöôùc
104
Vi xử lí
Kích_thöôùc seõ quyeát ñònh soá byte daønh cho ngaên xeáp. Neáu ta khoâng khai
Kích_thöôùc thì chöông trình dòch seõ töï ñoäng gaùn cho Kích_thöôùc giaù trò 1 KB,
ñaây laø kích thöôùc ngaên xeáp quaù lôùn ñoái vôùi moät öùng duïng thoâng thöôøng. Trong
thöïc teá caùc baøi toaùn cuûa ta thoâng thöôøng vôùi 100-256 byte laø ñuû ñeå laøm ngaên
xeáp vaø ta coù theå khai baùo kích thöôùc cho noù nhö sau:
.Stack
100
Hoaëc
.Stack
100H
• Khai baùo ñoaïn döõ lieäu (Data)
Ñoaïn döõ lieäu chöùa toaøn boä caùc ñònh nghóa cho caùc bieán cuûa chöông
trình. Caùc haèng cuõng neân ñöôïc ñònh nghóa ôû ñaây ñeå ñaûm baûo tính heä thoáng
maëc duø ta coù theå ñeå chuùng ôû trong chöông trình nhö ñaõ noùi ôû phaàn treân.
Vieäc khai baùo ñoaïn döõ lieäu ñöôïc thöïc hieän nhôø höôùng daãn
chöông trình dòch DATA, vieäc khai baùo vaø haèng ñöôïc thöïc hieän tieáp ngay sau
ñoù baèng caùc leänh thích hôïp. Ñieàu naøy ñöôïc minh hoaï trong caùc thí duï ñôn giaûn
sau:
.DATA
MSG DB
'helo!$'
CR DB
13
LF
EQU
10
• Khai baùo ñoaïn maõ (Code)
Ñoaïn maõ chöùa maõ leänh cuûa chöông trình. Vieäc khai baùo ñoaïn maõ ñöôïc
thöïc hieän nhôø höôùng daãn chöông trình dòch .CODE nhö sau:
.CODE
Beân trong ñoaïn maõ, caùc doøng leänh phaûi ñöôïc toå chöùc moät caùch hôïp lyù,
ñuùng ngöõ phaùp döôùi daïng moät chöông trình chính (CTC) vaø neáu caàn thieát thì
keøm theo caùc chöông trình con (ctc). Caùc chöông trình con seõ ñöôïc goïi ra baèng
caùc leänh CALL coù maët beân trong chöông trình chính.
105
Vi xử lí
Moät thuû tuïc (PROCEDURE) ñöôïc ñònh nghóa nhôø caùc leänh giaû mở đầu
bằng PROC vaø kết thúc bằng ENDP. Nhö vaäy moät chöông trình chính coù theå
ñöôïc ñònh nghóa baèng caùc leänh giaû PROC vaø ENDP theo maãu sau:
Teân_CTC Proc
; Caùc leänh cuûa thaân chöông trình chính
:
CALL Teân_ ctc; goïi ctc
:
Teân_CTC Endp
Gioáng nhö chöông trình chính, một chương trình con cuõng ñöôïc ñònh
nghóa döôùi daïng moät thuû tuïc nhôø caùc leänh giaû PROC vaø ENDP theo maãu sau:
Teân_ctc
Proc
; caùc leänh thaân chöông trình con
:
RET
Teân_ctc Endp
Trong caùc chöông trình noùi treân, ngoaøi caùc leänh giaû coù tính nghi thöùc
baét buoäc ta caàn chuù yù ñeán söï boá trí cuûa leänh goïi (CALL) trong chöông trình
chính vaø leänh veà (RET) trong chöông trình con.
Ghi chú: hãy qui chiếu với ngôn ngữ C:
function()
{
…. ;
…. ;
Return value ;
}
• Khung cuûa chöông trình hôïp ngöõ ñeå dòch ra chöông trình .EXE
Töø caùc khai baùo caùc ñoaïn cuûa chöông trình ñaõ noùi ôû treân ta coù theå xaây
döïng moät khung toång quaùt cho caùc chöông trình hôïp ngöõ vôùi kieåu kích thöôùc
boä nhôù nhoû. Sau ñaây laø moät khung cho chöông trình hôïp ngöõ ñeå roài sau khi
ñöôïc dòch (assembled) noái (linked) treân maùy IBM PC seõ taïo ra moät teäp
chöông trình chaïy ñöôïc ngay (executable) vôùi ñuoâi .EXE.
Hãy đặt cho chương trinhg một tên với đuôi .ASM:
prog.asm
(sau đây là nội dung và lưu lại với tên têp là prog.asm)
;Khai báo mô hình bộ nhớ và các phân đoạn bộ nhớ
106
Vi xử lí
. Model small
. Stack 100
. Data
; caùc ñònh nghóa cho bieán vaø haèng ñeå taïi ñaây
. Code
MAIN Proc
; Khôûi ñaàu cho DS
MOV AX, @Data
MOV DS, AX
; Caùc leänh cuûa chöông trình chính ñeå taïi ñaây
; Trôû veà DOS duøng haøm 4CH cuûa INT 21H
MOV AH, 4CH
INT 21 H
MAIN Endp
; caùc chöông trình con (neáu coù ) ñeå taïi ñaây
END MAIN ;Kết thúc chương trình chính prog.asm
Trong khung chöông trình treân, taïi doøng cuoái cuøng cuûa chöông
trình ta duøng höôùng daãn chöông trình dòch END vaø tieáp theo laø MAIN
ñeå keát thuùc toaøn boä chöông trình. Ta coù nhaän xeùt raèng MAIN laø teân cuûa
chöông trình chính nhöng quan troïng hôn vaø veà thöïc chaát thì noù laø nôi
baét ñaàu caùc leänh cuûa chöông trình trong ñoaïn maõ.
Khi moät chöông .EXE ñöôïc naïp vaøo boä nhôù. DOS seõ taïo ra moät
maûng goàm 256 byte cuûa caùi goïi laø ñoaïn maøo ñaàu chöông trình
(Programsegment prefix. PSP) duøng ñeå chöùa caùc thoâng tin lieân quan
ñeán chöông trình vaø caùc thanh ghi DS vaø ES. Do vaäy DS vaø ES khoâng
chöùa giaù trò ñòa chæ cuûa caùc ñoaïn döõ lieäu cho chöông trình cuûa chuùng ta.
Ñeå chöông trình coù theå chaïy ñuùng ta phaûi coù caùc leänh sau ñeå khôûi ñaàu
cho thanh ghi DS (hoaëc caES nöõa neáu caàn):
MOV AX, @Data
MOV DS, AX
;MOV ES, AX
; neáu không cần khởi động ES thì boû ';'
trong ñoù @ Data laø teân cuûa ñoaïn döõ lieäu. Data ñònh nghóa bôûi höôùng
daãn chöông trình dòch seõ dòch teân @ Data thaønh giaù trò soá cuûa ñoaïn döõ
lieäu. Ta phaûi duøng thanh ghi AX laøm trung gian cho vieäc khôûi ñaàu DS
nhö treân laø do boä vi xöû lyù 8086/88, Vì nhöõng lí do kyõ thuaät, khoâng cho
pheùp chuyeån giaù trò soá (cheá ñoä ñòa chæ töùc thì) vaøo caùc thanh ghi ñoaïn.
Thanh ghi AX cuõng coù theå ñöôïc thay theá baèng caùc thanh ghi khaùc.
107
Vi xử lí
Sau ñaây laø ví duï cuûa moät chöông trình hôïp ngöõ ñöôïc vieát ñeå dòch
ra chöông trình vôùi ñuoâi .EXE. khi cho chaïy, chöông trình naøy seõ hieän
leân maøn hình lôøi chaøo 'Hello' naèm giöõa hai doøng troáng caùch ñeàu caùc
doøng mang daáu nhaéc cuûa DOS.
Chöông trình 4.1 Chöông trình Hello.EXE
. Model Small
. Stack 100
. Data
CRLF
DB 13,10,' $ '
MSG
DB ' Hello!$ '
. Code
MAIN Proc
; khôûi ñaàu thanh ghi DS
MOV AX,@Data
MOV DS, AX
; veà ñaàu doøng môùi duøng haøm 9 cuûa INT 21H
MOV AH, 9
LEA DX, CRLF
INT 21H
; hieän thò lôøi chaøo duøng haøm 9 cuûa INT 21H
MOV AH, 9
LEA DX, MSG
INT 21H
; veà ñaàu doøng môùi duøng haøm 9 cuûa INT 21H
MOV AH, 9
LEA DX, CFLF
INT 21H
; trôû veà DOS duøng haøm 9 cuûa INT 21H
MOV AH, 4CH
INT 21H
MAIN Endp
END MAIN
Trong ví duï treân chuùng ta ñaõ söû duïng caùc dòch vuï coù saün (caùc
haøm 9 vaø 4CH) cuûa ngaét INT 21H cuûa DOS treân maùy IBM PC ñeå hieän
thò xaâu kyù töï vaø trôû veà DOS moät caùch thuaän lôïi.
Chuùng ta seõ noùi kyõ hôn veà caùc ngaét naøy ôû choã khaùc.
108
Vi xử lí
• Khung cuûa chöông trình hôïp ngöõ ñeå dòch ra chöông trình .COM
Nhìn vaøo khung chöông trình hôïp ngöõ ñeå dòch ra teäp chöông trình
ñuoâi .EXE ta thaáy coù mặït ñaày ñuû caùc ñoaïn. Treân maùy tính IBM PC
ngoaøi teäp chöông trình vôùi ñuoâi .EXE. Chuùng ta coøn coù khaû naêng dòch
chöông trình hôïp ngöõ coù keát caáu thích hôïp ra moät loaïi teäp chöông trình
chaïy ñöôïc kieåu khaùc vôùi ñuoâi .COM. Ñaây laø moät chöông trình ngaén goïn
vaø ñôn giaûn hôn nhieàu so vôùi teäp chöông trình ñuoâi .EXE, trong ñoù caùc
ñoaïn maõ, ñoaïn döõ lieäu vaø ñoaïn ngaên xeáp ñöôïc goäp laïi trong moät ñoaïn
duy nhaát laø ñoaïn maõ. Nhö vaäy neáu ta coù caùc öùng duïng maø döõ lieäu vaø
maõ chöông trình khoâng yeâu caàu nhieàu veà khoâng gian cuûa boä nhôù, ta coù
theå gheùp luoân caû döõ lieäu, maõ chöông trình vaø ngaên xeáp chung vaøo trong
cuøng moät ñoaïn maõ roài taïo ra teäp .COM. Vôùi vieäc taïo ra teäp naøy coøn tieát
kieäm ñöôïc caû khoâng gian nhôù khi phaûi löu tröõ noù treân oå ñóa.
Ñeå coù theå dòch ñöôïc ra chöông trình ñuoâi .COM thì chöông trình
nguoàn hôïp ngöõ phaûi ñöôïc keát caáu sao cho thích hôïp vôùi muïc ñích naøy.
Sau ñaây laø khung cuûa moät chöông trình hôïp ngöõ ñeå dòch ñöôïc ra
teäp chöông trình ñuoâi .COM.
. Model Tiny
. Code
ORG 100h ; Đây là khai báo quan trọng cho .COM
START: JMP CONTINUE
; caùc ñònh nghóa cho bieán vaø haèng ñeå taïi ñaây
CONTINUE :
MAIN Proc
;
caùc leänh cuûa chöông trình chính ñeå taïi ñaây
INT 20H
; Trôû veà DOS
MAIN Endp
; caùc chöông trình con (neáu coù) ñeå taïi ñaây
END START
So saùnh khung naøy vôùi khung cho chöông trình .EXE ta thaáy trong
khung khoâng coù khai baùo ñoaïn ngaên xeáp vaø ñoaïn döõ lieäu, coøn khai baùo
quy moâ söû duïng nhôù laø kieåu Tiny. ÔÛ ngay ñaàu ñoaïn maõ laø leänh giaû
ORG (origin: ñieåm xuaát phaùt) leänh JMP (nhaûy). Leänh giaû ORH 100H
duøng ñeå gaùn ñòa chæ baét ñaàu cho chöông trình taïi 100H trong ñoaïn maõ,
chöøa laïi vuøng nhôù vôùi dung löôïng 256 byte (töø ñòa chæ 0 ñeán ñòa chæ
255) cho ñoaïn maøo ñaàu chöông trình (PSP).
109
Vi xử lí
Leänh JMP sau nhaõn START duøng ñeå nhaûy qua phaàn boä nhôù daønh
cho vieäc ñònh nghóa vaø khai baùo döõ lieäu (veà nguyeân taéc, döõ lieäu coù theå
ñöôïc ñaët ôû ñaàu hoaëc ôû cuoái ñoaïn maõ, nhöng ôû ñaây ta ñaët noù ôû ñaàu ñoaïn
maõ ñeå coù theå aùp duïng caùc ñònh nghóa ñôn giaûn ñaõ noùi). Ñích cuûa leänh
nhaûy laø phaàn ñaàu cuûa chöông trình chính. Hình 4.1 bieåu dieãn vieäc moät
chöông trình kieåu .COM ñöôïc naïp vaøo vaø saép xeáp trong moät ñoaïn maõ
cuûa boä nhôù ra sao.
Theo hình 4.1 ta thaáy moät chöông trình .COM cuõng ñöôïc naïp vaøo
boä nhôù sau vuøng PSP nhö chöông trình ñuoâi .EXE. Ngaên xeáp cho
chöông trình .COM ñöôïc xeáp ñaët taïi cuoái ñoaïn maõ, ñænh cuûa ngaên xeáp
luùc ban ñaàu laø oâ nhôù coù ñòa chæ laø FFFEH.
Trong tröôøng hôïp chöông trình kieåu.COM naøy chuùng ta seõ bò caùc
haïn cheá gaây ra bôûi a) dung löôïng nhôù cöïc ñaïi cuûa moät ñoaïn laø 64KB,
töùc laø ta phaûi luoân chaéc chaén ñöôïc raèng caùc chöông trình öùng duïng phaûi
coù soá löôïng byte cuûa maõ maùy vaø döõ lieäu cho chöông trình khoâng lôùn
laém (neáu khoâng noù seõ laøm cho caû nhoùm naøy nôû ra veà phía ñòa chæ cao
cuûa ñoaïn) vaø b) chöông trình cuõng chæ ñöôïc pheùp söû duïng ngaên xeáp moät
caùch haïn cheá (neáu khoâng ñieàu naøy coù theå laøm cho ñænh cuûa noù trong khi
hoaït ñoäng daâng leân nhieàu veà phía ñòa chæ thaáp cuûa ñoaïn).
Ñòa chæ leäch
000H Ñoaïn ñaàu chöông trình (PSP)
0100H JMP CONTINUE
Döõ lieäu naèm taïi ñaây
← IP
CONTINUE:
(chieàu tieán cuûa maõ & döõ lieäu)
↓
↑
(chieàu tieán cuûa ngaên xeáp)
FFFEH
← SP
Hình 4.1. Teäp chöông trình .COM trong boä nhôù
Toùm laïi chuùng ta phaûi chaéc chaén ñaûm baûo khoâng theå xaûy ra hieän
töôïng truøm vaøo nhau cuûa caùc thoâng tin taïi vuøng maõ leänh hoaëc döõ lieäu.
Tuy nhieân ta cuõng khoâng caàn phaûi lo laêng quaù ñeán vaán ñeà naøy, caùc
chöông trình kieåu .COM trong haàu heát caùc tröôøng hôïp trong thöïc teá vaãn
110
Vi xử lí
coù theå thoaû maõn ñöôïc caùc yeâu caàu cuûa caùc baøi toaùn maø ta muoán thöû
nghieäm.
Khi keát thuùc chöông trình kieåu .COM, ñeå trôû veà DOS ta duøng
ngaét INT 20H cuûa DOS ñeå laøm cho chöông trình goïn hôn. Taát nhieân ta
cuõng coù theå duøng haøm 4CH cuûa ngaét INT 21H nhö ñaõ duøng trong
chöông trình ñeå dòch ra teäp .EXE.
Ñeå keát thuùc toaøn boä chöông trình ta duøng höôùng daãn chöông
chính dòch END ñi keøm theo nhaõn START töông öùng vôùi ñòa chæ leänh
ñaàu tieân cuûa chöông trình trong ñoaïn maõ.
Sau ñaáy laø ví duï cuûa moät chöông trình hôïp ngöõ ñeå dòch ra teäp
chöông trình chaïy ñöôïc vôùi ñuoâi .COM (chöông trình 4.2).
Chöông trình 4.2. Chöông trình Helo.COM
. Model Tiny
. Code
ORG 100H
START :
IMP CONTINUE
CRLF
DB 13, 10, '$'
MSG
DB !Hello! $'
CONTINUE:
MAIN Proc
; veà ñaàu doøng môùi duøng haøm 9 cuûa INT 21H
MOV AH, 9
LEA DX, CRLF
INT 21H
; hieän thò lôøi chaøo
MOV AH, 9
LEA DX, CRLF
INT 21H
; trôû veà DOS
INT 20H
MAIN Endp
END START
Chuùng ta coù theå nhaän xeùt raèng trong chöông trình 4.2 ta khoâng
caàn ñeán caùc thao taùc khôûi ñaàu cho thanh ghi DS, nhö ta ñaõ phaûi laøm
trong chöông trình 4.1, vì trong chöông trình.COM khoâng coù ñoaïn döõ
lieäu naèm rieâng reõ.
111
Vi xử lí
Stack
chöông
trình
chöông
trình
SS
CS
DS
ES
100h
100h
PSP
PSP
.COM
.EXE
Hình 4.2. Moâñun chöông trình .COM vaø .EXE trong boä nhôù.
Cuoái cuøng ñeå keát thuùc phaàn noùi veà caùc chöông trình kieåu .COM
vaø .EXE ta ñöa ra hình aûnh cuûa caùc chöông trình naøy khi chuùng ñöôïc taûi
vaøo trong boä nhôù ñeå coù theå tieän so saùnh (hình 4.2).
2. Caùch taïo vaø cho chaïy moät chöông trình hôïp ngöõ treân maùy IBM
PC
Nhö ñaõ noùi trong phaàn tröôùc, maùy IBM PC laø phöông tieän lyù
töôûng ñeå chuùng ta taïo ra vaø thöû nghieäm caùc chöông trình hôïp ngöõ
8086/88. Caùc böôùc ñeå laøm coâng vieäc naøy coù theå lieät keâ ra nhö sau:
1. Duøng caùc phaàn meàm soaïn thaûo vaên baûn (SK, NCedit...) ñeå
taïo ra moät teäp vaên baûn chöông trình goác baèng hôïp ngöõ. Teäp
naøy phaûi ñöôïc gaùn ñuoâi .ASM.
2. Duøng chöông trình dòch MASM ñeå dòch teäp.ASM ra maõ maùy
döôùi daïng teäp .OBJ. Neáu trong böôùc naøy neáu trong chöông
trình coù loãi cuù phaùp thì ta phaûi quay laïi böôùc 1 ñeå söûa laïi
chöông trình goác.
3. Duøng chöông trình LINK ñeå noái moät hay nhieàu teäp OBJ laïi
vôùi nhau thaønh moät teäp chöông trình chaïy ñöôïc vôùi ñuoâi
.EXE.
4. Neáu chöông trình goác vieát ra laø ñeå dòch ra kieåu .COM thì ta
phaûi duøng chöông trình EXE2BIN (ñoïc laø EXEtoBIN) cuûa
DOS ñeå dòch tieáp teäp .EXE ra teäp chöông trình chaïy ñöôïc vôùi
ñuoâi .COM.
112
Vi xử lí
5. Cho chaïy chöông trình vöøa dòch
Qua quaù trình thöïc hieän caùc coâng vieäc noùi treân coù theå ñöôïc minh hoïa
baèng löu ñoà treân hình 4.2.
Sau ñaây ta seõ noùi kyõ vaø cuï theå hôn veà moät soá coâng ñoaïn trong quaù trình
soaïn thaûo vaø cho chaïy chöông trình hôïp ngöõ.
• Ñeå soaïn thaûo chöông trình hôïp ngöõ ta coù theå duøng caùc chöông trình
soaïn thaûo vaên baûn nhö BKED hoaëc caùc chöùc naêng soaïn thaûo cuûa
Turbo Pascal, SK, NC... nhöng toát nhaát neân duøng caùc chöông trình
SK hoaëc NC vì caùc chöông trình naøy coù khaû naêng thöôøng truù do ñoù
raát thích hôïp cho vieäc söûa ñoåi vaø cho chaïy thöû chöông trình.
• Trong böôùc 2 ta coù theå duøng leänh MASM theo 2 caùch khaùc nhau.
Giaû thieát chuùng ta coù teäp chöông trình 4.2 mang teân vidu.asm taïi oå ñóa
A vaø chöông trình dòch hôïp ngöõ MASM taïi oå C. Neáu ta khoâng muoán MASM
trong khi dòch taïo ra caùc teäp khaùc ngoaøi teäp .obj thì taïi daáu nhaéc A> cuûa DOS
ta goõ vaøo leänh sau (chuù yù daáu chaám phaåy';'):
A>C:MASM vidu;
Taïo ra teäp vaên baûn cuûa chöông trình
*.asm
Duøng MASM ñeå dòch ra maõ maùy
*.obj
Duøng LINK ñeå noái teäp .obj laïithaønh
*.exe
Dòch ñöôïc ra.com?
s
ñ
Duøng EXE2BIN ñeå dòch *.exe thaønh
*.com
113
Cho chaïy chöông trình
Vi xử lí
Hình 4.2. Caùc böôùc coâng vieäc ñeå taïo ra vaø cho chaïy moät chöông trình hôïp ngöõ
Sau leänh naøy MASM seõ kieåm tra loãi cuûa chöông trình goác vaø ñöa ra
baûn thoáng keâ caùc loãi neáu coù.
Trong tröôøng hôïp chöông trình hôïp ngöõ khoâng bò loãi ta nhaän ñöôïc caùc
doøng thoâng baùo sau:
A>C:MASM vidu;
Microsoft (R) Macro Assembler Version 5.00A
Copy rights (C) Microsoft Corp 1981-1985, 1987 All rights reserved
49020 Bytes symbol space free
0 Warning Errors
0 Severe Errors
Keát cuïc ta thu ñöôïc moät teäp maõ maùy laø vidu.obj ñeå taïi oå A.
Trong ví duï treân, giaû thieát coù loãi cuù phaùp (chaúng haïn khi ñònh nghóa
chuoãi kyù töï bò thieáu daáu ' taïi doøng leänh thöù 6 trong chöông trình goác), MASM
seõ thoâng baùo loãi nhö sau:
Microsoft (R) Macro Assembler Version 5.00A
Copy rights (C) Microsoft Corp 1981-1985, 1987 All rights reserved
Object filename [VIDU.OBJ] :
Source listing [NUL.LST] : vi du
Cross - reference [NUL.CRF] : vidu
49020 Bytes symbol space free
114
Vi xử lí
0 Warning Errors
0 Severe Errors
Ta thaáy trong tröôøng hôïp naøy MASM laøm vieäc ôû cheá ñoä ñoái thoaïi vaø ta
phaûi traû lôøi baèng caùch goõ theâm caùc thoâng tin caàn thieát cho vieäc taïo ca caùc teäp
môùi.
Thoâng tin ñaàu tieân lieân quan ñeán teân teäp .obj.MASM maëc ñònh teân teäp
obj truøng vôùi teân teäp.asm, neáu ta muoán coù thaây ñoåi thì goõ thaâm vaøo beân caïnh,
neáu khoâng chæ caàn goõ Enter ñeå cho qua.
Thoâng tin thöù 2 lieân quan ñeán teân teäp .lst. Ñaây laø teäp chöùa vaên baûn cuûa
chöông trình goác keøm theo maõ maùy cuûa töøng doøng leänh. MASM maëc ñònh teân
teäp laø NUL, töùc laø khoâng taïo ra teäp naøy (goõ Enter ñeå cho qua). Neáu muoán coù
teäp naøy ta phaûi goõ theâm teân vaøo.
Thoâng tin thöù 3 lieân quan ñeán teân teäp .crf, teäp tham khaûo cheùo. Teäp
tham khaûo cheùo chöùa danh saùch caùc teân vaø nhaõn coù trong chöông trình cuøng
vôùi toaï ñoä cuûa chuùng (toïa ñoä ôû ñaây laø soá thöù töï doøng). MASM maëc ñònh teân
teäp laø NUL, töùc laø khoâng taïo ra teäp naøy (goõ Enter ñeå cho qua). Neáu muoán coù
teäp naøy ta phaûi goõ theâm teân vaøo.
• Sau khi taïo ra teäp .obj, trong böôùc 3 ta phaûi duøng chöông trình LINK
ñeå bieán (hay noái) chöông trình maõ maùy ñeå trong moät hay nhieàu
teäp .obj thaønh moät teäp chöông trình chaïy ñöôïc duy nhaát vôùi ñuoâi
.EXE. Neáu trong oå C ta coù chöông trình LINK vaø teäp vidu.obj ôû oå A
thì ta coù theå coù leänh:
A>C:LINK vidu;
Microsoft (R) Overlay Linker Version 3.65
Copy rights (C) Microsoft Corp 1983-1988 All rights reserved
Neáu teäp goác laø teäp ñöôïc vieát ra ñeå dòch ra chöông trình kieåu .COM thì
trong böôùc naøy ta coù theå gaëp thoâng baùo loãi nhö sau:
LINK : Warning L4021 : No stack segment (khoâng coù ñoaïn ngaên
xeáp)
Thoâng baùo naøy laø lôøi caûnh baùo ñuùng vì chöông trình kieåu .COM khoâng
coù ngaên xeáp rieâng vaø vì vaäy chöông trình cuûa ta vaãn ñöôïc dòch bình thöôøng.
Keát cuïc ta thu ñöôïc moät teäp chöông trình chaïy ñöôïc laø vidu.exe ñeå taïi oå
A.
Caàn chuù yù raèng cho duø vidu.obj laø teäp .obj duy nhaát nhöng ta vaãn duøng
LINK ñeå bieán noù thaønh teäp chaïy ñöôïc vôùi ñuoâi EXE. Neáu ta coù nhieàu moâñun
115
Vi xử lí
chöông trình ñöôïc dòch ra döôùi daïng teäp .obj vaø caùc teäp naøy caàn phaûi ñöôïc noái
ñeå taïo thaønh teäp. EXE duy nhaát cuoái cuøng, ta coù theå duøng leänh sau:
A > C:LINK vidu1+vidu2;
trong ñoù vidu1.obj laø moät moâñun chöông trình, beân trong noù coù chöùa lôøi goïi
moät chöông trình khaùc hoaëc tham chieáu tôùi caùc tham soá ôû moät moâñun coù teân
vidu2.obj. Teân cuûa teäp ñöôïc ñaët taïi vò trí ñaàu tieân trong phaàn thoâng soá cuûa
leänh LINK (trong tröôøng hôïp cuûa ta laø vidu1.obj), seõ ñöôïc choïn ñeå ñaët teân cho
teäp .EXE cuoái cuøng. Nghóa laø sau doøng leänh treân ta seõ thu ñöôïc teäp vidu1.exe.
• Chæ ñoái vôùi caùc chöông trình goác ñöôïc vieát ñeå dòch ra chöông trình
ñuoâi .COM ta môùi phaûi tieán haønh böôùc thöù 4, töùc laø duøng EXE2BIN ñeå
dòch tieáp chöông trình .EXE vöøa thu ñöôïc ra chöông trình .COM. Caàn
löu yù raèng moät chöông trình .EXE ñöôïc taïo ra ñeå roài tieáp theo ñöôïc dòch
thaønh Chöông trình .COM (nhö tröôøng hôïp vidu.exe cuûa chuùng ta)
khoâng phaûi laø
moät chöông trình chaïy ñöôïc.
Giaû thieát coù chöông trình EXE2BIN ôû taïi oå C vaø chöông trình vidu.exe
ôû taïi oå A ta coù theå söû duïng leänh sau:
A>C:EXE2BIN vidu vidu.com
Chuù yù: Trong caâu leänh cuoái cuøng ta phaûi vieát roõ vidu.com ñeå nhaän ñöôïc teäp
ñuoâi.COM vì leänh EXE2BIN naøy maëc ñònh seõ taïo ra teäp chöông trình ñuoâi
.BIN ñeå duøng cho caùc coâng vieäc khaùc.
Keát cuïc ta thu ñöôïc moät teäp chöông trình chaïy ñöôïc laø vidu.com ñeå taïi
oå A.
• Böôùc cuoái cuøng laø cho chaïy chöông trình vöøa thu ñöôïc. Caùc chöông
trình chaïy ñöôïc ñuoâi .COM hay .EXE ñeàu ñöôïc cho chaïy trong moâi tröôøng
DOS baèng caùch goïi teân cuûa noù.
Ñeå keát thuùc ví duï ñaõ neâu ta coù theå cho chaïy chöông trình vidu.com
baèng leänh:
A> vidu
vaø treân maøn hình seõ thu ñöôïc caùc doøng chöõ nhö sau:
A> vidu
116
Vi xử lí
Hello!
A>
Ñeå laøm ñöôïc taát caû caùc coâng vieäc treân moät caùch thuaän lôïi ta coù theå taäp
hôïp caùc thao taùc phaûi laøm vaøo tong moät teäp xöû lyù theo loâ run.bat nhö sau
(chöông trình 4.3)
Chöông trình 4.3 Chöông trình RUN.BAT
@ Echo Assemble and link %1
@ If not exits 1.asm goto END
MASM % 1, %1;
@ If Errorlevel 1 goto END
LINK %1, %1, NUL;
@ If not exits %1.exe goto END
@ If not 'A%2'=='A' goto RUN
EXE2BIN % 1.exe %1.com
@ DEL @1.exe
@ DEL @1.obj
: RUN
PAUSE Ctrl_Break ta terminate or
%1
:END
Chöông trình run.bat giaû thieát laø ta coù saün caùc chöông trình
MASM.LINK vaø EXE2BIN ñeå trong thö muïc hieän taïi cuøng vôùi teäp vaên baûn
goác filename.asm ñöôïc soaïn thaûo thích hôïp ñeå dich ra teäp chöông trình ñuoâi
.EXE vaø .COM. Tuyø theo muïc ñích dòch ta coù caùc caâu leänh sau:
+ RUN filename /
ñeå dòch teäp chöông trình goác soaïn theo kieåu .EXE ra teäp chöông trình.EXE vaø
cho chaïy luoân chaïy chöông trình naøy.
+ RUN filename
ñeå dòch teäp chöông trình goác soaïn theo kieåu .COM ra teäp chöông trình.COM
vaø cho chaïy luoân chaïy chöông trình naøy.
117
Vi xử lí
3. Caùc caáu truùc laäp trình cô baûn thöïc hieän baèng hôïp ngöõ
Ngaøy nay, trong khi tieán haønh vieäc thieát keá heä thoáng ngöôøi ta thöôøng
duøng phöông phaùp thieát keá töø treân xuoáng döôùi. Phöông phaùp naøy ví theá cuõng
ñöôïc aùp duïng trong khi vieát phaàn meàm cho moät heä thoáng nhaèm giaûi quyeát moät
nhieäm vuï nhaát ñònh naøo ñoù.
Baûn chaát cuûa phöông phaùp thieát keá naøy laø ñaàu tieân ta chia chöông trình
toång theå thaønh caùc khoái chöùc naêng nhoû hôn, caùc khoái chöùc naêng nhoû naøy laïi
ñöôïc chia tieáp thaønh caùc khoái chöùc naêng nhoû hôn nöõa, vieäc phaân chia chöùc
naêng phaûi laøm cho ñeán khi moãi khoái nhoû naøy trôû thaønh caùc khoái chöùc naêng
ñôn giaûn vaø deã thöïc hieän.
Trong khi thöïc hieän caùc khoái chöùc naêng thaønh phaàn, thoâng thöôøng
ngöôøi ta söû duïng caùc caáu truùc laäp trình cô baûn ñeå thöïc hieän caùc nhieäm cuï cuûa
khoái ñoù. Ñieàu naøy laøm cho caùc chöông trình vieát ra trôû thaønh coù caáu truùc vôùi
caùc öu ñieåm chính laø deã phaùt trieån, deã hieäu chænh hoaëc caûi tieán vaø deã laäp taøi
lieäu.
Ñeå giaûi quyeát caùc coâng vieäc khaùc nhau thoâng thöôøng trong khi vieát
chöông trình ta chæ caàn ñeán 3 caáu truùc laäp trình cô baûn sau:
+ caáu truùc tuaàn töï.
+ Caáu truùc löïa choïn (IF-THEN-ELSE) vaø
+ Caáu truùc laëp (WHILE.DO).
Thay ñoåi caùc caáu truùc naøy moät chuùt ít, ta coù theå taïo theâm 4 caáu truùc
khaùc cuõng raát coù taùc duïng trong khi vieát chöông trình :
+ caáu truùc choïn kieåu IF-THEN
+ caáu truùc choïn kieåu CASE,
+ caáu truùc laëp kieåu REPEAT-UNTIL vaø
+ caáu truùc laëp kieåu FOR-DO.
Ñaëc ñieåm chung cuûa taát caû caùc caáu truùc laäp trình cô baûn laø tính caáu truùc
chi coù moät loái vaøo caáu truùc vaø moät loái ra ñeå ra khoûi caáu truùc ñoù.
Nhöõng caáu truùc laäp trình keå treân laø caùc caáu truùc maø ta ñaõ laøm quen ít
nhieàu khi vieát chöông trình ôû ngoân ngöõ baäc cao. Vaán ñeà ñoái vôùi ta baây giôø laø
laøm theá naøo ñeå thöïc hieän caùc caáu truùc laäp trình naøy baèng hôïp ngöõ.
•
Caáu truùc tuaàn töï
118
Vi xử lí
Caáu truùc tuaán töï laø moät caáu truùc thoâng duïng vaø ñôn giaûn nhaát. Trong
caáu truùc naøy caùc leänh ñöôïc saép xeáp tuaàn töï, leänh noï tieáp leänh kia. Sau khi
thöïc hieän xong leänh cuoái cuøng cuûa caáu truùc thì coâng vieäc phaûi laøm cuõng ñöôïc
hoaøn taát.
Ngöõ phaùp:
Leänh1
Leänh2
.
.
Leänhn
Ví duï
Caùc thanh ghi CX vaø BX chöùa caùc giaù trò cuûa bieán c vaø b. Haõy tính giaù
trò cuûa bieåu thöùc a = 2×(c+b) vaø chöùa keát quaû trong thanh ghi AX.
Giaûi
Ta coù theå thöïc hieän coâng vieäc treân baèng maãu chöông trình sau:
XOR AX, AX
ADD AX, BX
ADD AX, CX
SHL AX, l
RA:
;
;
;
;
;
toång taïi AX luùc ñaàu laø 0.
coäng theâm b.
coäng theâm c.
nhaân ñoâi keát quaû trong AX.
loái ra cuûa caáu truùc.
•
Caáu truùc IF - THEN
Ngöõ phaùp (hình 4.2):
IF Ñieàu kieän THEN coâng vieäc
Töø ngöõ phaùp cuûa caáu truùc IF-THEN ta thaáy neáu thoaû maõn Ñieàu kieän thì
Coâng vieäc ñöôïc thöïc hieän neáu khoâng Coâng vieäc seõ bò boû qua. Ñieàu naøy töông
ñöông vôùi vieäc duøng leänh nhaûy coù ñieàu kieän ñeå boû qua moät thao taùc naùo ñoù
Ñieàutrình
kieän hôïp ngöõ.
Ñieàu kieän
trong chöông
Sai
Ñuùng
Coâng vieäc
Sai
Coâng vieäc 1
Ñuùng
Coâng vieäc 1
119
Hình 4.2 Caáu truùc IF-THEN
Hình 4.3 Caáu truùc IF-THEN-ELSE
Vi xử lí
Ví duï
Gaùn cho BX giaù trò tuyeät ñoái cuûa AX.
Giaûi
Ñeå thöïc hieän pheùp gaùn BX ← AX ta coù theå duøng caùc leänh sau:
CMP AX,0
JNL GAN
NEG AX
GAN: MOV BX, AX
;
;
;
;
AX0?.
ñuùng.
120
Vi xử lí
MOV CL, l
JMP RA
DG: XOR CL, CL
RA:
•
;
sai, cho CL ← 1 roài
;
di ra.
;
cho CL ← 0.
; loái ra cuûa caáu truùc.
Caáu truùc CASE
Ngöõ phaùp (hình 4.4) :
CASE Bieåuthöùc
Giaùtrò1: Coângvieäc1
Giaùtrò2: Coângvieäc2
...
GiaùtròN: CoângvieäcN
END CASE
Bieåuthöùc
Giaùtrò1
Coângvieäc1
Giaùtrò2
Coângvieäc2
GiaùtròN
CoângvieäcN
Hình 4.4. Caáu truùc leänh CASE
Töø ngöõ phaùp cuûa caáu truùc ta thaáy neáu Bieåuthöùc coù Giaùtrò1 thì
Coângvieäc1 ñöôïc thöïc hieän. neáu Bieåuthöùc coù Giaùtrò2 thì Coângvieäc2 ñöôïc thöïc
hieän vaø ... Ñieàu naøy töông ñöông vôùi vieäc duøng caùc leänh nhaûy coù ñieàu kieän vaø
nhaûy khoâng ñieàu kieän ñeå nhaõy caùc nhaõn naøo ñoù trong chöông trình hôïp ngöõ.
Caáu truùc CASE coù theå thöïc hieän baèng caùc caáu truùc löïa choïn loáng nhau.
Ví duï
Duøng CX ñeå bieåu hieän caùc giaù trò khaùc nhau cuûa AX theo quy taéc sau:
Neáu AX < 0 thì CX =-1,
neáu AX = 0 thì CX =0,
neáu AX > 0 thì CX =1.
Giaûi
Ta coù theå thöïc hieän caùc coâng vieäc treân baèng maãu chöông trình sau:
CMP AX, 0 ; Kieåm tra daáu cuûa AX.
121
Vi xử lí
JL AM
; AX 0.
AM: MOV CX, -1
JMP RA
DUONG: MOV CX, 1
JMP RA
KHONG: XOR CX. CX
RA:
; loái ra cuûa caáu truùc.
• Caáu truùc laëp FOR - DO
Ngöõ phaùp (hình 4.5):
FOR Soá laàn laëp DO Coâng vieäc
Töø ngöõ phaùp cuaû caáu truùc FOR - DO ta thaáy ôû ñaây Coâng vieäc ñöôïc thöïc
hieän laëp ñi laëp laïi taát caû Soá laàn laëp laïi. Ñieàu naøy hoaøn toaøn töông ñöôg vôùi
vieäc duøng leänh LOOP trong hôïp ngöõ ñeå laëp laïi CX laàn moät Coâng vieäc naøo ñoù,
ñöông nhieân tröôùc ñoù ta phaûi gaùn Soá laàn laëp cho thanh ghi CX.
Ví duï
Hieån thò moät doøng kí töï '$' treân maøn hình.
ìKhôûi ñaàu boä ñeám
Coâng vieäc
ìGiaûm boä ñeám ñi 1
Boä ñeám=0
sai
ñuùng
Hình 4.5. Caáu truùc laëp FOR - DO.
122
Vi xử lí
Giaûi
Moät doøng maøn hình treân maùy IBM PC chöùa ñöôïc nhieàu nhaát laø 80 kí töï.
Ta seõ söû duïng haøm 2 cuûa ngaét 21H ñeå hieån thò 1 kí töï. Ta phaûi laëp laïi coâng
vieäc naøy 80 laàn caû thaûy baèng leänh LOOP. Muoán duøng leän naøy, ngay töø ñaàu ta
phaûi naïp vaøo thanh ghi CX soá laàn hieån thò, noäi dung cuûa Cx ñöôïc töï ñoäng
giaûm ñi1 do taùc ñoäng cuûa leänh LOOP.
Sau ñaây laø maåu chöông trình thöïc hieän caùc coâng vieäc treân:
MOV CX, 80
; soá laàn hieän thò trong cx
MOV AH, 2
; AH chöùa soá hieäu haøm hieän thò,
MOV DL, '$'
; DL chöùa kí töï caàn hieän thò,
HIEN: INT 21H
; hieän thò
LOOP HIEN
; caû moät doøng kí töï.
RA:
; loái ra cuûa caáu truùc.
• Caáu truùc laëp WHILE - DO
Ngöõ phaùp (hình 4.6):
WHILE Ñieàu kieän DO Coâng vieäc
Töø ngöõ phaùp cuûa caáu truùc WHILE - DO ta thaáy: Ñieàu kieän ñöôïc kieåm
tra ñaàu tieân. Coâg vieäc ñöôïc laëp ñi laëp laïi chöøng naøo Ñieàu kieän coøn ñuùng.
Ñieàu naøy trong hôïp ngöõ hoaøn toaøn töông ñöông vôùi vieäc duøng leänh CMP ñeå
kieåm tra Ñieàu kieän vaø sau ñoù duøng leänh nhaûy coù ñieàu kieän ñeå thoaùt khoûi voøng
laëp.
sai
Ñieàu kieän
Coâng vieäc
ñuùng
Coâng vieäc
Ñieàu kieän
ñuùng
Hình 4.6. Caáu truùc WHILE - DO
sai
123
Hình 4.7. Caáu truùc REPEAT - UNTIL
Vi xử lí
Ví duï
Ñeám soá kyù töï ñoïc ñöôïc töø baøn phím, khi gaëp kyù töï CR thì thoâi.
Giaûi
Ta coù theå thöïc hieän coâng vieäc treân baèng maåu chöông trình sau:
XOR CX, CX
MOV AH, 1
TIEP: INT 21H
CMP AL, 13
JE RA
INC CX
RA:
; toång soá kyù töï ñoïc ñöôïc luùc ñaàu laø 0
; haøm ñoïc kyù töï töø baøn phím.
; ñoïc 1 kyù öï, Al chöùa maõ kyù töï.
; ñoïc ñöôïc CR?
; ñuùng, ra.
; sai, theâm 1 kyù töï vaøo toång.
; loái ra cuûa caáu truùc.
• Caáu truùc laëp REPEAT - UNTIL
Ngöõ phaùp (hình 4.7:
REPEAT Coâng vieäc UMTIL Ñieàu kieän
Töø ngöõ phaùp cuûa caáu truùc REPEAT - UNTIL ta thaáy: Coâng vieäc ñöôïc thöïc
hieän ñaàu tieân. Ñieàu ñoù coù nghóa laø coâng vieäc ñöôïc thöïc hieän ít nhaát moät laàn .
Ñieàu kieän ñöôïc kieåm tra sau ñoù. Coâng vieäc ñöôïc laëp ñi laëp laïi cho tôùi Ñieàu
kieän ñöôïc thoaû maõn. Ñieàu naøy trong hôïp ngöõ hoaøn toaøn töông ñöông vôùi vieäc
duøng leänh CMP ñeå kieåm tra Ñieàukieän vaø sau ñoù duøng leänh nhaûy coù ñieàu kieän
ñeå thoaùt khoûi voøng laëp.
Ví duï:
Ñoïc kyù töï töø baøn phím cho tôùi khi gaëp '$' thì thoâi.
Giaûi
Ví duï naøy chæ laøm moät phaàn coâng vieäc cuûa ví duï tröôùc. Taïi ñaây ta chæ
phaûi ñoïc caùc kyù töï ñoïc ñöôïc.
Ta coù theå töïc hieän coâng vieäc treân baèng maåu chöông trình sau:
MOV Ah, 1 ; haøm ñoïc kyù töï baøn phím.
TIEP: INT 21H
; ñoïc 1 kyù töï.
CMP AL, '$' ; ñoïc ñöôïc ñoâla ?
RA:
; loái ra cuûa caáu truùc.
124
Vi xử lí
4. Moät soá chöông trình cuï theå:
Trong phaàn naøy ta seõ xeùt moät soá chöông trình cho caùc öùng duïng cuï theå, thoâng
qua caùc ví duï naøy ta coù theå hoïc ñöôïc caùc leänh, caùch laäp chöông trình cuøng vôùi
caùch toå chöùc döõ lieäu ñeå giaûi quyeát caùc baøi toaùn cuï theå. Moät soá chöông trình
lieân quan ñeán caùc vaán ñeà khaùc chöa ñöôïc ñeà caäp ñeán töø tröôùc ñeán nay coù theå
ñöôïc neâu ra ôû nhöõng chöông töông öùng sau chöông naøy.
Tröôùc khi giôùi thieäu caùc ví duï ta heä thoáng laïi moät vaøi haøm cuûa caùc loaïi
ngaét coù trong maùy IBM PC vôùi heä ñieàu haønh MS DOS hay chöa ñöôïc duøng
trong caùc ví duï ñaõ neâu tröôùc ñaây vaø sau naøy.
Ngaét INT 20H daønh rieâng ñeå keât thuùc chöông trình loaïi . COM
Haøm 1 cuûa ngaét INT 21H: ñoïc 1 kyù töï töø baøn phím
Vaøo: AH = 1
Ra: AL = maõ ASCH cuûa kyù töï caàn hieän thò
Al = 0 khi kyù töï goõ vaøo laø töø caùc phím chöùc naêng
Haøm 2 cuûa ngaét INT 21H: hieän 1 kyù töï leân maøn hình
Vaøo: AH = 2
DL = maõ ASCH cuûa kyù töï caàn hieän thò.
Haøm 9 cuûa ngaét INT 21H: hieän chuoãi kyù töï vôùi $ ôû cuoái leân maøn hình
Vaøo: AH = 9
DX = ñòa chæ leäch cuûa chuoãi kyù töï caàn hieän thò.
Haøm 4CH cuûa ngaét INT 21H: keát thuùc chöông trình loaïi . EXE
Vaøo: AH = 4CH
Moät ñieàu caàn nhaéc laïi laàn nöõa ñeå löu yù khi ñoïc caùc ví duï
Daáu \\\\\\\\ ( neáu coù) ñaët tröôùc moät ví du laø ñeå caûnh baùo raèng ví duï lieân
quan chæ duøng ñeå moâ taû thuaät giaûi cho vaán ñeà naøo ñoù maø khoâng chaïy ñöôïc
treân caùc maùy IBM PC hoaëc töông thích.
• Caùc ví duï:
Ví duï 1
Trong phaàn ñaàu cuûa chöông trình hôïp ngöõ ta coù giöùo thieäu moät chöông
trình hieän lôøi chaøo baêng tieáng Anh "Hello". Baây giôø ta phaûi theâm moät lôøi
chaøo baèng tieáng Vieät khoâng daáu "Chao ban" naèm caùch lôøi chaøo "Hello" tröôùc
ñaây moät soá doøng nhaát ñònh naøo ñoù.
Giaûi
125
Vi xử lí
Ta cuõng vaãn söû duïng phöông phaùp ñaõ ñöôïc duøng ôû chöông trình maãu
tröôùc ñaây ñeå hieän thò lôøi chaøo 'taây', hieän caùc doøng giaõn caùch vaø hieän lôøi chaøo
'ta'.
Trong ví duï naøy ta cuõng boû bôùt ñi caùc doøng caùch ôû ñaàu vaø cuoái ñeå
chöông trình ñôõ röôøm raø.
. Model Small
. Stack 100
. Data
CRLF
Chao tay
ChaoTa
DB
DB
DB
13, 10, '$'
'hello!$'
'Chao ban!$'
. Code
MAIN Proc
; khôûi ñaàu thanh ghi DS
MOV AX, @ Data
MOV DS, AX
; hieän thò lôøi chaøo duøng haøm 9 cuûa INT 21H
MOV AH, 9
LEA DX, ChaoTay
INT 21H
; caùch 5 doøng duøng haøm 9 cuûa INT 21H
LEA DX, CELF
MOV CX, 6 CX chöùa soá doøng caùch +1
LAP: INT 21H
LOOP LAP
; hieän thò lôøi chaøo duøng haøm 9 cuûa INT 21H
LEA DX, ChaoTa
INT 21H
; trôû veà DOS duøng haøm 4 CH cuûa INT 21H
MOV AH, 4CH
INT 21H
MAIN Endp
END MAIN
Trong chöông trình treân ta ñaõ duøng thanh ghi CX ñeå chöùa soá doøng phaûi
giaõn caùch. Vôùi caùch laøm naøy moãi khi muoán thay ñoåi soá doøng daõn caùch giöõa 2
126
Vi xử lí
lôøi chaøo ta vaø lôøi chaøo taây, ta phaûi gaén giaù trò khaùc cho thaønh ghi CX. Ñieàu
naøy chaéc chaén laø khoâng phaûi thuaän tieän ñoái vôùi ngöôøi söû duïng chöông trình.
Ví duï 2
Treân cô sôû ví duï tröôùc, ta phaûi vieát chöông trình sao cho soá doøng phai
giaõn caùch coù theå thay ñoåi ñöôïc ngay trong khi chaïy chöông trình.
Giaûi
Muoán coù soá doøng caùch thay ñoåi ñöôïc theo yù muoán giöõa 2 lôøi chaøo ta vaø
taây khi chaïy chöông trình maø khoâng phaûi thay giaù trò môùi gaùn cho thanh ghi
CX ngay trong chöông trình nhö ôû ví duï tröôùc, ta caàn duøng theâm 1 bieán môùi ñeå
chöùa soá doøng caùch vaø vieát chöông trình sao cho moãi khi cho chaïy thì chöông
trình coù theâm phaàn ñoái thoaïi ñeå ngöôøi söû duïng coù theå thay ñoåi giaù trò cuûa soá
doøng giaõn caùch ñoù.
Sau ñaây laø vaên baûn cuûa chöông trình thöïc hieän coâng vieäc treân:
.Model Small
.Stack 100
.Data
CRLF
DB 13,10,'$'
ChaoTay
DB 'Hello!S'
ChaoTa
DB 'Chao ban!S'
Thongbao DB 'go vao so dong cach:S'
SoCRLF
DB ?
.Code
MAIN Proc
MOV AX, @Data ; khôûi ñaàu thanh ghi DS
MOV DS, AX
; hieän thoâng baùo duøng haøm 9 cuûa INT 21H
MOV AH, 9
LEA DX, Thongbao
INT 21H
; ñoïc soá doøng caùch duøng haøm 1 cuûa INT 21H
MOV AH, 1
INT 21H
; ñoïc soá doøng caùch
AND AL, OFH
; ñoåi ra heä hai
MOV SoCRLE, AL
; caát ñi
; caùch 1 doøng duøng haøm 9 cuûa INT 21H
MOV AH, 9
LEA DX, CRLF
127
Vi xử lí
INT 21H
; hieån thò lôøi chaøo duøng haøm 9 cuûa INT 21H
MOV AH, 9
LEA DX, ChaoTay
INT 21H
LEA DX, CFLF
XOR CX, CX
MOV CL, SoCRLE
; CX chöùa soá doøng caùch
LAP: INT 21H
LOOP LAP
; hieän thò lôøi chaøo duøng haøm 9 cuûa INT 21H
LEA DX, ChaoTa
INT 21H
; trôû veà DOS duøng haøm 4CH cuûa INT 21H
MOV AH, 4CH
INT 21H
MAIN Endp
END MAIN
Trong thí duï treân coù moät ñieàu caàn chuù yù laø: khi ñoïc moät kyù töï töø baøm
phím (trong tröôøng hôïp cuï theå naøy thì ñoù laø soá doøng caùch) ta seõ thu ñöôïc trong
thanh ghi AL maõ ASCII cuûa kyù töï (soá ) ñaõ goõ. Ñeå söû duïng noù trong tröôøng hôïp
cuï theå nhö moät giaù trò soá vaø caát noù taïi bieán SoCRLF, ta phaûi bieán ñoåi maõ
ASCII naøy thaønh heä soá hai. Ñeå ñoái maõ ASCII cuûa moät soá ra trò soá hoaëc ngöôïc
laïi ta caàn nhôù raèng giöõa giaù trò soá vaø maõ ASCII cuûa soá ñoù coù moät khoaûng caùch
laø 30H. ví duï soá 9 coù maõ ASCII laø 39 H (coù theå ñöôïc vieát laø "9"), töông töï soá 0
coù maõ ASCII laø 30H (coù theå ñöôïc vieát laø "0")
Nhö vaäy vieäc bieán ñoåi maõ ASCII (giaû thieát ñaõ coù saün trong AL)→ giaù
trò soá coù theå thöïc hieän ñöôïc baèng moät trong caùc leänh sau:
+ SUB AL,30H
+ AND AL,0FH
Töông töï nhö vaäy, vieäc bieán ñoåi ngöôïc laïi töø soá heä hai (thöôøng giaû thieát
ñaõ coù saün trong thanh ghi DL) → maõ ASCII (ñeå ñöa ra hieän leân maõn hình) coù
theå laøm ñöôïc baèng moät trong caùc leänh sau:
+ ADD DL,30H
+ OR DL,30H
Ví duï 3
128
Vi xử lí
Ñoïc töø baøn phím moät soá heä hai (daøi nhaát laø 16 bit), keát quaû ñoïc ñöôïc
ñeå taïi thanh ghi BX. Sau ñoù hieän noäi dung thanh ghi BX ra maøn hình.
Giaûi
Coâng vieäc cuûa maøi naøy thöïc chaát goàm hai phaàn, moät phaàn ñaàu ta
phaûi ñoïc ñöôïc soá heä hai vaø caát noù taïi BX, trong phaàn tieáp theo ta phaûi ñöa
ñöôïc noäi dung cuûa thanh ghi BX ra maøn hình.
Sau ñaây laø vaên baûn cuûa chöông trình thöïc hieän coâng vieäc treân:
.Model Small
.Stack 100
. Data
TBao DB 'Go vao 1 so he hai (max 16 bit,'
DB 'CR de thoi):$'
.Code
MAIN proc
MOV AX, @ Data
MOV DS, AX
MOV AH, 9
; hieän thò thoâng baùo
LEA DX, TBao
INT 21H
XOR BX,BX
; BX chöùa keát quaû, luùc ñaàu laø 0
MOV AH, 1
; haøm ñoïc 1 soá töø baøn phím
TIEP: INT 21H
CMP AL, 13
; CR?
JE THOIDOC
; ñuùng, thoâi ñoïc
AND AL,OFH
; khoâng, ñoåi maõ ASCII ra soá
SHL BX, 1
; dòch traùi BX 1 bít ñeå laáy choã
OR BL,AL
; cheøn bít vöøa ñoïc vaøo keát quaû
JMP TIEP
; ñoïc tieáp moät kyù töï
THOIDOC:MOV CX,16 ; CX chöùa soá bít cuûa BX
MOV AH,2
; haøm hieän kyù töï
HIEN:XOR DL,DL
; xoaù DL ñeå chuaån bò ñoåi
ROL BX,1
; ñöa bít MSB cuûa BX sang CF
ADC DL, 30H
; ñoåi giaù trò bít ñoù ra ASCII
INT 21H
; hieån thò 1 bít cuûa BX
LOOP HIEN
; laëp laïi cho ñeán heát
MOV AH, 4CH
; trôû veà DOS
INT 21H
129
Vi xử lí
MAIN Endp
END MAIN
Chöông trình hôïp ngöõ cho coâng vieäc ñaõ neâu ñöôïc hình thaønh töø 2 phaàn,
moät phaàn vôùi chöùc naêng ñoïc vaø moät phaàn vôùi chöùc naêng hieän thò.
Thuaät toaùn cho phaàn ñoïc: ñoïc moät kyù töï soá, chuyeån maõ ASCII ra soá roài
cheøn soá ñoïc ñöôïc vaøo BX theo thöù töï töø phaûi qua traùi, laëp laïi coâng vieäc treân
caùc soá khaùc.
Thuaät toaùn cho phaàn hieän thò ngöôïc laïi so vôùi phaàn ñoïc: laáy ra 1 bít cuûa
soá ñoù trong BX theo thöù töï töø traùi qua phaûi, ñoåi soá ñoù ra maõ ASCII roài cho
hieän thò noù ra maøn hình, laëp laïi coâng vieäc treân cho caùc soá khaùc.
Caùc thuaät toaùn cuûa2 phaàn treân veà cô baûn coù theå öùng duïng ñöôïc cho
tröôøng hôïp phaûi ñoïc vaø hieän thò soá heä möôøi saùu hoaëc heä möôøi.
Moät soá nhaän xeùt coù theå ruùt ra khi ñoïc chöông trình treân:
+ Leänh xoùa thanh ghi BX laø raát caàn thieát ñeå sau naøy khi goõ vaøo caùc bít
cuûa noù ta khoâng nhaát thieát phaûi goõ ñuû 16 bít maø vaãn xaùc ñònh ñöôïc giaù trò cuûa
thanh ghi naøy.
+ Trong chöông trình naøy ta ñaõ duøng leänh ROL ñeå quay troøn thanh ghi
BX, vì vaäy sau khi quay vaø hieän thò taát caû 16 bít cuûa BX ta vaãn baûo toaøn ñöôïc
giaù trò cuûa thanh ghi BX luùc ñaàu. Ñeå so saùnh , neáu ôû phaàn treân thay vì leänh
quay ROL ta duøng leänh dòch SHL thì ta vaãn hieän thò ñöôïc ñuùng thanh ghi BX,
nhöng sau khi hieän thò xong thì quaù trò nguyeân thuûy cuûa thanh ghi BX, nhöng
sau khi hieän thò xong thì giaù trò nguyeân thuyû cuûa thanh ghi BX bò maát do quaù
trình dòch gaây neân.
+ Trong chöông trình naøy ta ñaõ duøng leänh coäng coù nhôù ADC moät caùch
raát hieäu duïng ñeå laáy ra 1 bít cuûa thanh ghi BX töø giaù trò cuûa côø CF vaø ñoåi luoân
ñöôïc noù ra maõ ASCII caàn thieát cho vieäc hieän thò.
Ví duï 4
Ngöôøi ta ñeå saün trong boä nhôù 2 soá heä hai, moãi soá naøy coù ñoä daøi 10
byte vaø ñöôïc ñeå theo thöù töï MSB...LSB. Ta phaûi tính toång cuûa hai soá nhieàu
byte ñoù, keát quaû cuõng ñeå trong boä nhôù.
Giaûi
Ñeå laøm tính coäng vôùi caùc toaùn haïng laø caùc soá vôùi ñoä daøi nhieàu hôn 1
byte nhö treân ta phaûi nghó ngay ñeán vieäc duøng leänh coäng coù nhôù ADC cho
caùc byte naèm beân traùi cuûa LSB. Coøn ñeå coäng caùc byte LSB cuûa 2 soá, taát
nhieân ta phaûi duøng leänh coäng bình thöôøng ADD. Ñeå cho vieäc toå chöùc caùc
130
Vi xử lí
leänh trong chöông trình ñöôïc toái öu, ta thay theá leänh ADD trong tröôøng
hôïp coäng 2 LSB naøy baèng leänh ADC nhöng vôùi côø CF = 0.
Xeùt veà maët toå chöùc döõ lieäu cho chöông trình trong ñoaïn döõ lieäu, ta
thaáy maûng oâ nhôù duøng chöùa keát quaû caàn coù ñoä daøi 11 byte ñeå chöùa heát
ñöôïc keát quaû cuûa pheùp coäng trong tröôøng hôïp toång quaùt. Chính vì vaäy ta
cuõng caàn taêng ñoä daøi cho caùc maûng chöùa toaùn haïng, moãi maûng theâm 1
byte nöõa, gaùn saün cho chuùng giaù trò 0 vaø ñaët phía tröôùc caùc byte MSB ñeå
taïo ra ñoä daøi thoáng nhaát cho caùc maûng döõ lieäu chöùa caùc toaùn haïng vaø keát
quaû cuûa pheùp coäng. Baèng caùch naøy trong khi vieát chöông trình ta coù theå
ñaït ñöôïc vieäc quaûn lyù ñôn giaûn hôn ñoái vôùi caùc thanh ghi leäch.
Sau ñaây laø chöông trình thöïc hieän coâng vieäc noùi treân.
.Model Small
.Stack 100
.Data
TBao DB 'DU lieu bat dau tö day'
So1 DB 00, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10
So2 DB 00, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10
;xi vaø yi phaûi ñöôïc thay baèng soá cuï theå
; Sum DB 11 dup (0)
. Code
MAIN proc
MOV AX, @Data
MOV DS, AX
MOV ES, AX
LEA BX, So1
; BX troû vaøo ñaàu daõy So1
LEA SI, So2
; SI troû vaøo ñaàu daõy So2
LEA DI, Sum
; DI troû vaøo ñaàu daõy Sum
MOV CX, 11
; CX chöùa soá byte phaûi coäng
XOR AL, AL
; xoùa côø CF vaø AL
LAP:MOV AL, 10[BX] ; laáy 1 byte cuûa So1
ADC AL, 10[SI] ; coäng vôùi byte cuûa So2
MOV 10[DI],AL ; caát keát quaû vaøo Sum
DEC BX
; giaûm con troû tôùi caùc maûng
DEC SI
DEC DI
LOOP LAP
; laëp laïi vôùi caùc byte khaùc
MOV AH, 4CH
; trôû veà DOS
131
Vi xử lí
INT 21H
MAIN Endp
END MAIN
Trong chöông trình treân ta khoâng coù phaàn leänh ñeå hieän thò keát quaû cuûa
pheùp coäng, vì vaäy ngay caû khi ñaõ thay caùc giaù trò soá cuï theå vaøo caùc bieán So1
vaø So2 roài dòch ra teäp chöông trình coù ñuoâi.EXE vaø cho chaïy noù, ta cuõng
khoâng kieåm tra keát quaû baèng caùch duøng chöông trình tìm loãi Debug (xem
theâm phaàn phuï luïc ñeå hieåu ñöôïc caùc thao taùc caàn thieát trong Debug).
Baèng chöông trình Debug ta coù theå quan saùt ñöôïc caùc leänh cuûa chöông
trình treân ñöôïc dòch vaø caát trong boä nhôù nhö theá naøo, ñoàng thôøi ta cuõng xem
ñöôïc caùc maûng döõ lieäu cuûa 2 toaùn haïng vaø cuûa keát quaû ñöôïc toå chöùc ra sao
trong boä nhôù. Luùc naøy ta môùi giaûi thích lyù do taïi sao ta coù ñònh nghóa doøng
thoâng baùo TBao trong ñoaïn döõ lieäu maø ôû beân trong chöông trình treân ta ñaõ
khoâng heà söû duïng ñeán noù. Thöïc chaát ñaây chi laø caùch duøng moät chuoãi kyù töï ñeå
ñaùnh daáu ñoaïn döõ lieäu maø ta quan taâm. Ñieàu naøy cho pheùp ta deã daøng nhaän
ñöôïc ñoaïn döõ lieäu maø ta quan taâm. Ñieàu naøy cho pheùp ta deã daøng nhaän ra
ñöôïc ñoaïn döõ lieäu maø ta caàn quan taâm trong moät vuøng nhôù chöùa döõ lieäu moãi
khi ta duøng Debug ñeå xem noäi dung cuûa noù.
Baây giôø ta seõ ñeà caäp ñeán vaán ñeà söû duïng Deug cuï theå hôn.
Neáu ta goõ vaên baûn cuûa chöông trình treân roài ñaët teân laø teäp ADC.ASM
vaø dòch noù ra teäp ADC.EXE ta coù theå duøng leänh sau ñeå chaïy ADC trong
Debug:
Debug adc.exe
Treân maøn hình seõ xuaát hieän daáu-ñoù laø daáu nhaéc cuûa Debug
Taïi daáu nhaéc ñoù cuûa Debug neáu ta goõ
-u 0 60
ta seõ nhaän ñöôïc moät maøn hình, trong ñoù moät beân chöùa ñòa chæ caùc oâ nhôù
keøm theo noäi dung cuûa caùc oâ ñoù (caùc maõ leänh vaø döõ lieäu) vaø beân kia laø caùc
doøng leänh gôïi nhôù töông öùng. Thöïc ra phaàn maõ leänh cuûa chöông trình keát thuùc
taïi ñòa chæ IP=0029H (byte cuoái cuûa leänh INT 21H). Tieáp ngay sau ñoù chính laø
phaàn daønh cho caùc döõ lieäu cuûa caùc toaùn haïng vaø keát quaû, nhö nhöõng döõ lieäu
ñoù luùc naøy (do ta ñang ôû cheá ñoä dòch ngöôïc -unassemble) ñaõ bò Debug coi nhö
132
Vi xử lí
laø maõ leänh vaø ñöôïc dòch ra thaønh caùc leänh gôïi nhôù. Muoán xem caùc maûng döõ
lieäu naøy ta goõ:
-d CS:0 60
ta seõ thaáy maõ leänh vaø döõ lieäu coù taïi moät ñòa chæ naøo ñoù ñöôïc hieän leân theo 2
kieåu: baèng caùc soá heä möôøi saùu (phaàn beân traùi) vaø baèng caùc kyù töï ASCII (phaàn
beân phaûi). Chính treân phaàn hieän thò ôû beân phaûi naøy ta deã daøng nhaän thaáy doøng
kyù töï duøng ñeå ñaùnh daâu maø ta ñaõ noùi ñeán tröôùc ñaây ('Du lieu bat dau tu day').
Neáu laáy haøng chöõ naøy laøm moác vaø nhìn sang phaàn hieän thò döôùi daïng soá heä
möôùi saùu ôû beân traùi (baét ñaàu töø ñòa chæ leäch 002AH) ta deã daøng ta tìm ra vò trí
vaø noäi dung cuûa caùc byte döõ lieäu (laø caùc toaùn haïng) vaø keát quaû (keát quaû ñöôïc
taïm gaùn baèng 0 luùc ñaàu).
Ñeå xem chöông trình naøy cho keát quaû ra sao ta phaûi cho noù chaïy trong
moâi tröôøng Debug. Muoán vaäy ta coù theå goõ
-g 50
Sau khi nhaän ñöôïc töø maáy caâu traû lôøi 'program terminated normally'
-chöông trình keát thuùc bình thöôøng (khoâng loãi), ta goõ tieáp
-d CS: 0 50
ñeå xem keát quaû cuûa chöông trình sau khi chaïy ñöôïc caát giöõ trong boä nhôù ra
sao.
Sau ñaây laø moät tröôøng hôïp cuûa chöông trình treân vôùi caùc döõ lieäu cuï theå.
Neáu ta goõ vaøo caùc byte cuûa caùc toaùn haïng vieát döôùi daïng caùc soá heä
möôøi saùu:
So1 = 00H 80H 81H 82H 83H 80H 80H 80H 83H 84H 85H vaø
So2 = 00H 80H 81H 82H 83H 80H 80H 80H 83H 84H 85H
thì khi cho chaïy chöông trình ta seõ nhaän ñöôïc.
Sum = 01H 01H 03H 05H 07H 01H 01H 01H 07H 09H 0AH
Ta coù theå tính 'baèng tay' ñeå kieåm chöùng laïi keát quaû treân.
Cuoái cuøng ñeå ra khoûi Debug ta goõ
-q
Qua moät vaøi thao taùc sô boä trong ví duï treân ta cuõng ñaõ thaáy ñöôïc phaàn
naøo söï tieän lôïi cuûa chöông trình Debug trong vieäc cho chaïy vaø thöû nghieäm caùc
chöông trình hôïp ngöõ ñôn giaûn
133
Vi xử lí
Ví duï 5
Trong thanh ghi BX coù saün 4 soá heä möôøi saùu, moãi soá ñöôïc bieåu dieãn
baèng 1 oâ maøu:
Haõy laäp trình ñeå bieán ñoåi thanh ghi BX thaønh:
(ví duï: neáu nhö luùc ñaàu thanh ghi BX chöùa giaù trò 1234H thì sau khi
bieán ñoåi, BX seõ chöùa giaù trò 3241H.v.v...)
Giaûi
Thöïc chaát ñaây laø kieåu baøi toaùn cuï theå naøy, sau khi xem xeùt daïng thöùc
cuûa thanh ghi BX tröôùc vaø sau khi bieán ñoåi, ta thaáy coù theå thu ñöôïc keát quaû
moât caùch raát ñôn giaûn baèng caùch quay traùi thanh ghi BX nguyeân goác ñi 12 bít
roài sau ñoù quay tieáp thanh ghi BH ñi 4 bít laø xong.
Sau ñaây laø chöông trình thöïc hieän coâng vieäc treân.
.Model Small
.Stack 100
.Code
MAIN Proc
MOV CL,12
ROL BX,CL
; quay BX ñi 12 bít
MOV CL, 4
ROR BH, CL
; traùo 4 bít thaáp vaø cao cuûa BH
MOV AH, 4CH
; trôû veà DOS
INT 21H
MAIN Endp
END MAIN
Ví duï 6
Coù moät chuoãi kyù töï trong boä nhôù. Haõy taïo ra moät baûn sao cuûa choãi
treân roài caát trong boä nhôù.
Giaûi
Ñeå giaûi baøi toaùn loaïi naøy coù theå öùng duïng caùc leänh chuyeån chuoåi.
Sau ñaây laø caùch toå chöùc döõ lieäu vaø chöông trình cho baøi toaùn treân vôùi ñoä
daøi choãi laø 8 byte
134
Vi xử lí
.Model Small
.Stack 100
.Data
Str1 DB 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'
Tbao DB "baûn sao cuûa choãi goác:', 10,13
Str2 DB 8 DUP (' ')
DB '$'
. Code
MAIN proc
MOV AX, @Data
; khôûi ñaàu cho DS vaø ES
MOV DS, AX
MOV ES, AX
LEA SI, Str1
; SI chæ vaøo chuoãi goác.
LEA DI, Str2
; DI chæ vaøo chuoãi ñích.
CLD
; ñònh höôùng tieán
MOV CX, 8
; CX chöùa soá byte phaûi coùp
REP MOVSB
; coùp sang choãi ñích
LEA DX, Tbao
; chuaån bò hieån thò baûn sao
MOV AH, 9
INT 21H
MOV AH, 4CH
; veà DOS
INT 21H
MAIN Endp
END MAIN
Ví duï 7
Coù moät chuoãi kyù töï thöôøng trong boä nhôù. Haõy taïo ra moät chuoãi kyù
töï chöõ hoa töø chuoãi treân roài caát chuoãi ñoù trong boä nhôù.
Giaûi:
Ví du naøyï vaø ví duï tröôùc khi khaùc nhau chuùt ít trong vieäc xöû lyù caùc
kyù töï cuûa chuoãi, vì vaäy phaàn treân caùc leänh coù tính chaát chuaån bò tröôùc vaø
sau caùc thao taùc vôùi chuoãi coù theå coi laø nhö nhau. Ñeå giaûi baøi toaùn naøy coù
theå öùng duïng caùc leänh LODSB vaø STOSB vôùi chuoãi ñaõ cho. Thuaät toaùn laø:
+ Laáy töøng kyù töï cuûa chuoãi goác (cuõ) baèng leänh LODSB,
+ Bieán ñoåi thaønh chöõ hoa baèng caùch tröø ñi 20H,
+ Caát kyù töï ñaõ bieán ñoåi vaøo chuoãi ñích (môùi) baèng leänh
STOSB.
135
Vi xử lí
Sau ñaây laø caùch toå chöùc döõ lieäu vaø chöông trình cho baøi toaùn treân
vôùi ñoä daøi chuoãi laø 8 byte. Ñeå minh hoaï moät caùch thao taùc khaùc so vôùi caùch
ôû ví duï tröôùc trong ví duï naøy laø duøng caùch thao taùc luøi ñoái vôùi chuoãi kyù töï.
.Model Small
.Stack 100
.Data
Str1 DB 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h'
Tbao DB 'chuoãi ñaõ ñöôïc ñoåi: ' , 10,13
DB '$'
.Code
MAIN Proc
MOV AX, @Data ; khôûi ñaàu ñaàu cho DS vaø ES
MOV DS, AX
MOV ES, AX
LEA SI, Str1+7 ; SI chæ vaøo cuoái chuoãi cuõ
LEA DI, Str2+7 ; DI chæ vaøo cuoái chuoãi môùi
STD
; ñònh höôùng luøi
MOV CX, 8
; CX chöùa soá byte phaûi ñoåi
LAP :
LODSB
; laáy 1 kyù töï cuûa chuoãi cuõ
SUB AL, 20H
; ñoåi thaønh chöõ hoa
STOSB
; caát vaøo chuoãi môùi
LOOP LAP
; laøm cho ñeán heát
LEA DX, Tbao
; chuaån bò hieän chuoãi môùi
MOV AH, 9
INT 21H
MOV AH, 4CH ; veà DOS
INT 21H
MAIN Endp
END MAIN
Ví duï 8
Cho 1 maûng goàm caùc phaàn töû kieåu byte. Haõy saép xeáp chuùng theo
thöù töï lôùn daàn.
Giaûi:
Ñaây laø baøi toaùn kinh ñieån raát hay gaëp trong khi hoïc laäp trình vôùi caùc ngoâ
ngöõ khaùc nhau. Thuaät giaûi cuûa noù vì theá cuõng khaù quen thuoäc: tìm phaàn töû
lôùn nhaát (max) trong daõy vaø xeáp phaàn töû ñoù vaøo cuoái daõy, tieáp tuïc laøm nhö
136
Vi xử lí
vaäy vôùi caùc phaàn töû coøn laïi (tröø phaàn töû vöøa ñöôïc tìm thaáy vaø ñöôïc xeáp
vaøo cuoái daõy).
Ñeå minh hoïa thuaät toaùn treân nhöng vôùi döõ lieäu cuï theå, ta giaû thieát
chuoãi caàn saép xeáp laø chuoãi cuûa caùc kyù töï ASCII goàm 10 phaàn töû. Taát
nhieân, chöông trình vaãn chaïy ñuùng khi tö thay caùc phaàn töû cuûa maûng treân
baèng caùc soá khoâng daáu coù ñoä lôùn bieåu dieãn ñöôïc trong phaïm vi 1 byte. Taïi
ñaây ta toå chöùc chöông trình thaønh 1 chöông trình chính vaø 1 chöông trình
con. Chöông trình con coù teân laø DOICHO ñöôïc goïi ra moãi khi caàn ñoåi choã
2 phaàn töû cuûa daõy.
Sau ñaåy laø chöông trình thöïc hieän coâng vieäc treân.
. Model Sall
. Stack 100
. Data
Tbao DB 'chuoãi ñaõ saép xeáp:' , 10, 13
MGB DB 'a' , 'Y' , 'G' , 'T' , 'y' , 'Z' , 'U' , 'B' , 'D' , 'E'
DB '$'
. Code
MAIN Proc
MOV AX, @Data
; khôûi ñaàu DS
MOV DS, AX
; BX: soá phaàn töû cuûa maûng
LEA DX, MGB
; DX chæ vaøo ñaàu maûng byte
DEC BX
; soá voøng so saùnh phaûi laøm
LAP : MOV SI, DX
; SI chæ vaøo ñaàu maûng
MOV CX, BX
; CX soá laàn so cuûa voøng so
MOV DI, SI
; giaû söû phaàn töû ñaàu laø max
MOV AL, {DI}
; AL chöùa phaàn töû cuûa max
TIMMAX: INC SI
; chæ vaøo phaàn töû beân caïnh
CMP {SI}, AL
; phaàn töû môùi > max ?
JNG TIEP
; khoâng, tim max
MOV DI, SI
; ñuùng, DI chæ vaøo max
MOV AL, {DI}
; AL chöùa phaàn töû max
TIEP: LOOP TIMMAX
; tìm max cuûa moät voøng so
CALL DOICHO
; ñoåi choã max - soá môùi
DEC BX
; soá voøng so coøn laïi
JNZ LAP
; laøm tieáp voøng so môùi
MOV AH, 9
; hieån thò chuoãi ñaõ saép xeáp
LEA DX, Tbao
137
Vi xử lí
INT 21H
MOV AH, 4CH
INT 21H
MAIN End
; veà DOS
DOICHO Proc
PUSH AX
MOV AL, {SI}
XCHG AL, {DI}
MOV {SI}, AL
POP AX
RET
DOICHO Endp
END MAIN
Sau khi dòch vaø cho chaïy chöông trìnhtreân ta thu ñöôïc caùc doøng sau:
chuoi da sap xep:
B, D, E, G, T, U, Y, Z, a, y
Ví duï 9
Ñoïc vaøo moät haøng (max 80) kyù töï roài hieån thò noù theo thöù töï ngöôïc laïi
Giaûi
Thuaâät toaùn cho vieäc ñoïc vaø hieån thò moät haøng kyù töï khoâng coù gì laø phöùc
taïp. Ñeå coù theå hieån thò caùc kyù töï theo thöù töï ngöôïc laïi so vôùi khi ñoïc moät caùch
thuaän tieän vaø traùnh ñöôïc caùc thao taùc röôøm raø, ta coù theå nghó ngay ñeán vieäc
öùng duïng nguyeân taéc laøm vieäc "vaøo tröôùc ra sau" cuûa ngaên xeáp: khi ñoïc ñöôïc
caùc kyù töï ta caát chuùng laàn löôït vaøo ngaên xeáp vaø sau ñoù laïi laáy laàn löôït caùc kyù
töï treân ra ñeå hieån thò.
Sau ñaây laø chöông trình thöïc hieän coâng vieäc treân.
. Model Small
. Stack 100
. Data
Tbao1 DB 'goõ vaøo moät daõy kyù töï: S'
Tbao2 DB 13, 10, 'daõy kyù töï xeáp ngöôïc laïi: S'
. Code
MAIN Rroc
MOV AX, @Data
MOV DS, AX
MOV AH, 9
138
Vi xử lí
LEA DX, Tbao1
INT 21H
XOR CX, CX
MOV AH, 1
DOCTIEP: INT 21H
LAP : CMP AL, 13
JE THOIDOC
PUSH AX
INC CX
IMP DOCTIEP
THOIDOC:LEA DX, Tbao2
MOV AH, 9
INT 21H
MOV AH, 2
HIEN:POP DX
INT 21H
LOOP HIEN
MOV AH, 4CH
INT 21H
MAIN Endp
END MAIN
; hieän Tbao1
; CX: ñeám soá kyù töï ñoïc ñöôïc
; ñoïc 1 kyù töï
; CR ?
; ñuùng, hieån thò Tbao2
; khoâng, caát noù vaøo ngaên xeáp
; caäp nhaät boä ñeám soá kyù töï
; caùch 1 doøng vaø hieän Tbao2
; chuaån bò hieån thò kyù töï
; laáy kyù töï ra töø ngaên xeáp
; hieän doøng kyù töï xeáp ngöôïc
; veà DOS
Ví duï 10
Ta phaûi ñoïc vaøo 1 doøng kyù töï töø baøn phím, keát thuùc baèng Enter. Sau ñoù
ta phaûi ñeám soá nguyeân aâm vaø soá phuï aâm coù trong daõy kyù töï ñoù roài hieån thò caùc
soá ñoù.
Giaûi
Trong baøi toaùn naøy coâng vieäc ñoïc vaøo moät daõy kyù töï töø baøn phím laø raát
ñôn giaûn. Chæ coøn phaûi noùi qua veà thuaät toaùn ñeå tìm caùc nguyeân aâm vaø phuï
aâm: ta phaûi toå chöùc döõ lieäu thaønh nhoùm caùc nguyeân aâm vaø nhoùm caùc phuï aâm
vaø seõ so saùnh caùc kyù töï ñoïc ñöôïc vôùi caùc thaønh phaàn cuûa moãi nhoùm naøy. Moãi
khi tìm ñöôïc kyù töï caùc phaàn töû ngöôøi ta thöôøng duøng leänh kieåu REPNE
SCASB.
Sau ñaây laø chöông trình NAMPAMASM thöïc hieän coâng vieäc treân.
; tính soá nguyeân aâm vaø phuï aâm trong moät doøng kyù töï
.Model Small
139
Vi xử lí
.Stack 100
.Data
Str
DB 80 dup (0)
NAM DB 'AaEeIiOoUuYy'
Pam' DB 'BCDFGHJKLMNPQRSTVWXZ'
DB 'bcdfghjklmnpqrstvwxz'
Tbao1 DB 13, 10, 'so ky tu la nguyen am = s'
Tbao2 DB 13, 10, 'so ky tu la phu am = s'
Tbao3 DB 'go vao 1 xau ky tu la phu am = '$'
SoNAM DW 0
SoPAM DW 0
.Code
MAIN Proc
MOV AX, @Data
; khôûi ñaàu cho DS vaø ES
MOV DS, AX
MOV ES, AX
LEA DI, Str
; DI chæ vaøo chuoãi
CALL DOCXAU
; ñoïc chuoãi, soá kyù töï taïi BX
MOV SI, DI
; SI chæ vaøo chuoãi vöøa ñoïc
CLD
; ñònh höôùng tieán
LAMLAI:
LODSB
; laáy 1 phaàn tö cuûa chuoãi
LEA DI, NAM
; DI chæ vaøo chuoãi ng.aâm
MOV CX, 12
; 6 nguyeân aâm, 2 loaïi chöõ
REPNE SCASB
; kyù töï laø nguyeân aâm ?
JNE PHUAM
; khoâng, ñoù laø phuï aâm
INC SoNAM
; taêng soá nguyeân aâm
JMP TIEP
PHUAM :
LEA DI, PAM
; DI chæ vaøo chuoãi phuï aâm
MOV CX, 40
; 20 phuï aâm, 2 loaïi chöõ
REPNE SCASB
; kyù töï laø phuï aâm ?
JNE TIEP
; khoâng
INC SoPAM
; taêng soá phuï aâm
TIEP: DEC BA
; soá kyù töï phaûi kieåm tra
JNE LAMLAI
; laøm laïi
MOV AH, 9
; chuaån bò hieån thò Tbao1
140
Vi xử lí
LEA DX, Tbao1
INT 21H
MOV AX, SoNAM
; laáy soá nguyeân aâm
CALL OUTSO
; hieån thò soá phuï aâm
MOV AH, 4CH
; veà DOS
INT 21H
MAIN Endp
DOCXAU Proc
; ñoïc vaø löu moät chuoãi kyù töï, keát thuùc baèng Enter
; Vaøo:
DI chöùa ñòa chæ leäch cuûa chuoãi
; Ra:
DI chöùa ñòa chæ leäch cuûa chuoãi
BX chöùa soá kyù töï ñoïc ñöôïc
PUSH DI
; caát con troû
CLD
; ñònh höôùng tieán ñeå caát
XOR BX, BX
; xoùa boä ñeám soá kyù töï
MOV AH, 1
; chuaån bò ñoïc moät kyù töï
DOCTIEP :
INT 21H
CMP AL, 13
; CR ?
JE THOI
; ñuùng, keát thuùc
CMP AL, 8
; BS ? (xoùa traùi)
JNE LUU
; khoâng, caát
DEC DI
; ñuùng, ñoåi laïi con troû
DEC BX
; bôùt ñi moät kyù töï
JMP DOCTIEP
; ñoïc tieáp
LUU: STOSB
; caát kyù töï
INC BX
; caäp nhaät soá kyù töï ñaõ ñoïc
JMP DOCTIEP
; ñoïc tieáp
THOI:POP DI
; laáy laïi con troû
RET
; veà CTC
DOCXAU Endp
OUTSO Proc
; hieån thò soá trong AX
; Vaøo: AX
MOV BL, 10
XOR CX, CX
; duøng BL ñeå chöùa soá chia
; CX: boä ñeám soá laàn hieän
141
Vi xử lí
LAP:
DIV BL
; AL: thöôïng, AH: dö
PUSH AX
; caát soá dö
INC CX
; caäp nhaät soá laàn
XOR AH, AH
; chuaån bò chia tieáp
OR AL, AL
; thöông = 0?
JNE LAP
; chöa, laëp
MOV AH, 2
; roài, chuaån bò hieån thò
HIEN: POP DX
; laáy laïi soá dö
OR DH, 30H
; ñoåi soá dö ra maõ ASCII
MOV DL, DH
INT 21H
; hieån thò keát quaû
LOOP HIEN
; laáy laïi soá laàn phaûi hieän
RET
; veà CTC
OUTSO Endp
END MAIN
So vôùi caùch laøm töø tröôùc ñeán nay thì trong phaàn chöông trình ñoïc kyù töï
(DOCXAU) ta ñaõ ñöa vaøo theâm moät soá leänh ñeå laøm cho vieäc xöû lyù caùc kyù töï
goõ töø baøn phím ñöôïc meàm deûo hôn: ta coù theå loaïi boû kyù töï goõ nhaàm baèng caùch
duøng phím BS (Back space, xoùa traùi). Tuy nhieân, treân maøn hình ta khoâng thaáy
ñöôïc hieäu öùng xoùa traùi thaät söï cuûa BS vì chöông trình maø ta vieát ôû ñaây vaãn
coøn quaù ñôn giaûn ñeå coù theå xöû lyù ñöôïc vaán ñeà khaù phöùc taïp naøy. Muoán laøm
ñöôïc ñieàu vöøa neâu ta seõ phaûi vieát moät chöông trình phöùc taïp hôn trong ñoù phaûi
söû duïng ñeán caùc haøm khaùc cuûa ngaét 21H.
Taïi chöông trình naøy ta cuõng thaáy ñöôïc caùch laøm ra caùc caâu chuù giaûi
cho phaàn maøo ñaàu cuûa caùc chöông trình con. Thoâng thöôøng trong caùc chuù giaûi
kieåu naøy ta phaûi neâu leân ñöôïc moät caùch vaén taét caùc vaán ñeà sau:
+ Nhieäm vuï cuûa chöông trình con
+ Caùc thanh ghi tham gia vaøo vieäc truyeàn tham soá cuûa chöông
trình khi vaøo hoaëc ra chöông trình ñoù.
Nhôø phaàn maøo ñaàu naøy cuûa moãi chöông trình con ta coù theå thu ñöôïc caùc
thoâng tin sô boä veà baûn thaân chöông trình con ñöôïc söû duïng. Ví duï nhö trong
chöông trình con DOCXAU, ta coù theå thaáy ñöôïc caùc thanh ghi naøo tham gia
vaøo vieäc truyeàn tham soá giöõa chöông trình chính vaø chöông trình con. Vaán ñeà
truyeàn tham soá giöõa caùc chöông trình cuõng laø vaán ñeà maø ta seõ ñeà caäp kyõ hôn ôû
phaàn sau.
Ví duï 11
142
Vi xử lí
Laäp moät chöông trình treã vôùi thôøi gian treã 1ms döôùi daïng chöông
trình con ñeå coù theå söû duïng noù trong caùc tröôøng hôïp caàn thieát.
Giaûi
Chöông trình treã thôøi gian coù raát nhieàu öùng duïng trong thöïc teá: töø
vieäc taïo ra xung aâm thanh vôùi caùc thanh ñieäu khaùc nhau cho ñeán vieäc ñieàu
khieån caùc ñaïi löôïng vaät lyù trong moät heä thoáng vi xöû lyù - ñieàu khieån öùng
duïng trong coâng nghieäp. Ñeå giaûi quyeát vaán ñeà naøy, thoâng thöôøng ta laäp ra
moät chöông trình trong ñoù coù chöùa moät caáu truùc laëp, beân trong caáu truùc
laëp ñoù chöùa caùc leänh maø thôøi gian ñeå chaïy moãi leänh ñoù coù theå xaùc ñònh
ñöôïc töø caùc taøi lieäu tra cöùu. Soá laàn laëp cuûa voøng laëp thöôøng ñöôïc chöùa
trong moät thanh ghi ñeå coù theå thay ñoåi ñöôïc. Moät chöông trình nhö nhö
vaäy thöôøng phuï thuoäc raát nhieàu vaøo phaàn cöùng cuûa heä thoáng (chí ít cuõng
phuï thuoäc vaøo loaïi CPU vaø taàn soá cuûa ñoàng hoà nhòp cho noù).
Trong thí duï sau ñaây, ñeå cho coâng vieäc tính toaùn ñöôïc ñôn giaûn, ta
giaû thieát CPU laø loaïi 8088-5 MHz (T clk = 0.200µs). Moät chöông trình vieát
döôùi daïng thuû tuïc ñeå taïo thôøi gian treã 1ms coù theå nhö sau:
TRE1ms Proc
; chöông trình treã 1ms
; CLI
PUSHCX
MOV CX, 292
LAP:;NOP
LOOP LAP
POP CX
; STI
RET
TRE1ms Endp
; caám caùc ngaét
; caát CX
; xem caùch tính '292' ôû döôùi
; coù NOP ñeå taêng thôøi ;gian
trể nếu cần
; laáy laïi CX
; cho pheùp ngaét trôû laïi
Trong chöông trình con noùi treân, soá laàn laäp ñeå trong CX phaûi ñöôïc tính
toaùn sao cho thôøi gian chaïy toaøn boä chöông trình vôùi caùc voøng laëp keùo daøi xaáp
xæ 1ms. Ta noùi xaáp xæ laø vì trong thöïc teá khi CPU laøm vieäc, noù coøn coù theå coøn
bò treo ñeå cho quaù trình laøm töôi boä nhôù ñöôïc hoaøn taát (neáu heä thoáng söû duïng
RAM ñoäng). Theâm vaøo ñoù, vì soá laàn laëp chöùa trong CX phaûi laø soá nguyeân neân
keát quaû töø caùc tính toaùn thöïc caàn phaûi ñöôïc laøm troøn cho phuø hôïp, töø ñoù gaây ra
sai soá.
143
Vi xử lí
Trong moät heä vi xöû lyù hoaït ñoäng vôùi nhieàu nguoàn gaây ngaét, ñoâi khi ñeå
taïo ra moät khoaûng thôøi gian treã xaùc ñònh vaø khoâng chòu taùc ñoäng cuûa caùc yeâu
caàu ngaét, ta coøn phaûi coù caùc leänh caám/cho phaùp caùc yeâu caàu ngaét tröôùc/sau
khi chaïy phaàn leänh tính thôøi gian (nhö ôû trong ví duï treân, ta coù theå boû caùc daáu
chaám phaåy'.' ñöùng tröôùc caùc leänh CLI vaø STI ñeå ñaït ñöôïc ñieàu naøy).
Baây giôø ta seõ noùi qua veà caùch tính giaù trò soá phöûi ñöa vaøo thanh ghi CX
trong thí duï treân (khoâng tính ñeán caùc leänh CLI.NOP vaø STI)
Theo taøi lieäu tra cöùu daønh cho taäp leänh cuûa CPU 8088, ta coù ñöôïc thôøi
gian cho caùc leänh lieân quan trong chöông trình treân tính theo ñôn vò T clk nhö
sau:
Leänh
Soá chu kyø
PUSH
11
POP
8
MOV
4
LOOP
17 (hoaëc 5 trong tröôøng hôïp khoâng laëp)
RET
16
Neáu ta goïi soá caàn tìm ñeå ñöa vaøo thanh ghi CX laø N, ta seõ thu ñöôïc N
khi giaûi phöông trình sau:
Tclk* (11 + 8 + 4 + 16 +(N-1)*17 + 5) = 1 ms
Thay soá vaøo ta ñöôïc:
34 + 17 * N = 5000 hay N = 5000/17-2
Töø ñoù ruùt ra N ≈ 292, ñaây chính laø giaù trò phaûi ñöa vaøo thanh ghi CX ôû
treân.
Nhaän xeùt phöông trình cuoái cuøng ta thaáy thöoøi gian maø voøng laëp phaûi
"gieát" lôùn hôn raát nhieàu so vôùi thôøi gian daønh cho caùc leänh khaùc, vì vaäy ta coù
theå tính ñöôïc N vôùi sai soá khoâng lôùn laém khi laáy N ≈ 5000/17 ≈ 294.
Trong ví duï treân ta môùi chæ duøng ñeán moät giaù trò nhoû maø thanh ghi CX
coù khaû naêng bieåu dieãn. Neáu ta thay giaù trò lôùn nhaát CX = 65535 thì coù theå ñaït
ñöôïc thôøi gian treã lôùn nhaát khoaûng 224 ms.
Trong caùc maùy IBM PC caùc chöông trình treã thôøi gian ñaït ñoä chính xaùc
cao thöôøng ñöôïc thöïc hieän baèng caùch duøng chöông trình ñeå ñeám caùc xung thu
ñöôïc töø caùc maïch ñònh thôøi gian (timer) coù saün trong maùy. Caùc maïch ñònh thôøi
gian naøy seõ coù xung ñaàu vaøo raát chính xaùc ñöôïc laáy töø caùc xung ñoàng hoà cuûa
heä thoáng.
5. Vaán ñeà truyeàn tham soá giöõa caùc chöông trình
144
Vi xử lí
Trong khi laäp trình cho caùc öùng duïng cuï theå, moät vaán ñeà raát ñaùng quan
taâm laø caùch truyeàn tham soá giöõa chöông trình chính (CTC) vaø chöông trình con
(cyc) hoaëc giöõa caùc moâñun chöông trình vôùi nhau (khi duøng kyõ thuaät laäp trình
kieåu moâñun maø ta khoâng xem xeùt ôû ñaây).
Noùi chung trong thöïc teá ngöôøi ta thöôøng duøng caùc caùch truyeàn thoâng soá
sau:
+ Truyeàn tham soá qua thanh ghi
+ Truyeàn tham soá qua oâ nhôù - bieán
+ Truyeàn tham soá qua oâ nhôù coù ñòa chæ do thanh ghi chæ ra
+ Truyeàn tham soá qua ngaên xeáp
Sau ñaây laø moät soá ví duï veà vieäc truyeàn tham soá giöõa caùc chöông trình.
Ví duï 1: truyeàn tham soá qua thanh ghi
Caùch truyeàn tham soá thoâng qua thanh ghi trong caùc ngoân ngöõ khaùc coøn
ñöôïc goïi laø truyeàn baèng giaù trò.
Ví duï trình baøy moät chöông trình doïc vaø hieån thò moät heä soá möôøi saùu
goàm 2 phaàn ñöôïc toå chöùc theo kieåu CTC vaø ctc. CTC goïi 1 ctc ñeå ñoïc vaøo moät
soá heä möôøi saùu roài caát noù trong thanh ghi BX vaø goïi tieáp 1 ctc khaùc laáy soá vöøa
ñoïc caát taïi BX ñeå hieän thò ra maøn hình; noùi khaùc ñi, 2 phaàn cuûa chöông trình
truyeàn tham soá vôùi nhau thoâng qua noäi dung cuûa thanh ghi BX. Caùc chöông
trình con ñöôïc gaén vaøo sau chöông trình chính nhôø leänh giaû INCLUDE.
Sau ñaây laø avön baûn chöông trình thöïc hieän coâng vieäc treân.
(Teäp CHINH.ASM chöùa CTC):
.Model Small
.Stack 100
.Code
MAIN Proc
CALL INHEX
;vaøo soá heä hex, keát quaû ôû BX
MOV AH, 2
;caùch 1 doøng
MOV DL, 13
INT 21H
MOV DL, 10
INT 21H
CALL OUTHEX
;hieän thò keát quaû coù taïi BX
MOV AH, 4CH
;veà DOS
INT 21H
MAIN Endp
145
Vi xử lí
INCLUDE vao.asm; vao.asm chöùa INHEX
INCLUDE ra.asm ; ra.asm chöùa INHEX
;caùc ctc naøy naèm trong cuøng thö muïc vôùi CTC
END MAIN
Tieáp theo ñaây laø teäp VAO.ASM chöùa thuû tuïc INHEX vaø taäp RA.ASM
chöùa thuû tuïc OUTHEX. Caùc thuû tuïc naøy ñöôïc goïi trong chöông trình
CHINH.ASM ñaõ noùi ôû treân.
Teäp VAO.ASM vaø RA.ASM phaûi ñöôïc ñeå trong cuøng moät thö muïc vôùi
CHINH.ASM, neáu khoâng ta phaûi ghi caû ñöôøng daãn ñaày ñuû cuûa chuùng.
Teäp VAO.ASM (chöùa ctc INHEX):
INHEX Proc
;nhaân vaøo 4 soá heä möôøi saùu.
;ra : BX chöùa keát quaû
BDAU:XOR BX, BX
; xoùa BX ñeå chöùa keát quaû
MOV CX, 4
;CL chöùa soá laàn dòch
MOV AH, 2
;chuaån bò hieän daáu nhaéc
MOV DL,'?'
INT 21H
MOV AH, 1
;ñoïc 1 kyù töï
LAP1: INT 21H
CMP AL, 13
;CR ?
JE RA
;ñuùng, ra
CMP AL, '0'
;kyù töï >='0' ?
JNGE SAI
;khoâng, xöû lyù sai
CMP AL'9'
;kyù töï ='A' ?
JNLE SAI
;khoâng, xöû lyù sai
CMP AL'F'
;kyù töï [...]... chương trình hợp ngữ để dòch ra chương trình COM Nhìn vào khung chương trình hợp ngữ để dòch ra tệp chương trình đuôi EXE ta thấy có mặït đầy đủ các đoạn Trên máy tính IBM PC ngoài tệp chương trình với đuôi EXE Chúng ta còn có khả năng dòch chương trình hợp ngữ có kết cấu thích hợp ra một loại tệp chương trình chạy được kiểu khác với đuôi COM Đây là một chương trình ngắn gọn và đơn giản hơn nhiều so với. .. thể dòch được ra chương trình đuôi COM thì chương trình nguồn hợp ngữ phải được kết cấu sao cho thích hợp với mục đích này Sau đây là khung của một chương trình hợp ngữ để dòch được ra tệp chương trình đuôi COM Model Tiny Code ORG 100h ; Đây là khai báo quan trọng cho COM START: JMP CONTINUE ; các đònh nghóa cho biến và hằng để tại đây CONTINUE : MAIN Proc ; các lệnh của chương trình chính để tại đây... chương trình gọn hơn Tất nhiên ta cũng có thể dùng hàm 4CH của ngắt INT 21H như đã dùng trong chương trình để dòch ra tệp EXE Để kết thúc toàn bộ chương trình ta dùng hướng dẫn chương chính dòch END đi kèm theo nhãn START tương ứng với đòa chỉ lệnh đầu tiên của chương trình trong đoạn mã Sau đấy là ví dụ của một chương trình hợp ngữ để dòch ra tệp chương trình chạy được với đuôi COM (chương trình 4.2)... chạy một chương trình hợp ngữ trên máy IBM PC Như đã nói trong phần trước, máy IBM PC là phương tiện lý tưởng để chúng ta tạo ra và thử nghiệm các chương trình hợp ngữ 8086/88 Các bước để làm công việc này có thể liệt kê ra như sau: 1 Dùng các phần mềm soạn thảo văn bản (SK, NCedit ) để tạo ra một tệp văn bản chương trình gốc bằng hợp ngữ Tệp này phải được gán đuôi ASM 2 Dùng chương trình dòch MASM... trình chạy được với đuôi COM 112 Vi xử lí 5 Cho chạy chương trình vừa dòch Qua quá trình thực hiện các công việc nói trên có thể được minh họa bằng lưu đồ trên hình 4.2 Sau đây ta sẽ nói kỹ và cụ thể hơn về một số công đoạn trong quá trình soạn thảo và cho chạy chương trình hợp ngữ • Để soạn thảo chương trình hợp ngữ ta có thể dùng các chương trình soạn thảo văn bản như BKED hoặc các chức năng soạn thảo... này nếu trong chương trình có lỗi cú pháp thì ta phải quay lại bước 1 để sửa lại chương trình gốc 3 Dùng chương trình LINK để nối một hay nhiều tệp OBJ lại với nhau thành một tệp chương trình chạy được với đuôi EXE 4 Nếu chương trình gốc viết ra là để dòch ra kiểu COM thì ta phải dùng chương trình EXE2BIN (đọc là EXEtoBIN) của DOS để dòch tiếp tệp EXE ra tệp chương trình chạy được với đuôi COM 112 Vi... của chương trình *.asm Dùng MASM để dòch ra mã máy *.obj Dùng LINK để nối tệp obj lạithành *.exe Dòch được ra.com? s đ Dùng EXE2BIN để dòch *.exe thành *.com 113 Cho chạy chương trình Vi xử lí Hình 4.2 Các bước công việc để tạo ra và cho chạy một chương trình hợp ngữ Sau lệnh này MASM sẽ kiểm tra lỗi của chương trình gốc và đưa ra bản thống kê các lỗi nếu có Trong trường hợp chương trình hợp ngữ không... Turbo Pascal, SK, NC nhưng tốt nhất nên dùng các chương trình SK hoặc NC vì các chương trình này có khả năng thường trú do đó rất thích hợp cho việc sửa đổi và cho chạy thử chương trình • Trong bước 2 ta có thể dùng lệnh MASM theo 2 cách khác nhau Giả thiết chúng ta có tệp chương trình 4.2 mang tên vidu.asm tại ổ đóa A và chương trình dòch hợp ngữ MASM tại ổ C Nếu ta không muốn MASM trong khi dòch tạo... chương trình chính để tại đây ; Trở về DOS dùng hàm 4CH của INT 21H MOV AH, 4CH INT 21 H MAIN Endp ; các chương trình con (nếu có ) để tại đây END MAIN ;Kết thúc chương trình chính prog.asm Trong khung chương trình trên, tại dòng cuối cùng của chương trình ta dùng hướng dẫn chương trình dòch END và tiếp theo là MAIN để kết thúc toàn bộ chương trình Ta có nhận xét rằng MAIN là tên của chương trình chính... phải tiến hành bước thứ 4, tức là dùng EXE2BIN để dòch tiếp chương trình EXE vừa thu được ra chương trình COM Cần lưu ý rằng một chương trình EXE được tạo ra để rồi tiếp theo được dòch thành Chương trình COM (như trường hợp vidu.exe của chúng ta) không phải là một chương trình chạy được Giả thiết có chương trình EXE2BIN ở tại ổ C và chương trình vidu.exe ở tại ổ A ta có thể sử dụng lệnh sau: A>C:EXE2BIN ... chương trình hợp ngữ để dòch chương trình EXE Từ khai báo đoạn chương trình nói ta xây dựng khung tổng quát cho chương trình hợp ngữ với kiểu kích thước nhớ nhỏ Sau khung cho chương trình hợp ngữ. .. Khung chương trình hợp ngữ để dòch chương trình COM Nhìn vào khung chương trình hợp ngữ để dòch tệp chương trình đuôi EXE ta thấy có mặït đầy đủ đoạn Trên máy tính IBM PC tệp chương trình với đuôi... nhãn START tương ứng với đòa lệnh chương trình đoạn mã Sau ví dụ chương trình hợp ngữ để dòch tệp chương trình chạy với đuôi COM (chương trình 4.2) Chương trình 4.2 Chương trình Helo.COM Model
Ngày đăng: 22/10/2015, 17:08
Xem thêm: Lập Trình Bằng Hợp Ngữ Với 8088