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 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
Trang 97
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): Teâ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 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.
Trang 98
• 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 MOV DS, AX MOV ES, AX 1.2. Döõ lieäu cho chöông trình
Trang 99
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 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.
Trang 100
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... 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
Trang 101
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 • 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.
Trang 102
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ôù 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öõ
Trang 103
Kieåu kích thöôùc Tiny (Heïp) Small (Nhoû) Medium (Trung bình) Compact (Goïn) Large (lôùn) Huge (Ñoà soä)
Moâ taû Maõ leänh vaø döõ lieäu goùi goïn trong moät ñoaïn Maõ leänh goùi goïn trong moät ñoaïn , döõ naèm trong moät ñoaïn. Maõ leänh khoâng goùi goïn trong moät ñoaïn lieäu naèm trong moät ñoaïn. Maõ leänh khoâng goùi goïn trong moät ñoaïn lieäu khoâng goùi goïn trong moät ñoaïn. Maõ leänh khoâng goùi goïn trong moät ñoaï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. Maõ leänh khoâng goùi goïn trong moät ñoaïn lieäu khoâng goùi goïn trong moät ñoaïn. caùc maûng coù theå lôùn hôn 64KB
lieäu , döõ , döõ , döõ
, döõ
• 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 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 Ñ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!$'
Trang 104
CR LF •
DB 13 EQU 10 Khai baùo ñoaïn maõ
Ñ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. Moät thuû tuïc ñöôïc ñònh nghóa nhôø caùc leänh giaû PROC vaø ENDP. Leänh giaû PROC ñeå baét ñaàu moät thuû tuïc coøn leänh giaû ENDP ñöôïc duøng ñeå keát thuùc noù. 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 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. • 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. . Model small
Trang 105
.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 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 ; neáu caàn 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. 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
Trang 106
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. • Khung cuûa chöông trình hôïp ngöõ ñeå dòch ra chöông trình. COM
Trang 107
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ù maï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 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). 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õ
Trang 108
ñ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 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ù
Trang 109
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õ. Stack chöông trình
chöông trình SS CS DS ES
100h PSP
100h PSP
Trang 110 .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. 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.
Trang 111
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
Cho chaïy chöông trình 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
Trang 112
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: Micrisoft (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 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
Trang 113
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 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 viñu‹viu2; 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
Trang 114
vaø treân maøn hình seõ thu ñöôïc caùc doøng chöõ nhö sau: A> vidu 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
Trang 115
ñ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. 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öõ.
Trang 116
• Caáu truùc tuaàn töï 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: ; • Caáu truùc IF - THEN Ngöõ phaùp (hình 4.2): IF Ñieàu kieän THEN coâng vieäc.
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.
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ù trong chöông trình hôïp ngöõ.
Ñieàu kieän Sai
Ñuùng Coâng vieäc
Ñieàu kieän Sai Coâng vieäc 1
Ñuùng Coâng vieäc 1
Trang 117
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 ; AX<0? JNL GAN ; khoâng, gaùn luoân. NEG AX ; ñuùng. ñaøo daáu, roài GAN: MOV BX, AX ; loái ra cuûa caáu truùc. • Caáu truùc IF - THEN - ELSE Ngöõ phaùp (hình 4.3): IF ÑieàuKieän THEN CoângVieäc1 ELSE CoângVieäc2 Töø ngöõ phaùp cuûa caáu truùc IF-THEN-ELSE ta thaáy neáu thoaû maõn Ñieàu kieän thì Coângvieäc1 ñöôïc thöïc hieän neáu khoâng thì Coângvieäc2 ñöôïc thöïc hieän. Ñieàu naøy töông ñöông vôùi vieäc duøng leänh nhaûy coù ñieàu kieän vaø khoâng ñieàu kieän ñeå nhaûy ñeán caùc nhaõn naøo ñoù trong chöông hôïp ngöõ. Ví duï Gaùn cho CL giaù trò bit daáu cuûa AX. 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:
•
QR AX, AX ; AX>0?. JNS DG ; ñuùng. MOV CL, l ; sai, cho CL ← 1 roài JMP RA ; di ra. DG: XOR CL, CL ; cho CL ← 0. RA: ; 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
Trang 118
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. JL AM ; AX<0. JE KHONG ; AX =0. JG DUONG ; 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.
Trang 119
• 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ä Coâng vieäc ì Giaûm boä ñeám ñi 1 Boä ñeám=0
sai
ñuùng Giaûi Hình 4.5. Caáu truùc laëp FOR - DO. 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
Trang 120
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
sai
Hình 4.7. Caáu truùc REPEAT - UNTIL Hình 4.6. Caáu truùc WHILE - DO 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 ; toång soá kyù töï ñoïc ñöôïc luùc ñaàu laø 0 MOV AH, 1 ; haøm ñoïc kyù töï töø baøn phím. TIEP: INT 21H ; ñoïc 1 kyù öï, Al chöùa maõ kyù töï. CMP AL, 13 ; ñoïc ñöôïc CR? JE RA ; ñuùng, ra. INC CX ; sai, theâm 1 kyù töï vaøo toång. RA: ; 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.
Trang 121
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. 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ï
Trang 122
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 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
Trang 123
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 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 phaûi 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ân phaûi thay giaù trò môùi gaùn cho thanh ghi CX ngay trong chöông trinh 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 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 chöông trình coù theâm phaàn ñoái thoaïi ñeå ngöôøi söû duïng coù theå tuøy yù thay ñoåi giaù trò cuûa soá doøng giaõn caùch ñoù. 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' .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
Trang 124
; Caùch 5 doøng duøng haøm 9 cuûa INT 21H LEA DX, CFLF 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 4CH cuûa INT 21H MOV AH, 4CH I'NT 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 giaõn caùch giöõa hai lôøi chaøo ta vaø lôøi chaøo taây, ta phaûi gaùn giaù trò khaùc cho thanh ghi CX. Ñieàu naøy chaéc chaén khoâng phaûi laø 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
Trang 125
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 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
Trang 126
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 HH (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 AL30H + AND AL0FH 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 DL30H + OR DL30H Ví duï 3 Ñ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?
Trang 127
JF 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 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.
Trang 128
+ 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 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
Trang 129
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 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
Trang 130
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ö 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.
Trang 131
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 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 MOV CL, 4 ROR BH, CL MOV AH, 4CH INT 21H MAIN Endp END MAIN
; quay BX ñi 12 bít ; traùo 4 bít thaáp vaø cao cuûa BH ; trôû veà DOS
Trang 132
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 .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:
Trang 133
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. 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
Trang 134
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ö 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
Trang 135
DEC BX JNZ LAP MOV AH, 9 LEA DX, Tbao INT 21H MOV AH, 4CH INT 21H MAIN End
; soá voøng so coøn laïi ; laøm tieáp voøng so môùi ; hieån thò chuoãi ñaõ saép xeáp
; 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
Trang 136
MAIN Rroc MOV AX, @Data MOV DS, AX MOV AH, 9 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.
Trang 137
; tính soá nguyeân aâm vaø phuï aâm trong moät doøng kyù töï .Model Small .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
Trang 138
JNE LAMLAI ; laøm laïi MOV AH, 9 ; chuaån bò hieån thò Tbao1 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
Trang 139
MOV BL, 10 ; duøng BL ñeå chöùa soá chia XOR CX, CX ; CX: boä ñeám soá laàn hieän 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.
Trang 140
Ví duï 11 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 (Tclk = 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 PUSH CX 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 ; 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á.
Trang 141
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ò Tclk 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 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:
Trang 142
+ 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 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
Trang 143
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öï <='9' ? JG CHUI ;khoâng, coù theå laø chöõ AND AL, OFH ;ñuùng, ñoåi ra soá. JMP DICH ;xöû lyù tieáp CHU1: CMP AL.'A' ;kyù töï >='A' ? JNLE SAI ;khoâng, xöû lyù sai CMP AL'F' ;kyù töï <='F' ? JNLE SAI ;khoâng, xöû lyù sai SUB AL, 37H ;ñoåi kyù töï heä hex ra soá DICH: SHL BX, CL ;dòch 4 bit ñeå laáy choã OR BL, AL ;cheøn soá ñoïc ñöôïc vaøo BX JMP LAP1 ;ñoïc tieáp 1 kyù töï RA : RET ;veà CTC SAI: MOV AH, 2 MOV DL, 13 INT 21H MOV DL, 10
Trang 144
INT 21H ;veà daàu doøng môùi JMP BDAU ;laøm laïi töø ñaàu INHEX Endp OUTHEX Proc ;hieän thò soá heä möôøi saùu trong BX MOV CX, 4 ;CX: boä ñeám soá laàn hieän MOV AH, 2 ;chuaån bò hieän keát quaû LAP2:PUSH CX ;caát boä ñeám soálaàn hieän MOV CL, 4 ;CL: soá bit phaûi quay ROL BX, BL ;cuûa thanh ghi BX MOV DL, BL ;chuyeån sang DL ñeå xöû lyù AND DL, OFH ;chæ quan taâm 4 bit cuoái CMP DL, 9 ;soá hex ñoù laø chöõ? JG CHU2 ;ñuùng, ñoåi chöõ ra maõ ASCII OR DL, 30H ;khoâng, ñoåi soá ra maõ ASCII IMP HIEN CHU2:ADD DL, 37H HIEN:INT 21H ;hieån thò keát quaû POP CX ;laáy laïi soá laàn phaûi hieän LOOP LAP2 ;hieän cho ñeán heát thì thoâi RET ;veà CTC OUTHEX Endp Chöông trình OUTHEX chaúng qua laø chöông trình OUTSO ñaõ giôùi thieâäu ôû phaàn tröôùc vaø ñöôïc thay ñoåi chuùt ít cho phuø hôïp vôùi vieäc hieän thò soá heä möôøi saùu. Trong chöông trình treân, ñeå laøm cho chöông trình ñôn giaûn ta chæ vieát caùc leänh ñeå hieän ra daáu?. Vôùi muïc ñích nhaéc nhôû ngöôøi söû duïng goõ vaøo 4 soá heä möôøi saùu ñuùng quy caùch. ta ñònh nghóa caùc soá sau laø caùc chöõ soá heä möôøi saùu ñuùng quy caùch cho chöông trình treân. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F Trong khi chaïy chöông trình seõ töï ñoäng tieán haønh kieåm tra vieäc goõ vaøo heä soá möôøi saùu ñeå loaïi boû tröôøng hôïp caùc kyù töï khoâng hôïp leä. Neáu ngöôøi söû duïng goõ vaøo caùc kyù töï khoâng ñuùng quy caùch thì phaûi goõ laïi töø ñaàu. Ví duï 2: truyeàn tham soá qua oâ nhôù bieán Ví duï naøy trình baøy moät chöông trình coäng 2 soá goàm 2 phaàn, toå chöùc theo kieåu chöông trình chính vaø chöông trình con. Hai phaàn naøy truyeàn vaøo tham soá vôùi nhau thoâng qua oâ nhôù daønh cho bieán (thanh ghi ngoaøi).
Trang 145
Chöông trình cuûa ví duï naøy ñöôïc vieát ra vôùi muïc ñích chính chæ laø ñeå trình baøy moät caùch toå chöùc moái lieân heä giöõa moät chöông trình chính vaø moät chöông trình con: vì vaäy vaán ñeà maø chöông trình caàn giaûi quyeát ñöôïc ñaët ra thaät ñôn giaûn: coäng 2 soá maø toång cuûa chuùng nhoû hôn 10. Neáu ta goõ vaøo 2 soá khoâng ñuùng yeâu caàu treân thì chöông trình khoâng traû lôøi ñöôïc vaø töï thoaùt ra. Sau ñaây laø vaên baûn chöông trình thöïc hieän coâng vieäc treân. .Model Small .Stack 100 .Data Tbao1 DB 'Goõ vaøo 2 soá coù toång <10: S' Tbao2 DB 13, 10, ' Toång cuûa ' So1 DB ? DB ' vaø ' So2 DB ? DB ' laø ' SUM DB -30H, '$' .Code MAIN Proc MOV AX, @Data MOV DS, AX ;khôûi taïo MOV AH, 9 LEA DX, Tbao1 INT 21H ;hieän Tbao1 MOV AH, 1 ;ñoïc So1 INT 21H MOV Sol, AL ;caát maõ soá So1 MOV DL, ',' ;daáu phaåy ñan xen giöõa 2 soá MOV AH, 2 INT 21H MOV AH, 1 ;ñoïc soá 2 INT 21H MOV So2, AL ;caát maõ cuûa So2 CALL ADD2SO ;coäng 2 soá LEA DX, Tbao2 MOV AH, 4CH ;veà DOS INT 21H MAIN Endp
Trang 146
ADD2SO Proc MOV AL, So1 ;laáy maõ soá1 ADD AL, So2 ;coäng vôùi maõ soá2 ADD SUM, AL ;ñoåi ra ASCII vaø caát ñi RET ADD2So Endp END MAIN Ví duï 3: truyeàn tham soá qua oâ nhôù ñòa chæ cho bôûi thanh ghi Ñaây laø moät caùch truyeàn tham soá maø trong caùc ngoân ngöõ laäp trình khaùc thöôøng ñöôïc mang teân laø truyeàn baèng ñòa chæ cuûa tham soá Ñeå deã so saùnh caùc caùch truyeàn tham soá vôùi nhau, ta minh hoïa caùch truyeàn tham soá naøy baèng caùch giöõ nguyeân baøi toaùn cuûa ví duï trwosc Caùc thanh ghi SI, DI vaø BX ñöôïc söû duïng ñeå chöùa ñòa chæ leäch cuûa caùc tham soá caàn truyeàn (coøn thanh ghi ñoaïn döõ lieäu ngaàm ñònh laø DS) Sau ñaây laø vaên baûn chöông trình thöïc hieän coâng vieäc treân. .Model Small .Stack 100 .Data Tbao1 Tbao2 So1 So2 SUM
DB 'Goõ vaøo 2 soá coù toång <10: S' DB 13, 10, 'Toång cuûa ' DB ? DB ' vaø ' DB ? DB ' laø ' DB -30H, '$'
.Code MAIN Proc MOV AX, @Data MOV DS, AX MOV AH, 9 LEA DX, Tbao1 INT 21H MOV AH, 1 INT 21H MOV Sol, AL
;khôûi taïo DS
;hieän Tbao1 ;ñoïc So1 ;caát maõ cuûa noù ñi
Trang 147
MOV DL, ',' MOV AH, 2 INT 21H MOV AH, 1 INT 21H MOV So2, AL LEA SI, So1 LEA DI, So2 LEA BX, SUM CALL ADD2SO LEA DX, Tbao2 INT 21H MOV AH, 4CH INT 21H MAIN Endp
;daáu phaåy ñan xen giöõa 2 soá
;ñoïc soá 2 ;caát maõ cuûa noù ñi ;SI chæ vaøo toaùn haïng 1 ;DI chæ vaøo toaùn haïng 2 ; BX chæ vaøo keát quaû ;coäng 2 soá ;hieän thò Tbao2 ;veà DOS
ADD2SO Proc ;tính toång 2 soá ;Vaøo: SI: ñòa chæ cuûa soá haïng 1 DI: ñòa chæ cuûa soá haïng 2 BX: ñòa chæ cuûa keát quaû ;Ra: {DS:BX} chöùa keát quaû MOV AL, {SI} ;laáy maõ cuûa soá1 ADD AL, {DI} ;coäng vôùi maõ cuûa soá2 ADD {BX}, AL ;ñoåi ra ASCII vaø caát ñi RET ;veà CTC ADD2SO Endp END MAIN Ví duï 4: truyeàn tham soá qua ngaên xeáp Trong ví duï naøy ta söû duïng ngaên xeáp ñeå laøm choã chöùa caùc tham soá caàn phaûi truyeàn. Ñeå deã so saùnh caùc caùch truyeàn tham soá vôùi nhau, ta vaãn giöõ nguyeân baøi toaùn ôû ví duï tröôùc nhöng thay ñoåi caùch giaûi ñeå höôùng ví duï vaøo minh hoïa vieäc söû duïng ngaên xeáp. Sau ñaây laø vaên baûn chöông trình thöïc hieän coâng vieäc treân .Model Small .Stack 100
Trang 148
.Data Tbao1 Tbao2 So1 So2 SUM
DB 'Goõ vaøo 2 soá coù toång <10: S' DB 13, 10, 'Toång cuûa ' DB ? DB ' vaø ' DB ? DB ' laø ' DB -30H, '$'
.Code MAIN Proc MOV AX, @Data MOV DS, AX MOV AH, 9 LEA DX, Tbao1 INT 21H MOV AH, 1 INT 21H MOV Sol, AL PUSH AX MOV DL, ',' MOV AH, 2 INT 21H MOV AH, 1 INT 21H MOV So2, AL PUSH AX CALL ADD2SO ADD SUM, AL MOV AH, 9 LEA DX, Tbao2 INT 21H MOV AH, 4CH INT 21H MAIN Endp
;khôûi taïo DS
;hieän Tbao1 ;ñoïc So1 ;caát vaøo bieán ñeå hieän thò ;vaø vaøo ngaên xeáp ñeå truyeàn ;daáu phaåy ñan xen giöõa 2 soá
;ñoïc So2 ;caát vaøo bieán ñeå hieän thò ;vaø vaøo ngaên xeáp ñeå truyeàn ;coäng 2 soá ;löu keát quaû ñeå hieän thò
;hieän thò Tbao2 ;veà DOS
ADD2SO Proc ; tính toång 2 soá
Trang 149
; Vaøo: ngaên xeáp luùc keå töø ñænh ; ñòa chæ trôû veà ; soá haïng 2 ; soá haïng 1 ; Ra: AX chöùa keát quaû PUSH BP ;caát BP ñeå duøng vaøo vieäc MOV BP, SP ;BP chæ vaøo ñænh ngaên xeáp MOV AX, (BP+6) ;laáy kyù töï cuûa Sol MOV AX, (BP+4) ;coäng vôùi kyù töï cuûa So2 POP BP ;laáy laïi BP RET 4 ;trôû veà vaø boû qua 4 byte ADD2SO Endp END MAIN Trong chöông trình naøy khi ñoïc ñöôïc cac toaùn haïng cuûa pheùp coäng, moät maët ta caát chuùng taïi oâ nhôù daønh cho bieán (chæ ñöôïc duøng ñeán khi hieän thò thoâng baùo Tbao2 nhö ñaõ laøm ôû caùc ví duï tröôùc), maët khaùc ta cuõng caát chuùng taïi ngaên xeáp ñeå truyeàn giöõa caùc khuùc chöông trình. Khi thöïc hieän pheùp coäng ta laáy laïi ñöôïc ñòa chæ trôû veà vò trí ban ñaàu nhö khi chöa duøng ñeán ngaên xeáp. Moät ñieàu nöõa cuõng phaûi nhaän thaáy trong chöông trình naøy laø: laø ngoaøi vòeâc duøng ngaên xeáp ñeå truyeàn tham soá (caùc toaùn haïng), ôû ñaây ta ñaõ söû duïng theâm caû thanh ghi AX cho vieäc truyeàn keát quaû.
Trang 150