Tài liệu Bài soạn vi xử lý - Chương 4: Lập trình bằng hợp ngữ với 8088: CHƯƠNG 4
LẬP TRÌNH BẰNG HỢP NGỮ VỚI 8088
Mở đầu
Trong chương trước ta đã giới thiệu khá tỉ mỉ tập lệnh của bộ vi xử lý 8086/88. Trong chương này ta sẽ giới thiệu cách lập trình dùng hợp ngữ trên các máy IBM PC hoặc tương thích với IBM PC (từ nay được gọi chung là IBM PC), vì đó là môi trường phổ thông và tiện lợi nhất để tạo ra và thử nghiệm các chương trình viết bằng hợp ngữ. Nói như vậy là vì a) về phần cứng, máy IBM PC có cấu trúc khá tiêu biểu của một hệ vi xử lý, b) về phần mềm, ta có thể tận dụng các chương trình soạn thảo văn bản hoặc rất nhiều chức năng sẵn có khác của máy IBM PC cho các chương trình của ta thông qua các dịch vụ (các chương trình con phục vụ ngắt) của các ngắt của DOS (Disk Operating System, hệ điều hành) và của BIOS (Basic Inpus Output System, hệ thống vào ra cơ sở). Tuy nhiên, một hệ thống vi xử lý cụ thể có thể có kết cấu khá...
                
              
                                            
                                
            
 
            
                 55 trang
55 trang | 
Chia sẻ: tranhong10 | Lượt xem: 1151 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang mẫu tài liệu Bài soạn vi xử lý - Chương 4: Lập trình bằng hợp ngữ với 8088, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
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 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.
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
	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.
	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 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.
	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öõ 
Kieåu kích thöôùc
Moâ taû
Tiny
(Heïp)
Maõ leänh vaø döõ lieäu goùi goïn trong moät ñoaïn
Small
(Nhoû)
Maõ leänh goùi goïn trong moät ñoaïn , döõ lieäu naèm trong moät ñoaïn.
Medium
(Trung bình)
Maõ leänh khoâng goùi goïn trong moät ñoaïn , döõ lieäu naèm trong moät ñoaïn.
Compact
(Goïn)
Maõ leänh khoâng goùi goïn trong moät ñoaïn , döõ lieäu khoâng goùi goïn trong moät ñoaïn.
Large
(lôùn)
Maõ leänh khoâng goùi goïn trong moät ñoaïn , döõ 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
(Ñoà soä)
Maõ leänh khoâng goùi goïn trong moät ñoaïn , döõ 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
	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!$'
	CR	DB	13
	LF	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
	.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 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
	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õ ñ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
¬ IP
Döõ lieäu naèm taïi ñaây
FFFEH
CONTINUE:
(chieàu tieán cuûa maõ & döõ lieäu)
¯
(chieàu tieán cuûa ngaên xeáp)
¬ 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ù 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õ.
chöông trình
PSP
100h
SS
CS
DS
ES
chöông trình
PSP
Stack
100h
.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:
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.
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.
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.
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.
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?
Duøng EXE2BIN ñeå dòch *.exe thaønh 
*.com
Cho chaïy chöông trình
s
ñ
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:
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
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
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 
ñ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öõ.
	·	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	; 	toång taïi AX luùc ñaàu laø 0.
	ADD	AX, BX	;	coäng theâm b.
	ADD AX, CX	;	coäng theâm c.
	SHL AX, l	;	nhaân ñoâi keát quaû trong AX.
	RA:	;	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ù trong chöông trình hôïp ngöõ.
Ñieàu kieän
Coâng vieäc
Sai
Ñuùng
Hình 4.2 Caáu truùc IF-THEN
Ñieàu kieän
Sai
Ñuùng
Coâng vieäc 1
Coâng vieäc 1
Hình 4.3 Caáu truùc IF-THEN-ELSE
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
	Giaùtrò1: Coângvieäc1
Giaùtrò2: Coângvieäc2
	. . .
	GiaùtròN: CoângvieäcN
	END CASE	
Bieåuthöùc
Coângvieäc1
CoângvieäcN
Coângvieäc2
Giaùtrò1
Giaùtrò2
GiaùtròN
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.
	· 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
sai
Boä ñeám=0
ñuùng
Hình 4.5. Caáu truùc laëp FOR - DO.
	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.
Ñieàu kieän
Coâng vieäc
sai
ñuùng 
sai
ñuùng 
Ñieàu kieän
Coâng vieäc
Hình 4.6. Caáu truùc WHILE - DO 
Hình 4.7. Caáu truùc REPEAT - UNTIL 
	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.
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ï
	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	DB	13, 10, '$'	
	Chao tay	DB 	'hello!$'
	ChaoTa	DB 	'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 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
	; 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
	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 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?
	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.
+ 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
	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
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.
	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	; 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
	.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.
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ö 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
 	INT 21H
 	MOV AH, 4CH	; veà DOS
 	INT 21H
 	MAIN End
 	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
 	LEA DX, Tbao1
 	INT 21H	; hieän Tbao1
 	XOR CX, CX	; CX: ñeám soá kyù töï ñoïc ñöôïc
 	MOV AH, 1
	 DOCTIEP: INT 21H 	; ñoïc 1 kyù töï
 	LAP : 	CMP AL, 13	; CR ?
 	JE THOIDOC	; ñuùng, hieån thò Tbao2
 	PUSH AX	; khoâng, caát noù vaøo ngaên xeáp
 	INC CX	; caäp nhaät boä ñeám soá kyù töï 
 	IMP DOCTIEP
 	 THOIDOC:LEA DX, Tbao2
 	MOV AH, 9
	INT 21H	; caùch 1 doøng vaø hieän Tbao2
 	MOV AH, 2	; chuaån bò hieån thò kyù töï
 	HIEN:	POP DX	; laáy kyù töï ra töø ngaên xeáp
 	INT 21H
 	LOOP HIEN	; hieän doøng kyù töï xeáp ngöôïc
 	MOV AH, 4CH	; veà DOS
 	INT 21H
 	MAIN Endp
 	END MAIN
 	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
 	.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
 	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 	; 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.
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.200ms). 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	; caám caùc ngaét
 	PUSH	CX	; caát CX
 	MOV CX, 292 	; xem caùch tính '292' ôû döôùi
 	LAP:;	NOP	; coù NOP ñeå taêng thôøi gian
 	LOOP LAP	
 	POP CX	; laáy laïi CX
 	; STI 	; cho pheùp ngaét trôû laïi
 	RET
 	TRE1ms Endp
 	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á.
 	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:
 	+ 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
 	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
	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).
 	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
 	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	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 DS
 	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õ cuûa noù ñi
 	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 noù ñi
 	LEA SI, So1	;SI chæ vaøo toaùn haïng 1
	LEA DI, So2	;DI chæ vaøo toaùn haïng 2
 	LEA BX, SUM	; BX chæ vaøo keát quaû
 	CALL ADD2SO	;coäng 2 soá
 	LEA DX, Tbao2
	INT 21H	;hieän thò Tbao2
 	MOV AH, 4CH	;veà DOS
 	INT 21H
 	 MAIN Endp
 	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
 	.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 DS
 	MOV AH, 9
 	LEA DX, Tbao1
 	INT 21H	;hieän Tbao1
 	MOV AH, 1	;ñoïc So1
 	INT 21H
 	MOV Sol, AL	;caát vaøo bieán ñeå hieän thò
 	PUSH AX	;vaø vaøo ngaên xeáp ñeå truyeàn
 	MOV DL, ','	;daáu phaåy ñan xen giöõa 2 soá
 	MOV AH, 2
 	INT 21H
	MOV AH, 1	;ñoïc So2
 	INT 21H
 	MOV So2, AL	;caát vaøo bieán ñeå hieän thò
 	PUSH AX	;vaø vaøo ngaên xeáp ñeå truyeàn
 	CALL ADD2SO	;coäng 2 soá
 	ADD SUM, AL	;löu keát quaû ñeå hieän thò
 	MOV AH, 9
	LEA DX, Tbao2
	INT 21H	;hieän thò Tbao2
 	MOV AH, 4CH	;veà DOS
 	INT 21H
 	 MAIN Endp
 	ADD2SO Proc
 	 	; tính toång 2 soá
 	; 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û.
            Các file đính kèm theo tài liệu này:
 chuong 4.doc chuong 4.doc