background image

 

TRÖÔØNG ÑAÏI HOÏC ÑAØ LAÏT 

F

 7 G 

 
 
 

 

 
 
 

GIAÙO TRÌNH 

HÔÏP NGÖÕ 

 

 
 

NGUYEÃN HÖÕU LOÄC

 

 
 
 

2002 

background image

Hôïp Ngöõ 

 

 

- 2 - 

 

MUÏC LUÏC 

 

LÔØI MÔÛ ÑAÀU ..................................................................................................................... 4 
CHÖÔNG 1: GIÔÙI THIEÄU CHUNG ................................................................................... 5 

I. CAÙC THANH GHI TRONG VI XÖÛ LYÙ HOÏ INTEL:................................................... 5 

1. Caùc thanh ghi thoâng duïng: ....................................................................................... 6 
2. Caùc thanh ghi phaân ñoaïn ......................................................................................... 7 
3. Caùc thanh ghi chæ muïc vaø con troû:............................................................................ 7 
4. Thanh ghi traïng thaùi (FLAG)................................................................................... 8 

II. ÑÒA CHÆ OÂ NHÔÙ: ....................................................................................................... 8 
III. MOÄT SOÁ LEÄNH CÔ BAÛN: ........................................................................................ 9 

 

CHÖÔNG 2: GOÏI NGAÉT VAØ TRÌNH DEBUG..................................................................11 

I. CAÙC LEÄNH GOÏI  NGAÉT: ...........................................................................................11 
II. TRÌNH DEBUG:........................................................................................................12 
III. VAØI CHÖÔNG TRÌNH ÖÙNG DUÏNG :.....................................................................15 

 

CHÖÔNG 3: HÔÏP NGÖÕ DUØNG TRONG PC.....................................................................19 

I. DOØNG LEÄNH:.............................................................................................................19 
II. DÖÕ LIEÄU:...................................................................................................................20 

1. Haèng: ......................................................................................................................20 
2. Bieán: .......................................................................................................................21 

III. CAÁU TRUÙC CHÖÔNG TRÌNH:...............................................................................22 

 

CHÖÔNG 4: PHÖÔNG PHAÙP LAÄP TRÌNH......................................................................27 

I. TOÅNG QUAN: ............................................................................................................27 
II. CAÙC LEÄNH LIEÂN QUAN ÑEÁN REÕ NHAÙNH:...........................................................27 

1. Caùc leänh  reõ nhaùnh coù ñieàu kieän: ............................................................................28 
2. Caùc leänh  reõ nhaùnh khoâng ñieàu kieän:......................................................................29 

III. CAÙC CAÁU TRUÙC ÑIEÀU KHIEÅN:.............................................................................29 

 

CHÖÔNG 5: NGAÊN XEÁP VAØ THUÛ TUÏC ..........................................................................38 

I. NGAÊN XEÁP:................................................................................................................38 
II. THUÛ TUÏC: .................................................................................................................38 
III. SÖÛ DUÏNG PTR VAØ LABEL: ...................................................................................40 
IV. VAØI CHÖÔNG TRÌNH ÖÙNG DUÏNG:......................................................................41 

1. Hieän soá thaäp phaân:..................................................................................................41 
2. Hieän soá nhò phaân vaø thaäp luïc phaân..........................................................................44 
3. Ñoïc töø baøn phím......................................................................................................46 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 3 - 

 
CHÖÔNG 6:   MOÑUN CHÖÔNG TRÌNH & CAÙC KIEÅU ÑÒNH VÒ ÑÒA CHÆ.............51 

I. MOÑUN CHÖÔNG TRÌNH .......................................................................................51 

1. Ñònh höôùng bieân dòch extrn.....................................................................................51 
2. Ñònh höôùng bieân dòch public ...................................................................................52 
3.  Laäp thö vieän - taïo vó leänh (macro) .........................................................................54 

II. CAÙC KIEÅU ÑÒNH VÒ ÑÒA CHÆ..................................................................................56 
III. CHÖÔNG TRÌNH ÖÙNG DUÏNG...............................................................................60 
IV. TAÏO TAÄP TIN .COM ...............................................................................................67 

1- Daïng cuûa moät chöông trình COM...........................................................................68 
2- Öùng duïng taäp tin .com ............................................................................................69 

 

CHÖÔNG 7: SÖÛ DUÏNG  PHAÂN ÑOAÏN TOAØN PHAÀN.....................................................76 

I- SÖÛ DUÏNG CAÙC ÑÒNH HÖÔÙNG BIEÂN DÒCH............................................................76 

1. Segment..................................................................................................................76 
2. Ñònh höôùng bieân dòch assume.................................................................................79 

II - DAÏNG CUÛA CHÖÔNG TRÌNH .EXE SÖÛ DUÏNG TRONG CAÙC PHÖÔNG PHAÙP 
CUÕ: .................................................................................................................................79 
III-  VÍ DUÏ CHÖÔNG TRÌNH COM..............................................................................83 

 

CHÖÔNG 8:  CHÖÔNG TRÌNH ÖÙNG DUÏNG ..................................................................85 

I. IN NOÄI DUNG VAÊN BAÛN RA MAÙY IN: ...................................................................85 

1. Söû duïng haøm 40h ngaét 21h (DOS) ñeå thöïc hieän......................................................85 
2. Söû duïng haøm 01h ngaét 17h (ROMBIOS) ................................................................85 

II. ÑEÁM SOÁ TÖØ TRONG MOÄT TAÄP TIN ......................................................................86 
III-   ÑOÅI NGÖÔÏC CHUOÃI.............................................................................................89 
IV. CHÖÔNG TRÌNH HIEÅN THÒ THÔØI GIAN .............................................................90 
V. CHÖÔNG TRÌNH THÖÔØNG TRUÙ BOÄ NHÔÙ............................................................97 

 

Phuï luïc A: MOÄT SOÁ CHÖÔNG TRÌNH PHUÏC VUÏ CUÛA DOS.......................................105 
Phuï luïc B: MOÄT SOÁ CHÖÔNG TRÌNH PHUÏC VUÏ CUÛA ROM-BIOS............................108 
TAØI LIEÄU THAM KHAÛO.................................................................................................110 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 4 - 

 
 

LÔØI MÔÛ ÑAÀU 

 

Hôïp ngöõ laø moät moân hoïc daønh cho sinh vieân caùc chuyeân ngaønh kyõ thuaät. 

Laø moät ngoân ngöõ can thieäp saâu vaøo heä thoáng maùy tính, hôïp ngöõ thöôøng ñöôïc söû 
duïng trong nhöõng phaàn vieäc töông ñoái tinh teá nhö  ñieàu khieån heä thoáng, vi ñieàu 
khieån ... 

 
Tuy vaäy vôùi nhöõng ngöôøi laàn ñaàu tieân laøm quen vôùi ngoân ngöõ naøy, vieäc 

tieáp thu quaû thaät raát khoù khaên bôûi leõ ngoân ngöõ naøy gaàn vôùi ngoân ngöõ maùy vaø söû 
duïng caùc kyù töï gôïi nhôù neân khoù hieåu hôn söû duïng caùc ngoân ngöõ caáp cao nhö 
Pascal, C..v.v...Ngoaøi ra, ngöôøi hoïc khoâng nhöõng phaûi bieát phaàn meàm maø coøn 
phaûi hieåu phaàn cöùng ôû möùc ñoä naøo ñoù nöõa. Ñieàu naøy taïo ra moät aùp löïc raát lôùn gaây 
khoù khaên cho ngöôøi hoïc. 

 
Trong nhieàu naêm giaûng daïy moân naøy, toâi nhaän thaáy hieän coù raát nhieàu 

saùch, taøi lieäu tham khaûo vieát veà hôïp ngöõ song ñeå coù moät taøi lieäu ñaùp öùng yeâu caàu 
cuûa sinh vieân trong vieäc tieáp thu moân hôïp ngöõ tuaàn töï töø deã ñeán khoù coù phöông 
phaùp thì thaät hieám. 

 
Do vaäy toâi thöïc hieän giaùo trình naøy vôùi mong öôùc coù moät taøi lieäu ñaùp öùng 

yeâu caàu treân. Trong giaùo trình, toâi coù ñöa vaøo raát nhieàu ví duï vaø öùng duïng töø thaáp 
ñeán cao ñeå sinh vieân coù theå tieáp thu deã daøng moân hoïc naøy. 

 
Tuy vaäy taøi lieäu naøy khoâng sao traùnh khoûi nhöõng sai soùt, raát mong caùc 

ñoàng nghieäp, sinh vieân vaø baïn ñoïc goùp yù 

 
Hoaøn thaønh giaùo trình naøy, toâi xin chaân thaønh caùm ôn ñeán caùc ñoàng 

nghieäp trong Khoa Vaät lyù Tröôøng Ñaïi hoïc Dalat ñaõ ñoäng vieân, goùp yù vaø taïo ñieàu 
kieän cho toâi trong quaù trình thöïc hieän. Toâi cuõng xin ghi nhaän söï ñoùng goùp cuûa 
nhieàu theá heä sinh vieân khoa vaät lyù, khoa toaùn - tin ñeå giaùo trình naøy ñöôïc saép xeáp 
ngaøy caøng deã hieåu vaø hôïp lyù hôn. 

 

Nguyeãn Höõu Loäc

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 5 - 

 

 

CHÖÔNG 1: GIÔÙI THIEÄU CHUNG 

 
 

Taïi sao chuùng ta phaûi hoïc laäp trình vôùi hôïp ngöõ trong khi hieän nay 

coù raát nhieàu ngoân ngöõ caáp cao nhö C hoaëc Pascal duøng ñeå laäp trình deã daøng 
hôn? Coù theå noùi coù nhieàu caâu traû lôøi cho caâu hoûi naøy.  Nhöng ban ñaàu, chuùng 
ta coù theå xeùt ñoái vôùi hôïp ngöõ thì moãi leänh töông öùng vôùi moät leänh ngoân ngöõ 
maùy. Noùi caùch khaùc,  neáu moãi doøng leänh trong chöông trình laø moät leänh hôïp 
ngöõ vaø moät töø maùy töông öùng vôùi moät leänh maùy nhö vaäy n doøng trong chöông 
trình seõ taïo ra moät chöông trình maùy goàm n töø. Nhö vaäy hôïp ngöõ coù theå xem 
laø ngoân ngöõ raát gaàn vôùi ngoân ngöõ maùy, chuùng ta coù theå tieáp caän ñeán taát caû caùc 
ngoùc ngaùch cuûa maùy vaø quan troïng hôn laø chuùng ta thöïc hieän chöông trình 
vieát baèng hôïp ngöõ nhanh hôn so vôùi vieát baèng nhöõng ngoân ngöõ caáp cao khaùc. 
Tuy vaäy cuõng caàn thaáy raèng raát nhieàu ngoân ngöõ caáp cao hoå trôï giao dieän vôùi 
hôïp ngöõ, noùi caùch khaùc laø chuùng ta coù theå vieát 1 ñoaïn hôïp ngöõ trong chöông 
trình vieát baèng ngoân ngöõ caáp cao nhö C hoaëc Pascal... Ñieàu naøy cho pheùp 
chuùng ta laäp trình hieäu quaû hôn vôùi nhöõng phaàn vieäc saùt vôùi heä thoáng vaø ñoøi 
hoûi thôøi gian nhanh. 

 
Trong kieán truùc maùy tính nhieàu caáp, vieäc chuyeån moät chöông trình 

cuûa ngöôøi söû duïng töø moät ngoân ngöõ naøy sang chöông trình duøng ngoân ngöõ 
khaùc goïi laø chöông trình dòch. Ngoân ngöõ söû duïng ñeå vieát chöông trình ban ñaàu 
goïi laø ngoân ngöõ nguoàn coøn ngoân ngöõ sau khi dòch goïi laø ngoân ngöõ ñích

 
Ngöôøi ta phaân bieät caùc chöông trình dòch ra laøm hai loaïi tuøy theo 

moái quan heä giöõa ngoân ngöõ nguoàn vaø ngoân ngöõ ñích. Khi ngoân ngöõ nguoàn 
goàm nhöõng kyù töï gôïi nhôù leänh cuûa ngoân ngöõ maùy thì chöông trình dòch seõ goïi 
laø hôïp dòch (assembler) vaø ngoân ngöõ nguoàn laø hôïp ngöõ (assembly language). 
Trong khi ñoù ngoân ngöõ nguoàn laø ngoân ngöõ caáp cao nhö C hoaëc Pascal thì 
chöông trình dòch seõ goïi laø bieân dòch

 

I. CAÙC THANH GHI TRONG VI XÖÛ LYÙ HOÏ INTEL: 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 6 - 

 

Boä vi xöû lyù 8088 coù theå ñòa chæ hoùa ñeán 2

20

 byte baét ñaàu töø ñòa chæ 0. Nhöõng 

leänh cuûa 8088 coù theå thöïc hieän vôùi nhöõng töø 8 bit hay byte cuõng nhö vôùi nhöõng töø 16 bits. 
8088 söû duïng nhöõng ñòa chæ  20 bits ñeå truy caäp ñeán 2

20

 byte oâ nhôù. Vì caùc thanh ghi coù 

chieàu daøi laø 16 bits neân caùc ñòa chæ duøng 20 bits seõ coù khoù khaên trong thöïc hieän. Ñeå giaûi 
quyeát vaán ñeà naøy, nhöõng nhaø saûn xuaát boä vi xöû lyù ñaõ söû duïng 4 thanh ghi phaân ñoaïn (moät 
duøng cho leänh,  moät cho döõ lieäu, moät cho ngaên xeáp vaø moät döï tröõ)  

 
Nhöõng thanh ghi coù theå xem laø  nhöõng oâ nhôù naèm beân trong boä vi xöû lyù coù thôøi 

gian truy xuaát cao, vôùi 8088, chuùng ta coù 14 thanh ghi chia ra laøm 4 loaïi: 

 
- Caùc thanh ghi laøm vieäc; 
- Caùc thanh phaân ñoaïn; 
- Caùc thanh ghi böôùc nhaûy (offset); 
- Thanh ghi traïng thaùi (Côø: FLAG) 

1. Caùc thanh ghi thoâng duïng: 

 

Bao goàm 4 thanh ghi. Moãi thanh ghi ñeàu coù nhöõng chöùc naêng rieâng maëc duø 

chuùng cuõng laø nhöõng nôi löu tröõ nhöõng keát quaû trung gian: 

 

AX laø thanh ghi 16 bit goïi laø thanh ghi tích luõy (Accumulator) söû duïng khi 

thöïc hieän caùc pheùp tính soá hoïc. 

 
BX laø thanh ghi  16 bit goïi laø thanh ghi neàn (Base register) 
 
CX laø thanh ghi 16 bit goïi laø thanh ghi ñeám (Counter) 
 
DX laø thanh ghi 16 bit goïi laø thanh ghi döõ lieäu (Data) 
 

Neân bieát raèng moãi thanh ghi naøy ñeàu coù theå phaân ra laøm hai thanh ghi 8 bit söû 

duïng rieâng reõ ñöôïc: 

 

AX  =  AH  vaø  AL; 
BX  =  BH  vaø  BL; 
CX  =  CH  vaø  CL; 
DX  =  DH  vaø  DL. 

 
Cuõng neân nhôù raèng nhöõng pheùp toaùn thöïc hieän vôùi caùc thanh ghi luoân nhanh 

khi chuùng thöïc hieän vôùi caùc oâ nhôù trong boä nhôù. 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 7 - 

 

2. Caùc thanh ghi phaân ñoaïn 

 

Goàm 4 thanh ghi: 
 

CS vieát taét töø "Code Segment", laø nôi löu tröõ ñòa chæ cuûa phaân ñoaïn boä nhôù 

taïi ñoù caùc leänh trong chöông trình naïp vaøo (maõ maùy). 

 
DS vieát taét töø "Data Segment", laø nôi löu tröõ ñòa chæ cuûa phaân ñoaïn boä nhôù 

taïi ñoù ñaët döõ lieäu (data) cuûa chöông trình. 

 
SS vieát taét töø "Stack Segment", laø nôi löu tröõ ñòa chæ cuûa phaân ñoaïn ngaên 

xeáp. 

 
ES vieát taét töø "Extra Segment", laø nôi löu tröõ ñòa chæ cuûa phaân ñoaïn döï tröõ 

thöôøng duøng ghi giöõ döõ lieäu. 

 

3. Caùc thanh ghi chæ muïc vaø con troû: 

 

Caùc thanh ghi naøy giöõ giaù trò böôùc nhaûy (offset ) keát hôïp vôùi ñòa chæ phaân ñoaïn. 

Toång coäng coù 5 thanh ghi: 

 
SI vieát taét töø "Source Index". Thanh ghi naøy laø thanh ghi  16 bit söû duïng khi 

thöïc hieän caùc pheùp toaùn vôùi chuoãi (daõy kyù töï); thöôøng ñöôïc duøng keát hôïp vôùi thanh ghi 
phaân ñoaïn DS. 

DI vieát taét töø "Destination Index". Thanh ghi naøy cuõng laø thanh ghi  

16 bit söû duïng khi thöïc hieän caùc pheùp toaùn vôùi chuoãi (daõy kyù töï); thöôøng ñöôïc 
duøng keát hôïp vôùi thanh ghi phaân ñoaïn DS. Tuy nhieân trong tröôøng hôïp 
chuyeån chuoãi thì noù seõ keát hôïp vôùi thanh ghi phaân ñoaïn  ES. 

 
BP hoaëc "Base Pointer". Thanh ghi 16 bit naøy keát hôïp vôùi thanh ghi phaân ñoaïn 

SS (SS:BP) ñeå ñöa döõ lieäu vaøo trong ngaên xeáp khi goïi chöông trình con (CALL) 

 
SP hoaëc "Stack Pointer". Thanh ghi 16 bit naøy cuõng keát hôïp vôùi thanh ghi phaân 

ñoaïn SS (SS:SP) ñeå chæ ra phaàn töû cuoái cuûa ngaên xeáp. 

 
IP goïi laø con troû leänh (Instruction Pointer). Thanh ghi 16 bit naøy keát hôïp vôùi 

thanh ghi phaân ñoaïn CS (CS:IP) ñeå chæ ñeán leänh tieáp theo seõ thöïc hieän. Noäi dung cuûa 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 8 - 

 
thanh ghi naøy khoâng theå thay ñoåi tröïc tieáp; noù chæ bò thay ñoåi moät caùch giaùn tieáp thoâng qua 
caùc leänh nhaûy böôùc, qua caùc chöông trình con vaø qua caùc ngaét.  
 

4. Thanh ghi traïng thaùi (FLAG) 

 

Thanh ghi trang thaùi laø thanh ghi  goàm 16 bit (Côø). Giaù trò cuûa töøng bit moät 

trong thanh ghi naøy ñoäc laäp vôùi caùc bit khaùc trong cuøng thanh ghi. Ngöôøi ta thöôøng xöû lyù 
töøng bit moät vaø moät soá bit coù aûnh höôûng ñeán hoaït ñoäng cuûa chöông trình. Nhöõng bit naøy 
goïi laø caùc chæ baùo (indicator) coù theå chia ra laøm 2 loaïi: 

 
Caùc chæ baùo traïng thaùi: 
 
 

bit  

yù nghóa 

  vieát taét 

 0 

Nhôù 

(Carry) 

 

CF 

 

Chaün leû (Parity) 

PF 

 

Nhôù phuï (Auxiliairy carry) 

AF 

 6 

Khoâng 

(Zero) 

ZF 

 7 

Daáu 

(Sign) 

SF 

 11 

Traøn 

(Overflow) 

OF 

Caùc chæ baùo ñieàu khieån 
 
 

bit  

yù nghóa 

  vieát taét 

 8 

Baåy 

(Trap) 

 

TF 

 9 

Ngaét 

(Interrupt) 

IF 

 

10  

Höôùng (Direction) 

DF 

 
Caùc bit 1, 5, 12, 13, 14, 15 cuûa thanh ghi traïng thaùi  16 bit khoâng ñöôïc söû duïng. 

II. ÑÒA CHÆ OÂ NHÔÙ: 

 
Boä nhôù cuûa 1 maùy tính bao goàm 1 daõy tuaàn töï caùc oâ nhôù ñöôïc ñaùnh soá trong ñoù 

löu giöõõ 1 giaù trò soá naøo ñoù. Soá töông öùng cuûa 1 oâ nhôù goïi laø ñòa chæ, moãi oâ nhôù giöõ 8 bit. 
Treân nhöõng maùy tính IBM PC, boä nhôù ñöôïc chia thaønh caùc vuøng 65536 byte goïi laø phaân 
ñoaïn, ñòa chæ cuûa 1 oâ nhôù seõ bao goàm 2 phaàn: soá phaân ñoaïn vaø böôùc nhaûy (offset) tính töø vò 
trí ban ñaàu cuûa phaân ñoaïn; noù seõ coù daïng:  

 
 

 

Phaân ñoaïn: böôùc nhaûy 

 

 (Segment:Offset) 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 9 - 

 

Caùc leänh chieám moät hoaëc nhieàu oâ nhôù keá tieáp trong boä nhôù, ñieàu naøy phuï 

thuoäc vaøo ñoä phöùc taïp cuûa leänh. 

III. MOÄT SOÁ LEÄNH CÔ BAÛN: 

MOV: laø moät trong nhöõng leänh chính cuûa hôïp ngöõ. Noäi dung cuûa toaùn haïng beân 

phaûi seõ chuyeån sang toaùn haïng beân traùi  

Ví duï: 
 MOV 

AX, 

10 

 MOV 

AX, 

BX 

 MOV 

AX, 

[BX] 

LEA:(Load Effective Address) töông töï nhö MOV  ....,OFFSET.... 

Ví duï:LEA DX,MSG thay vì MOV DX, OFSET MSG 

ADDcoäng 2 soá 8 bit hoaëc 16 bit, keát quaû ñöa vaøo boä nhôù hoaëc thanh ghi. 

Ví duï: 
 ADD 

AX, 

BX 

 ADD 

AH, 

AL 

INC: theâm moät ñôn vò vaøo thanh ghi cho tröôùc, keát quaû nhaän ñöôïc seõ töông töï nhö 
COÄNG vôùi 1.
 

Ví duï: 
  

INC  

AX 

 INC 

BL 

ADC: thöïc hieän leänh coäng nhö ADD sau ñoù theâm giaù trò coù trong chæ baùo CARRY 
vaøo keát quaû nhaän ñöôïc  

Ví duï: 
 ADC 

DL,30 

SUB: thöïc hieän tröø 1 löôïng töø 1 soá, keát quaû ñöôïc ñaët vaøo boä nhôù hoaëc thanh ghi. 

Ví duï: 
 SUB 

AL, 

BL 

MUL: nhaân toaùn haïng cho tröôùc vôùi moät löôïng ñaët trong thanh AX hoaëc AL 
(accumulator). Keát quaû seõ ñaët vaøo AH vaø AL neáu caùc toaùn haïng laø byte vaø ñaët trong 
DX vaø AX neáu toaùn haïng laø töø (word). 

Ví duï: 
 MUL 

BH 

 MUL 

BX 

DIV: chia 1 töø (soá bò chia trong AX) bôûi 1 toaùn haïng 8 bit (soá chia) hoaëc chia 1 töø 
ñoâi - double word (trong DX, AX) bôûi moät toaùn haïng 16 bit. Thöông soá seõ ñaët trong 
AL vaø soá dö ñaët trong AH neáu toaùn haïng laø moät byte vaø thöông soá seõ ñaët trong AX vaø 
soá dö ñaët trong DX neáu söû duïng 1 töø-word. 

Ví duï: 

DIV  

BX 

  

DIV 

BH 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 10 - 

 

CMP: cho pheùp so saùnh noäi dung hai thanh ghi hoaëc oâ nhôù. So saùnh laø thöïc hieän 1 
pheùp tröø tuy nhieân muïc ñích ñaït ñöôïc khoâng phaûi laø keát quaû cuûa pheùp trö ø maø chuû 
yeáu laø so saùnh hai toaùn haïng do vaäy sau leänh so saùnh thöôøng thaáy leänh nhaûy böôùc coù 
ñieàu kieän phuï thuoäc vaøo caùc chæ baùo trong quaù trình so saùnh. 

Ví duï:  

CMP 

DL, 3A 

JNZ: nhaûy böôùc ñeán moät nhaõn (label) cho tröôùc neáu chæ baùo  zero laøø 0. 

Ví duï: 
  

JNZ 

Tiep 

JLE: nhaûy böôùc ñeán moät nhaõn (label) cho tröôùc neáu keát quaû laø nhoûù hôn hoaëc baèng 0. 

Ví duï: 
  

JLE 

Lap 

 

 LOOP: laëp laïi luùc naøy thanh ghi CX giaûm 1 ñôn vò vaø thöïc hieän moät söï reõ nhaùnh 
ñeán moät nhaõn cho tröôùc cho ñeán khi CX baèng 0. 

Ví duï: 
      

LOOP 

Lap 

 RCL:  dòch chuyeån taát caû caùc bit veà phía traùi moät vò trí hoaëc nhieàu vò trí. Nhöõng bit 
ra khoûi beân TRAÙI seõ vaøo chæ baùo CARRY tröôùc khi ñöa laïi vaøo beân phaûi cuûa toaùn 
haïng. 

Ví duï: 
      

RCL 

AH,1 

SHR:  dòch chuyeån taát caû caùc bit veà phía phaûi moät vò trí hoaëc nhieàu vò trí.  

Ví duï: 
      

SHR 

AH,1 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 11 - 

 

 

CHÖÔNG 2: GOÏI NGAÉT VAØ TRÌNH DEBUG 

 

I. CAÙC LEÄNH GOÏI  NGAÉT: 

 

Moät maùy tính thöôøng coù raát nhieàu loaïi thieát bò ngoaïi vi quan troïng nhö baøn 

phím, maøn hình, ñóa, maùy in, v.v... Muoán ñieàu khieån caùc thieát bò naøy ñoøi hoûi chuùng ta phaûi 
vieát chöông trình baèng caùc leänh maùy daøi doøng vaø phöùc taïp. Nhôø söï giuùp ñôõ cuûa heä ñieàu 
haønh MSDOS hoaëc ROM-BIOS chuùng ta coù theå taùc ñoäng moät thieát bò  ngoaïi vi baèng caùch 
chæ  söû duïng 1 haøm ñöôïc ñaùnh soá vaøo chöông trình keøm theo moät soá caùc thoâng soá. Taát caû 
ñieàu naøy ñeàu thöïc hieän thoâng qua caùc thanh ghi. Nhöõng haøm naøy goïi laø ngaét. 

 

Leänh INT laø leänh goïi ngaét ñöôïc ñaùnh soá taïi vò trí toaùn haïng ñöôïc xem nhö goïi 

moät chöông trình con. Moät ngaét coù theå bao goàm nhieàu dòch vuï, soá cuûa dòch vuï ñöôïc ñöa 
vaøo thanh ghi AH tröôùc khi goïi  ngaét. 

 
Ví duï 1: Hieän 1 kyù töï ASCII leân maøn hình 
 
 MOV 

DL,41h 

 MOV 

AH,02h 

 INT 

21h 

 
Ví duï 2: Ñoïc kyù töï tieáp töø baøn phím 
 
 MOV 

AH,0 

 INT 

16h 

 
Ví duï 3: Hieän 1 thoâng baùo leân maøn hình 
 
Chao 

DB 

'Chao cac ban $' 

 
 MOV 

AH,09h 

 

MOV 

DX, OFFSET Chao 

 INT 

21h 

Ví duï 4: Keát thuùc chöông trình 
 
  

INT 

20h 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 12 - 

 

Chuùng ta coù theå tham khaûo caùc haøm naøy trong taøi lieäu "Caåm nang cho ngöôøi 

laäp trình maùy vi tính IBM PC" - taùc giaû Peter Norton 

II. TRÌNH DEBUG: 

 

Moät trong hai caùch ñeå vieát chöông trình baèng hôïp ngöõ laø söû duïng phaàn meàm 

DEBUG. Chuùng ta caàn phaûi coù moät taäp tin teân DEBUG.EXE söû duïng trong heä ñieàu haønh 
MSDOS  

 

Coù theå xem DEBUG laø moät coâng cuï giuùp chuùng ta laäp trình baèng hôïp ngöõ ban 

ñaàu vì  nhöõng lyù do sau: 

 

DEBUG söû duïng deã hôn MASM. 

Chuùng ta coù theå thöû nghieäm caùc chöông trình nhoû deã daøng tröôùc khi ñöa 
chuùng vaøo trong nhöõng chöông trình lôùn, phöùc taïp hôn.  

 

DEBUG coù 19 leänh. Caùc leänh naøy duøng maãu töï ñaàu cuûa töø tieáng 

Anh ñeå gôïi nhôù yù nghóa cuûa leänh. 

 

LEÄNH 

TÖØ TIEÁNG ANH 

CHÖÙC NAÊNG 

1 2 

Assemble 

Hôïp  dòch 1 chöông trình 

Compare 

So saùnh 2 vuøng cuûa boä nhôù 

Dump 

Trình baøy moät vuøng cuûa boä nhôù baèng hex vaø 
ASCII 

Enter 

Nhaäp maõ maùy vaøo boä nhôù 

Fill 

Laép ñaày moät vuøng nhôù 

Go 

Thöïc hieän moät chöông trình 

Hexadecimal 

Coäng vaø tröø 2 soá hex 

Input 

Nhaäp vaø trình baøy töø coång 

Load 

Nhaäp moät taäp tin töø ñóa vaøo boä nhôù 

1 2 

Move 

Chuyeån moät khoái nhôù 

Name 

Ñaët teân moät taäp tin 

O Out 

Ñöa 

ra 

coång 

Proceed 

Thöïc hieän thuû tuïc hay moät ngaét 

Q Quit 

Thoaùt 

khoûi 

Debug 

Register 

Trình baøy giaù trò thanh ghi 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 13 - 

 

Search 

Tìm moät chuoãi byte trong boä nhôù 

Trace 

Cho chöông trình chaïy töøng leänh moät 

U Unassemble 

Dòch 

ngöôïc 

Write 

Ghi leân ñóa 

 
Ñeå khôûi ñoäng trình DEBUG, ngöôøi ta ñaùnh leänh sau:  
 
DEBUG   
 
- Moät gaïch ngang (hyphen) xuaát hieän thoâng baùo cho chuùng ta bieát  DEBUG 

ñang ñôïi leän tieáp. 

 
Nhöõng leänh  DEBUG thöôøng söû duïng
 
Q  (Quit): Döøng thöïc hieän DEBUG, veà laïi heä ñieàu haønh 
 
D (Dump Memory): Hieän noäi dung moät vuøng nhôù. 
 
 

Ví duï:  D 100 

 

xxxx:0100     E9  2D  0D  BA  DA  E7  F5  53 - 00  75  1B  0A  7D  3E  89  90 
xxxx:0110     00   67  8A   C9   65   3E  7F 1D -5A  6B 7E   90   8B  5A  8F  39 
xxxx:0120     E9  2D  0D  BA  DA  E7  F5  53 - 00  75  1B  0A  7D  3E  89  90 
xxxx:0130     00   67  8A   C9   65   3E  7F 1D -5A  6B 7E   90   8B  5A  8F  39 
 

U (UnAssemble): Cho hieän  maõ maùy chöông trình. 
 
 

Ví duï:  U 100 

xxxx:0100 E92D0D 

JMP 

0E30 

xxxx:0103 BADA0A 

MOV 

DX,0ADA 

xxxx:0106 3D0500 

CMP 

AX,0005 

xxxx:0109 741B 

JZ 

0126 

 

R (Registers): Hieän hoaëc thay ñoåi noäi dung caùc thanh ghi cuûa boä vi xöû lyù. Leänh 

naøy cho hieän: 

 

Noäi dung cuûa caùc thanh ghi trong heä cô soá 16 (hexadeùcimal). 

Noäi dung cuûa thanh ghi traïng thaùi 

 

Chæ baùo 

=0 

=1 

OF NV 

OV 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 14 - 

 

DF UP 

DN 

IF EI 

DI 

SF PL 

NG 

ZF NZ 

ZR 

AF NA 

AC 

PF PO 

PE 

CF NC 

CY 

 
 

Ví duï: 

R  

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000   SI=0000  DI=0000 
DS=6800   ES=6800   SS=6800   CS=6800  IP=0100 NV UP  EI  PL  NZ  NA  PO  NC 
 
6800:0100   E92D0D      JMP   0E30 

 
A (Assemble): nhaäp leänh hôïp ngöõ. Chuù yù, DEBUG chæ duøng soá trong heä cô soá 

16 chöù khoâng duøng heä cô soá naøo khaùc. 

  
 

Ví duï:  

A 100 

6800:0100 MOV AX,FFFF 
6800:0103 MOV AH,5 
6800:0105 MOV BH,6 
6800:0107 MOV AL,BH 
6800:0109 
 
E (Entry): Thay ñoåi noäi dung oâ nhôù. 
 

Ví duï: 

E 120 

 
G (Go): Thöïc hieän chöông trình 
 
 
N (Name): Ñaët teân taäp tin 
 Ví 

duï: 

DIAMOND.COM 

 
W (Write): Ghi laïi taäp tin leân ñóa, chuù yù tröôùc ñoù phaûi nhaäp CX (soá byte söû 

duïng trong chöông trình) vaø  BX= 0 (ñóa A) 

 
L (Load): Laáy laïi noäi dung taäp tin vaøo boä nhôù, chuù yù tröôùc ñoù phaûi xaùc ñònh teân 

taäp tin, oå ñóa ñang löu giöõ 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 15 - 

 

T (Trace): thöïc hieän chöông trình tuaàn töï töøng leänh moät coù thoâng baùo noäi dung 

cuûa caùc thanh ghi thay ñoåi sau moãi leänh. 

 

III. VAØI CHÖÔNG TRÌNH ÖÙNG DUÏNG : 

 
Chöông trình 1: Hieän 1 kyù töï (♦) leân maøn hình 
 
-A 
 xxxx:0100 

MOV 

DL,4; 

maõASCII  

 

xxxx:0102 

MOV 

AH,2; kyù töï ♦ 

 xxxx:0104 

INT 

21 

 xxxx:0106 

INT 

20 

-G 
-U 
-N    DIAMOND.COM 
-R    CX                   (=8) 
-R   BX                    (=0) 
-W 
-Q 
 
 
Chöông trình 2: Hieän 1 chuoãi (Chao cac ban) leân maøn hình 
 
Caùch 1: 
-E 120 
 

43  6F 68 61 20 63 61 63 20

 62 

61 

6E 

 
-A 
 xxxx:0100 

MOV 

BX,120 

 xxxx:0103 

MOV 

CX,0C 

 xxxx:0106 

MOV 

DL,[BX] 

 xxxx:0108 

MOV 

AH,2 

 xxxx:010A 

INT 

21 

 xxxx:010C 

INC 

BX 

 xxxx:010D 

LOOP 

106 

 xxxx:010F 

INT 

20 

-U 
-G 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 16 - 

 

 
 * Sinh vieân coù theå ñaët teân roài löu vaøo ñóa 
Caùch 2: Söû duïng giaû leänh DB 
 
-A 
 xxxx:0100 

MOV 

AH,9 

 xxxx:0102 

MOV 

DX,109 

 xxxx:0105 

INT 

21 

 xxxx:0107 

INT 

20 

 

xxxx:0109 

DB 

'Chao cac ban! $' 

 
-U 
-G 
 
Chöông trình 3: Coäng 10 soá nguyeân ñaàu tieân 
 
-A 
 xxxx:0100 

MOV 

CX,1 

 xxxx:0103 

MOV 

AX,0 

 xxxx:0106 

ADD 

AX,CX 

 xxxx:0108 

INC 

CX 

 xxxx:0109 

CMP 

CX,0A 

 xxxx:010C 

JLE 

106 

 xxxx:010E 

INT 

20 

 
-U 
-T 
Chöông trình  4: Hieän  5 kyù töï ABCDE leân maøn hình 
-A 
 xxxx:0100 

MOV 

DL,41 

 xxxx:0102 

MOV 

CX,5 

 xxxx:0105 

CALL 

10E 

 xxxx:0108 

LOOP 

105 

 xxxx:010A 

MOV 

AH,4C 

 xxxx:010C 

INT 

21 

 xxxx:010E 

MOV 

AH,2 

 xxxx:0110 

INT 

21 

 xxxx:0112 

INC 

DL 

 xxxx:0114 

RET 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 17 - 

 

-N    HIEN.COM 
-R    CX                   (=F) 
-R   BX                    (=0) 
-W 
-G 
 
DEBUG 
-N    HIEN.COM 
-L 
-U 
 
Chöông trình 5: Thöïc hieän caùc pheùp toaùn  +   , -  ,  x ,  / 
 
1 byte: 
 
-A 
 xxxx:0100 

MOV 

AL,05 

   MOV 

BL,03 

   ADD 

AL,BL 

   MOV 

BL,02 

   SUB 

AL,BL 

   MOV 

CL,03 

   MUL 

CL 

   MOV 

CL,02 

   DIV 

CL 

   INT 

20 

-U 
-T 
 
1 word = 2 byte 
 
-A 
 xxxx:0100 

MOV 

AX,3A62 

   MOV 

CX,2B14 

   ADD 

AX,CX 

   MOV 

CX,1002 

   SUB 

AX,CX 

   MUL 

CX 

   MOV 

AX,A034 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 18 - 

 

   MOV 

DX,0001 

   MOV 

BX,1002 

   DIV 

BX 

   INT 

20 

-U 
-T 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 19 - 

 

CHÖÔNG 3: HÔÏP NGÖÕ DUØNG TRONG PC 

 
Hieän nay khi vieát chöông trình baèng hôïp ngöõ, chuùng ta thöôøng söû duïng trình 

dòch  MICROSOFT MACRO ASSEMBLER (MASM). Cuõng gioáng taát caû caùc ngoân ngöõ laäp 
trình khaùc nhö Basic, Pascal, C ñeàu phaûi thoâng qua dòch thì maùy tính môùi hieåu ñöôïc leänh 
sau khi ñaõ taïo ra maõ nguoàn trong moät moâi tröôøng keát hôïp soaïn thaûo. Ñeå soaïn thaûo moät 
chöông trình baèng hôïp ngöõ chuùng ta chæ caàn  söû duïng moät trình soaïn thaûo vaên baûn ASCII ví 
duï nhö Sidekick, phaàn soaïn thaûo trong Norton Commander...v.v... vaø sau ñoù seõ löu giöõ vaøo 
taäp tin ASCII treân ñóa.  Böôùc tieáp theo laø dòch maõ nguoàn sang maõ maùy nhôø trình dòch 
(Assembler). 

 
Chöông trình ñöôïc löu treân ñóa laø moät taäp tin coù phaàn môû roäng ASM ñöôïc soaïn 

thaûo baèng moät phaàn meàm soaïn thaûo vaên baûn (ASCII) trong ñoù caùc chöõ caùi vieát HOA ñeàu 
ñöôïc xöû lyù nhö nhöõng chöõ caùi vieát thöôøng tröø tröôøng hôïp ñaët trong 1 chuoãi (daõy kyù töï). 

 
Caùc chöông trình bao goàm nhöõng doøng leänh. Moãi doøng leänh laø moät leänh ñöôïc 

dòch sang maõ maùy baèng caùc trình dòch.  

I. DOØNG LEÄNH: 

 

Moãi doøng leänh goàm 4 vuøng 
 

Teân (identifier) 

Pheùp toaùn 

Toaùn haïng 

Chuù thích 

 
Thöôøng theo thoùi quen ngöôøi ta chia laøm 4 coät duøng cho 4 vuøng ñeå chöông trình ñöôïc roõ 
raøng maëc duø khoâng coù moät söï baét buoäc naøo veà vieäc chia naøy caû.  
 
TEÂN 

PHEÙP TOAÙN 

TOAÙN HAÏNG ; CHUÙ THÍCH 

 
Ví duï: 
Batdau:   

MOV  CX,5      ; ñaët soá ñeám ban ñaàu 

Caùc vuøng khaùc nhau phaûi ngaên caùch bôûi ít nhaát moät khoaûng troáng (space) hoaëc 

TAB, caùc toaùn haïng trong moät leänh phaûi caùc nhau bôûi 1 daáu phaåy (trong tröôøng hôïp naøy 
khoâng caàn thieát phaûi coù khoaûng troáng). 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 20 - 

 

Caùc teân ñöôïc laäp trình vieân töï do ñaët ñeå xaùc ñònh nhaõn, bieán, thuû tuïc, v.v...Teân 

goàm caùc kyù töï theo yeâu caàu sau: Kyù töï thöù nhaát laø chöõ caùi, soá kyù töï toái ña laø 31 vaø khoâng 
coù khoaûng troáng trong teân. 

 
Nhöõng pheùp toaùn laø nhöõng kyù töï gôïi nhôù leänh: MOV, ADD, INC... hoaëc giaû 

leänh (pseudo-instruction): DB, PROC... 

 

Nhöõng toaùn haïng trong moät leänh seõ ngaên caùch baèng moät daáu phaåy. 

Neáu coù 2 toaùn haïng thì toaùng haïng thöù nhaát laø ñích coøn toaùn haïng thöù hai laø 
nguoàn.  

 
Chuùng ta cuõng thaáy coù theå ñöa theâm chuù thích ñeå deã theo doõi  ñoïc chöông 

trình. Daáu ";" phaûi ñöôïc söû duïng tröôùc khi ghi chuù thích. 

 

II. DÖÕ LIEÄU: 

1. Haèng: 

 

Haèng laø moät giaù trò xaùc ñònh baèng moät leänh hay ñuùng hôn laø moät giaû leänh 

hôïp ngöõ, giaù trò naøy ñöôïc laäp trình vieân ñònh nghóa laø  khoâng thay ñoåi trong quaù trình thöïc 
hieän chöông. 

 
Giaû leänh EQU laø leänh hôïp ngöõ duøng ñeå ñònh nghóa moät haèng öùng vôùi moät 

teân ñöôïc laäp trình vieân ñaët cho.  

 
Ví duï: 

   

Dung    EQU  1 

 

  Sai 

 

 

EQU 

 

Nhöõng haèng töùc thôøi (immeùdiate) laø: 
 
. Nhöõng chöõ soáá do laäp trình vieân ñaët ra coù theå söû duïng trong caùc heä cô soá 

khaùc nhau. Do vaäy neân theâm chöõ caùi  "h" sau nhöõng soá duøng trong heä cô soá 16, vaø theâm 
chöõ caùi "b" sau taát caû caùc soá nhò phaân vì trình dòch hôïp ngöõ maëc nhieân chæ laøm vieäc trong 
heä cô soá 10 (thaäp phaân) (caàn chuù yù laø trình DEBUG chæ laøm vieäc vôùi heä cô soá 16). 

 

 

 

Ví duï: 1B4Dh, 1100b 

 

Nhöõng chöõ soá trong  heä cô soá 16 (hexadecimal) baét ñaàu baèng moät chöõ caùi 

thì phaûi theâm vaøo moät soá  "0" neáu khoâng trình dòch hôïp ngöõ  seõ xem nhö moät TEÂN vaø 
thoâng baùo loãi. 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 21 - 

 

 

 

. Nhöõng kyù töï: Nhöõng kyù töï hoaëc chuoãi (daõy kyù töï) ñeàu phaûi 

ñöôïc ñaùnh daáu nhaùy ñôn hoaëc ñoâi.  
 

 

Ví duï: "A", 'Hello' 

 

2. Bieán: 

 

Caùc bieán seõ chieám caùc vuøng nhôù trong quaù trình dòch nhôø söû duïng caùc leänh giaû.  
 
Leänh giaû DB khai baùo vuøng nhôù theo byte, laäp trình vieân coù theå ñaët teân cho 

phaàn ñaàu vuøng nhôù. Leänh giaû naøy cuõng xaùc ñònh vuøng nhôù ñöôïc duøng cho chöõ soá hay caùc 
chöõ caùi. 

 

Chuù yù: neáu coù nhieàu phaàn töû duøng trong leänh naøy thì nhöõng phaàn töû 

naøy phaûi ñöôïc ngaên caùch baèng nhöõng daáu phaåy. 

 
Loaïi  BYTE ñöôïc duøng cho caùc soá coù giaù trò trong khoaûng töø 0 ñeán 

255. 

Ví duï: 

Khai baùo moät bieán loaïi BYTE coù giaù  trò  ban  ñaàu  laøø  0,  Teân  laø    "So".              
So    DB   0 

Khai baùo vuøng nhôù coù 3 phaàn töû loaïi  BYTE 

XYZ  

DB  1,2,3 

 

Khai baùo moät bieán khoâng coù giaù trò ban ñaàu 

Khac  

DB  ? 

 

Khai baùo moät maûng coù 5 phaàn töû khoâng coù giaù trò ban ñaàu loaïi BYTE: 

Mang  

DB  5 DUP(?) 

 

Khai baùo moät maûng coù 25 phaàn töû, phaàn töû thöù nhaát laø 1, thöù hai laøø 2, v.v...: 

Mangkhac 

DB 

5  DUP (1,2,3,4,5) 

 
DUP baùo cho trình dòch bieát laø thöïc hieäp laëp laïi (DUPlicate). Nhö 
vaäy nhöõng giaù trò coù trong ngoaëc ñôn seõ laëp laïi cho ñeán heát.  
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 22 - 

 

Leänh giaû DW khai baùo vuøng nhôù goàm caùc töø (word) 
 
Leänh giaû DD khai baùo vuøng nhôù goàm caùc töø ñoâi (double word) 
 
Leänh giaû DF, DP  ->  6byte, DQ  -> 8byte; DT-> 10byte 
 
Chuoãi kyù töï: Leänh giaû DB cuõng ñöôïc söû duïng ñeå ñònh nghóa chuoãi kyù. Moät 

chuoãi kyù töï luoân ñöôïc ñaët trong daáu nhaùy; neáu chuoãi ñöôïc cho hieän leân maøn hình thì 
phaûi keát thuùc baèng daáu '$' 

 
Ví duï: 
Thongbao    DB   'Chaøo caùc baïn $' 
Baoloi          DB   'Coù loãi, ñeà nghò laøm laïi $' 
 
Maûng: Maûng laø moät taäp hôïp caùc döõ lieäu cuøng loaïi (byte, word...). Maûng seõ giuùp 

cho laäp trình vieân deã daøng laäp caùc voøng laëp ñôn giaûn trong moät chöông trình, muïc 
ñích laø truy caäp tuaàn töï ñeán caùc döõ lieäu caàn thieát theo thöù töï.  

Ví duï 1: 

Vôùi khai baùo   SO  DB    5,2,7 
 
Chuùng ta coù: 
 

                        SO      

hoaëc  xxxx:0100 

-  5 

 

SO+1  - 

hoaëc  xxxx:0101 

-  2 

 

SO+2  - 

hoaëc  xxxx:0102 

-  7 

Ví duï 2: 
 MANG 

DW 

 

12F9h, 

15AEh 

 thì 
 MANG - 

F9h 

 MANG+1 

12h 

 MANG+2 

AEh 

 MANG+3 

15h 

III. CAÁU TRUÙC CHÖÔNG TRÌNH: 

 
Caùc chöông trình vieát baèng maõ maùy bao goàm caùc phaàn maõ pheùp toaùn, döõ lieäu, 

ngaên xeáp. Moãi phaàn chieám moät phaân ñoaïn nhôù. Chöông trình vieát baèng hôïp ngöõ 
cuõng theo caáu truùc nhö vaäy. Luùc aáy döõ lieäu vaø ngaên xeáp ñöôïc ghi thaønh caùc phaân 
ñoaïn trong chöông trình . Moãi phaân ñoaïn cuûa chöông trình seõ ñöôïc dòch sang moät 
phaân ñoaïn nhôù trong quaù trình dòch.  

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 23 - 

 

 

1.  Loaïi  nhôù: 

 
Ngöôøi ta coù theå söû duïng ñònh höôùng bieân dòch (directive) ñeå xaùc ñònh loaïi nhôù: 
 
CUÙ PHAÙP:       .MODEL     loaïi nhôù 
 
Thöôøng ngöôøi ta söû duïng caùc loaïi sau: 
 
SMALL, MEDIUM, COMPACT, LARGE.... 
 
SMALL: Caùc maõ pheùp toaùn ñaët trong moät phaân ñoaïn  
 

Caùc döõ lieäu ñaët trong moät phaân ñoaïn. 

MEDIUM:  

Caùc maõ pheùp toaùn ñaët trong nhieàu phaân ñoaïn (hôn 1)  
Caùc döõ lieäu ñaët trong moät phaân ñoaïn 

 

 

COMPACT:  

Caùc maõ pheùp toaùn ñaët trong moät phaân ñoaïn  Caùc  döõ  lieäu  ñaët 

trong nhieàu phaân ñoaïn (hôn 1) 

 
LARGE:  

Caùc maõ pheùp toaùn ñaët trong nhieàu phaân ñoaïn (hôn 1)  
Caùc döõ lieäu ñaët trong nhieàu phaân ñoaïn 

(hôn 1) 

 
Khoâng theå coù caùc maûng chieám nhieàu hôn 64Kbyte   
 

2. Phaân ñoaïn döõ lieäu: 

 

Phaân ñoaïn döõ lieäu trong moät chöông trình bao goàm taát caû nhöõng bieán xaùc ñònh. 

Ngöôøi ta söû duïng ñònh höôùng bieân .DATA ñeå ñònh nghóa vuøng cho bieán vaø haèng. 

Ví duï: 
  

.DATA 

 

 

  WORD1 

 

DW 

 

  MSG 

 DB 

'Chao' 

 

  SO 

 EQU 

10101111b 

 

3. Phaân ñoaïn ngaên xeáp: 

 

Ngöôøi ta thöôøng daønh moät phaàn cuûa boä nhôù ñeå taïo ngaên xeáp. 

.STACK   kích thöôùc 

Kích thöôùc ñöôïc ñaët tuøy yù theo byte. 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 24 - 

 

 
Ví duï: 

   .STACK 100h 

Neáu chuùng ta khoâng ñaët kích thöôùc cho phaân ñoaïn naøy thì maëc nhieân phaân 

ñoaïn ngaên xeáp seõ laáy kích thöôùc laø 1KByte 

 

4. Phaân ñoaïn chöông trình 

 
  

.CODE 

 

teânchöôngtrình 

 
 "teânchöôngtrình" laø moät teân do laäp trình vieân ñaët cho chöông trình. Thöôøng teân 

chöông trình coù theå khoâng caàn ñaët nhaát laø trong tröôøng hôïp loaïi nhôù laø SMALL.  

 
Coù raát nhieàu phöông phaùp ñeå laäp chöông trình, tuy vaäy toát nhaát neân chia nhoû 

chöông trình thaønh nhieàu chöông trình con (thuû tuïc) 

 
Khi taïo moät thuû tuïc ngöôøi ta thöôøng söû duïng leänh giaû PROC ôû ñaàu cuûa thuû tuïc 

vaø ENDP sau leânh cuoái cuûa thuû tuïc.  

 
Daïng chung khi söû duïng caùc leänh giaû naøy laø: 
  

teânthuûtuïc 

 PROC 

     

 ;leänh 

 teânthuûtuïc 

   

ENDP 

 

Ví duï     

.CODE 

 

  MAIN 

PROC 

   

 

; caùc leänh cuûa chöông trình chính 

 

  MAIN 

ENDP 

; nhöõng thuû tuïc khaùc 
 

Toùm laïi:Ñeå vieát moät chöông trình chuùng ta coù theå coù caáu truùc ñôn giaûn chung 

nhö sau  

 
  

.MODEL  SMALL 

  

.STACK  100h 

  

.DATA 

 

  ;ñònh 

nghóa 

döõ 

lieäu 

  

.CODE 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 25 - 

 

  

MAIN 

PROC 

 

  ; 

leänh 

  

MAIN 

ENDP 

   

; caùc thuû tuïc khaùc 

 

 END 

 MAIN 

 

5. Caùc coâng cuï caàn thieát: 

Coù raát nhieàu caùch ñeå  maõ hoaù moät chöông trình hôïp ngöõ. Caùch ñaàu tieân laø maõ 

hoaù tröïc tieáp caùc leänh trong boä nhôù baèng trình DEBUG. Caùch thöù hai laø maõ hoaù maõ 
"nguoàn" trong moät taäp tin roài seõ dòch ñeå taïo ra moät chöông trình thöïc hieän ñöôïc. 
Caùch naøy laø caùch maø ngöôøi ta thöôøng duøng nhaát vaø goàm caùc böôùc sau: 

 
a- Chuaån bò laäp trình, taïo caáu truùc, xaùc laäp caùc pheùp tính,.. vaø xaùc ñònh löu ñoà 

thuaät toaùn. Böôùc naøy chæ caàn vieát treân giaáy. 

 
b- Vieát chöông trình baèng caùc leänh nhôø moät phaàn meàm soaïn thaûo vaên baûn 

ASCII nhö EDLIN, Sidekick hoaëc moät phaàn meàm soaïn thaûo baát kyø mieãn sao ghi laïi 
ñöôïc moät taäp tin theo maõ. 

Taäp tin phaûi coù phaàn môû roäng laø ASM. 
 
c- Dòch maõ nguoàn sang "maõ maùy" baèng caùc söû duïng trình dòch hôïp ngöõ 

(MASM). Trong böôùc naøy thöôøng xuaát hieän caùc thoâng baùo loãi, trong tröôøng hôïp ñoù 
phaûi söûa loãi roài laïi tieáp tuïc dòch cho ñeán khi khoâng coøn moät loãi naøo nöõa. 

Sau böôùc naøy chuùng ta seõ thu nhaän ñöôïc moät taäp tin coù phaàn môû roäng laø OBJ 
 
d- Ñeå taïo moät chöông trình thöïc hieän ñöôïc, chuùng ta söû duïng trình khaùc laø 

LINK.EXE  

Sau böôùc naøy chuùng ta seõ thu nhaän ñöôïc moät taäp tin coù phaàn môû roäng laø EXE 
 
e- Kieåm tra laïi chöông trình coù thöïc hieän toát khoâng baèng caùch goõ phaàn teân taäp 

tin vaø nhaán ENTER. 

 
Meïo nhoû

o

 

Chuùng ta coù theå vieát nhöõng chöông trình nhoû chaïy trong trình 
DEBUG töøng leänh moät ñeå hieåu roõ caùch xöû lyù töøng leänh moät sau ñoù 
coù theå gheùp laïi trong moät chöông trình lôùn hôn nhaèm taïo taäp tin 
maõ nguoàn nhö neâu treân

o

 

Chuùng ta coù theå thöïc hieän caùc böôùc treân tuaàn töï moät caùch töï ñoäng 
neáu söû duïng taäp tin boù leänh vôùi phaàn môû roäng laø BAT 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 26 - 

 

 
Cuõng caàn neân bieát raèng khi moät chöông trình thöôøng truù trong boä nhôù, DOS seõ 

daønh 256 byte cho phaàn baét ñaàu PSP  (Program Segment Prefix). PSP giöõ toaøn boä 
caùc thoâng tin cuûa chöông trình. DS vaø  ES giöõ ñòa chæ cuûa  PSP tröôùc khi thöïc hieän 
chöông trình. Nhö vaäy DS khoâng giöõ ñòa chæ cuûa phaân ñoaïn döõ lieäu. Ñeå giaûi quyeát 
vaán ñeà naøy neáu coù söû duïng ñòa chæ phaân ñoaïn döõ lieäu ntrong chöông trình thì phaøi söû 
duïng theâm 2 doøng leänh sau: 

 MOV  

AX,@DATA 

 MOV  

DS,AX 

 
Ví du: Vieát moät chöông trình vôùi teân taäp tin laø CHAO.ASM duøng phaàn meàm 

soaïn thaûo vaên baûn ASCII baát kyø 

 
.MODEL SMALL 
.DATA 
  MSG   

DB 

'Chao cac ban!$' 

.STACK  

100h 

.CODE 
 MAIN 

PROC 

 

  MOV 

 AX,@DATA 

 

  MOV 

 DS,AX 

 

  LEA 

 DX,MSG 

 

  MOV 

 AH,9 

 

 ;Hieän 

thoâng 

baùo 

 

  INT 

 21h 

 

 

 MOV 

 

AH,4Ch 

;Döøngchöông 

trình 

 

  INT 

 21h 

 MAIN 

ENDP 

 

  END 

 MAIN 

 
Sau khi ghi taäp tin vaøo ñóa, thöïc hieän caùc böôùc sau: 
  

MASM 

CHAO; 

 

 LINK 

 CHAO; 

Sau ñoù ñeå thöïc hieän chöông trình, goõ CHAO ↵ 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 27 - 

 

CHÖÔNG 4: PHÖÔNG PHAÙP LAÄP TRÌNH 

 

I. TOÅNG QUAN: 

 
Laäp trình baèng hôïp ngöõ cuõng gioáng nhö raát nhieàu ngoân ngöõ laäp trình khaùc 

khoâng khoù nhöng caàn phaûi toå chöùc toát. Thöôøng chuùng ta thaáy caùc chöông trình ñöa ra 
thaät khoù ñoïc vaø khoâng tuaân theo luaät leä naøo caû, moãi laäp trình vieân laøm theo  kieåu cuûa 
hoï vaø keát quaû laø chöông trình chæ coù theå hieåu ñöôïc bôûi chæ chính taùc giaû cuûa noù maø 
thoâi 

 
Coù raát nhieàu phöông phaùp ñöôïc ñöa ra ngoõ haàu taïo ra moät soá qui taéc ñeå laäp 

trình. Trong soá caùc phöông phaùp naøy, coù moät phöông phaùp baét chöôùc caùch laäp trình 
baèng ngoân ngöõ caáp cao nhö C, Pascal trong ñoù coù nhieàu leänh CHUAÅN cho pheùp laäp 
trình ñeán  90% vaán ñeà: 

 
IF . . .  THEN . . . ELSE 
 
CASE . . . OF 
 
FOR 
 
WHILE . . . 
 
REPEAT . . . 
 
Coù theå thaáy raèng caùc leänh hôïp ngöõ coù chöùc naêng cuûa: 
 
. IF laëp laïi nhôø nhaõn IF1, THEN1, ELSE1, ENDIF1; leänh  IF tieáp theo nhôø IF2, 

THEN2, ELSE2, ENDIF2,...; 

 
. FOR seõ laëp laïi nhôø nhaõn FOR1. 
 
 
 

II. CAÙC LEÄNH LIEÂN QUAN ÑEÁN REÕ NHAÙNH: 

 

CMP ñích, 

nguoàn 

TEST ñích, 

nguoàn 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 28 - 

 

 
Leänh so saùnh  CMP thöïc hieän gioáng pheùp tröø SUB nhöng keát quaû laïi khoâng giöõ 

laïi, nghóa laø toaùn haïn nguoàn vaø ñích ñeàu khoâng bò aûnh höôûng. Nhöõng bit trong thanh 
ghi traïng thaùi ñeàu bò taùc ñoäng nhö khi thöïc hieän pheùp tröø. Leänh naøy thöôøng ñöôïc söû 
duïng ñeå tìm ra moái quan heä giöõa hai toaùn haïng (so saùnh). 

 
Leänh TEST thöïc hieän gioáng pheùp VAØ logic (AND)  nhöng keát quaû khoâng giöõ 

laïi. Ñieàu naøy coù nghóa laø toaùn haïng ñích vaø nguoàn khoâng ñoåi chæ coù caùc bit trong 
thanh ghi traïng thaùi seõ thay ñoåi. Chuùng chuû yeáu söû duïng ñeå xaùc ñònh laø 1 bit naøo ñoù 
coù giaù trò laø 1 hoaëc laø 0 . 

1. Caùc leänh  reõ nhaùnh coù ñieàu kieän: 

 
Nhöõng leänh reõ nhaùnh coù ñieàu kieän ñeàu thöïc hieän sau nhöõng leänh taùc ñoäng ñeán 

thanh ghi traïng thaùi. Nhöõng leänh ñeán sau reõ nhaùnh seõ naèm trong khoaûng töø -128 ñeán 
+127 byte tính töø leänh keá tieáp leänh reõ nhaùnh. Do vaäy ñeå môû roäng phaïm vi reõ nhaùnh 
coù ñieàu kieän, chuùng ta coù theå keát hôïp vôùi leänh reõ nhaùnh khoâng ñieàu kieän.  

 

 Jcc 

ñích 

 

Nhöõng leänh reõ nhaùnh coù ñieàu kieän naøy luoân kieåm tra caùc bit trong thanh ghi 

traïng thaùi ñaõ ñöôïc xaùc ñònh nhôø leänh tröôùc ñoù. Neáu ñieàu kieän ñuùng, böôùc nhaûy seõ 
thöïc hieän ñeán ñòa chæ ñích. Trình dòch hôïp ngöõ seõ tính toaùn khoaûng caùch ñeán ñích ñeå 
xaùc ñònh soá byte khoaûng caùch töø leänh keá tieáp sau reõ nhaùnh coù ñieàu kieän ñeán ñích.  

 
 
 
 
Ñieàu kieän khoâng daáu 

Ñieàu kieän 

Moâ taû 

Kieåm tra 

A/NBE 

Treân / Khoâng döôùi laãn baèng 

CF ou ZF = 0 

AE/NB 

Treân hoaëc baèng/ Khoâng döôùi 

CF=0 

B/NAE 

Döôùi / Khoâng treân laãn baèng 

CF=1 

BE/NA 

Döôùi hoaëc baèng / Khoâng treân 

CF ou ZF = 1 

Nhôù baèng  1 

CF=1 

NC 

Nhôù baèng  0 

CF=0 

P/PE Chaún 

PF=1 

NP/PO Leõ 

PF=0 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 29 - 

 

Ñieàu kieän coù daáu 

Ñieàu kieän 

Moâ taû 

Kieåm tra 

G/NLE 

Lôùn hôn / khoâng nhoû hôn laãn baèng 

((SF xor OF) or ZF)= 0 

GE/NL 

Lôùn hôn hoaëc baèng / khoâng nhoû hôn 

(SF xor OF)=0 

L/NGE 

Nhoû hôn / khoâng lôùn hôn laãn baèng 

(SF xor OF)=1 

LE/NG 

Nhoû hôn hoaëc baèng / Khoâng lôùn hôn 

((SF xor OF) or ZF)= 1 

Traøn baèng 1 

OF=1 

NO 

Traøn baèng  0 

OF=0 

S Daáu 

döông 

SF=1 

NS Daáu 

aâm 

SF=0 

 
Ñieàu kieän  zeùro 

Ñieàu kieän 

Moâ taû 

Condition testeùe 

E/Z 

Baèng / zeùro 

ZF = 1 

NE/NZ 

Khoâng baèng / Khoâng zeùro 

ZF = 0 

 

2. Caùc leänh  reõ nhaùnh khoâng ñieàu kieän: 

 
Ñoù laø nhöõng leänh nhaûy böôùc ñeán moät vò trí naøo ñoù trong chöông trình.  
Leänh nhaûy khoâng ñieàu kieän coù daïng: 
 

 JMP 

ñích 

Leänh naøy coù theå nhaûy ñeán baát kyø moät vò trí naøo trong chöông trình. 

III. CAÙC CAÁU TRUÙC ÑIEÀU KHIEÅN: 

1-  Löïa choïn 
  a. IF THEN 
 

Ñieàu kieän

Leänh 1

 

 

Sai

 
 
 

Ñuùng

 
 
 
 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 30 - 

 
 
 

Neáu   <ñieàu kieän>   Thì  <leänh 1> 

 

Ví duï: 

 

Neáu     AX  >  0    Thì     AX             -AX 

 Hôïp 

ngöõ: 

 

.  .  . 

 

CMP 

AX , 0 

 JNG 

END_IF 

 NEG 

AX 

 

.  .  . 

 END_IF: 
 

  b. IF THEN ELSE 
 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 
 
 
 
 
 
 
 
 

Neáu   <ñieàu kieän>   Thì  <Leänh 1> 

 

 

  Coøn laïi <leänh 2> 

Leänh 2

Leänh 1 

Ñuùng 

ñieàu kieän 

Sai

 

 

Ví duï:          Neáu  AL  <= BL  Thì    hieän BL               

 

Coøn 

laïi  

 hieän 

AL 

 

 Hôïp 

ngöõ: 

 

.  .  . 

 

CMP 

AL , BL 

 JNBE 

EL_SE 

 

MOV 

DL , BL 

 JMP 

HIEN 

 EL_SE: 
  

MOV 

DL, 

AL 

 HIEN: 
  

MOV 

AH,2 

 

background image

Hôïp Ngöõ 

 

 

- 31 - 

 
  

INT 

21h 

 

.  .  . 

 

    END_IF: 

 
 

 c.   CASE OF 

 

Bieåu thöùc 

choïn 

 
 
 
 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 
 
 

 

Leänh 1 

Leänh 2

Leänh 3

Leänh n

. . . 

Tröôøng hôïp 

 

BX=1: AX  <-   1 

 

BX=2: AX  <-   5 

 

BX=3: AX  <-  10 

Coøn laïi 
 AX 

 <- 

HetTruonghop 
Hôïp ngöõ 
 
Case1: 
Case1C1: 
 CMP 

BX, 

 JNZ 

Case1C2 

 MOV 

AX, 

 JMP 

EndCase1 

Case1C2: 
 CMP 

BX, 

 JNZ 

Case1C3 

 MOV 

AX, 

 JMP 

EndCase1 

Case1C3: 
 CMP 

BX, 

 JNZ 

Other1 

 MOV 

AX, 

10 

 

background image

Hôïp Ngöõ 

 

 

- 32 - 

 

 JMP 

EndCase1 

Other1: 
 MOV 

AX, 

ENDCase1: 
 
 
d. Caùc ñieàu kieän phöùc: 
 
Daïng:        

ñieàu kieän 1    VAØ   ñieàu kieän 2 

 

ñieàu kieän 1    HOAËC  ñieàu kieän 2 

 
* Ñieàu kieän VAØ: 
 
Ñieàu kieän phöùc (VA)Ø ñuùng chæ khi caû 2 ñieàu kieän ñeàu ñuùng. Ngöôïc laïi, neáu 

moät trong caùc tröôøng hôïp laø sai thì ñieàu kieän phöùc (VAØ) laø sai.  

 
Ví duï: Ñoïc moät kyù töï. Neáu laø chöõ caùi HOA thì seõ cho hieän leân. 
 
 
Ñoïc moät kyù töï  
Neáu     ( kyù töï >='A' )  VAØ  (kyù töï  <=  'Z' ) 
Thì 

Hieän kyù töï 

HetNeu 
 
Hôïp ngöõ 
; ñoïc moät kyù töï 
 MOV 

AH, 

 INT 

21h 

; Neáu     ( 'A'  <= kyù töï )  VAØ  (kyù töï  <=  'Z' ) 
 CMP 

AL, 

'A' 

 JNAE 

FSI 

 CMP 

AL, 

'Z' 

 JNBE 

FSI 

 MOV 

DL,AL 

 MOV 

AH,2 

 INT 

21h 

HetNeu: 
 
* Ñieàu kieän  HOAËC 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 33 - 

 

 
(Ñieàu kieän 1 HOAËC ñieàu kieän 2) laø ñuùng neáu ñieàu kieän 1 hoaëc ñieàu kieän 2 

ñuùng. Ñieàu kieän phöùc seõ sai neáu caû hai ñieàu kieän ñeàu sai. 

 
Ví duï: Ñoïc moät kyù töï. Neáu kyù töï laø 'C' hoaëc 'c', cho hieän kyù töï aáy. Coøn 

khoâng thì döøng chöông trình. 

 
Ñoïc moät kyù töï 
 
Neáu (kyù töï='C') hoaëc (kyù töï='c') 
 
Thì 

 hieän kyù töï 

 
Coøn khoâng   thì döøng chöông trình  
 
Hôïp ngöõ: 
; Ñoïc moät kyù töï 
 MOV 

AH,1 

 INT 

21h 

; Neáu  (kyù töï='C') hoaëc (kyù töï='c') 
 
 CMP 

AL, 

'C' 

 JE 

THI 

 CMP 

AL, 

'c' 

 JE 

THI 

 JMP 

CONKHONG 

THI: 
 MOV 

AH,2 

 MOV 

DL,AL 

 INT 

21h 

 JMP 

HET 

CONKHONG: 
 MOV 

AH,4Ch 

 INT 

21h 

HET: 
 
2- Voøng laëp: 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 34 - 

 

Hôïp ngöõ coù nhöõng leänh ñaëc bieät cho pheùp taïo caùc voøng laëp trong moät 

chöông trình. 

 
LOOP ñích 
 
Leänh LOOP laøm giaûm noäi dung cuûa thanh ghi CX moät ñôn vò vaø nhaûy ñeán 

ñòa chæ ñích neáu noäi dung CX khoâng baèng 0. Neáu thanh ghi CX baèng 0, voøng laëp 
keát thuùc vaø leänh keá tieáp leänh LOOP seõ ñöôïc thöïc hieän. Ñòa chæ ñích caàn naèm trong 
khoaûng -128 vaø 127 byte. Leänh naøy khoâng taùc ñoäng ñeán caùc bit cuûa thanh ghi 
traïng thaùi  

 
JCXZ ñích 
 
Leänh JCXZ thöïc hieän nhaûy böôùc ñeán ñòa chæ ñích neáu thanh ghi CX baèng 0. 

Leänh naøy thöôøng söû duïng ôû ñaàu moät voøng laëp. 

a - Voøng laëp FOR: 
 
Soá voøng laëp laø coá ñònh. 
CHO  soá ban ñaàu  THÖÏC HIEÄN   leänh 
KEÁT THUÙC 
 

Leänh thöïc hieän

Ñeám <- Ñeám -1

Ñeám=0?

Xaùc ñònh soá voøng laëp

 
 
 
 
 
 
 
 
 
 
 
 
 
 

Sai

 

Ñuùng

 
 
 

; Ñaët CX = soá voøng laëp 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 35 - 

 

Dau: 
 ;leänh 
 
 LOOP 

 

Dau 

 
Ví duï:  

FOR 80 DO hieän  '*' 

 
Hôïp ngöõ 
 MOV 

CX,80 

 MOV 

AH,2 

 MOV 

DL,'*' 

Dau: 
 INT 

21h 

 LOOP 

Dau 

b - Voøng laëp WHILE 
 
Voøng laëp naøy thöïc hieän theo moät ñieàu kieän. 
 
KHI ñieàu kieän THÖÏC HIEÄN 
 leänh 
KEÁT THUÙC 
 
 
 

Ñieàu kieän

leänh 

Ñuùng

 
 
 
 
 
 
 
 

Sai 

 
 
 
 
Ví duï:      

BX   <--  5 

 
 

Khi  BX>0  thöïc hieän  BX  <--  BX -1  

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 36 - 

 

 
 Keát 

thuùc 

 
Hôïp ngöõ 
 MOV 

BX, 

While1:  
 CMP 

BX,0 

 JLE 

EndWhile1 

 DEC 

BX 

 JMP 

While1 

EndWhile1: 
 
 
c - Voøng laëp REPEAT... UNTIL 
 
 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 
 
 
 
 
 
 
 
 
Ví duï:  

BX  <--  10 

leänh

Ñieàu kieän

Sai

Ñuùng 

 Laëp 

laïi 

 

 

BX  <  BX-1 

 

Ñeán khi   BX <= 0 

 
Hôïp ngöõ 
 
 MOV 

BX,10 

Repeat1: 
 DEC 

BX 

 CMP 

BX, 

 JNLE 

Repeat1 

EndRepeat1: 

 

background image

Hôïp Ngöõ 

 

 

- 37 - 

 

 
Thöïc hieän laäp trình theo trình töï nhö treân ñoøi hoûi moät söï caàn maãn naøo ñoù 

nhöng laïi giuùp laäp trình vieân thaáy ñöôïc moïi thöù raát roõ raøng. Chính vì vaäy vieäc laäp 
trình trôû neân ñôn giaûn hôn raát nhieàu. Moãi laäp trình vieân coù theå coù moät phöông 
phaùp laäp trình song caàn neân bieát raèng neáu chuùng ta laøm vieäc theo nhoùm hoaëc moät 
chöông trình ñöôc phaân thaønh nhieàu moñun thì vieäc tuaân theo nhöõng qui öôùc laø 
cöïc kyø caàn thieát: ví duï nhö taát caû caùc nhaõn ñaët ra phaûi gôïi nhôù vaø tuaân theo qui 
öôùc giuùp cho nhöõng ngöôøi khaùc deã hieåu vaø söû duïng vieát caùc moñun chung. 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 38 - 

 

CHÖÔNG 5: NGAÊN XEÁP VAØ THUÛ TUÏC 

 

I. NGAÊN XEÁP: 

 

Ngaên xeáp laø nôi löu tröõ döõ lieäu töùc thôøi trong boä nhôù. Dung löôïng boä nhôù 

daønh cho ngaên xeáp ñöôïc laäp trình vieân ñaët ra trong chöông trình nguoàn.  

 
Nguyeân taéc hoaït ñoäng cuûa ngaên xeáp laø döõ lieäu vaøo sau thì ra tröôùc goïi laø 

ngaên xeáp LIFO (Last In, First Out). Döõ lieäu ñöa vaøo trong ngaên xeáp choàng leân 
nhau do vaäy ngöôøi ta coøn goïi laø xeáp choàng vaø thanh ghi SP (Stack pointer) ñöôïc 
söû duïng nhö con troû ngaên xeáp xaùc ñònh vò trí cuoái trong ngaên. 

 
Ngaên xeáp löu giöõ noäi dung caùc thanh ghi hoaëc caùc bieán.  
Leänh ñeå ñöa döõ lieäu vaøo ngaên xeáp laø: 
 
PUSH nguoàn 
 
Leänh PUSH giaûm giaù trò cuûa thanh ghi xuoáng 2 ñôn vò neáu nguoàn laø thanh 

ghi 16 bit vaø luùc aáy vò trí ñænh cuûa ngaên xeáp seõ ghi trong con troû ngaên xeáp SP. 

 
Leänh ñeå laáy döõ lieäu ra khoûi ngaên xeáp laø: 
 
POP ñích 
 
Leänh POP traû laïi noäi dung löu giöõ trong ngaên xeáp cho caùc thanh ghi. Noäi 

dung thanh ghi SP taêng leân 2 ñôn vò neáu thanh ghi  nhaän döõ lieäu 16 bit. 

 

II. THUÛ TUÏC: 

Caùc thuû tuïc (hoaëc chöông trình con) bao goàm moät daõy caùc doøng leänh noái 

tieáp nhau ñeå thöïc hieän moät coâng vieäc ñaõ xaùc ñònh. Coâng vieäc naøy coù theå ñöôïc goïi 
ñeán nhieàu laàn trong moät chöông trình. Thay vì cöù vieát laäp laïi ñoaïn leänh naøy trong 
chöông trình, laäp trình vieân ñaët taát caû caùc doøng leänh naøy vaøo moät khoái goïi laø thuû 
tuïc. Sau ñoù khi caàn laäp trình vieân cöù goïi thuû tuïc naøy baát cöù luùc naøo tuøy thích. 

 

Caùc thuû tuïc ñöôïc chia ra laøm hai loaïi:  
 
- Caùc thuû tuïc NEAR ñöôïc khai baùo trong cuøng phaân ñoaïn maõ cuûa chöông 

trình goïi. Ñòa chæ trôû veà ghi trong ngaên xeáp chæ laø IP (maõ 16 bit). 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 39 - 

 

 
- Caùc thuû tuïc FAR söû duïng phaân ñoaïn maõ khaùc vôùi phaân ñoaïn maõ cuûa 

chöông trình goïi. Ñòa chæ trôû veà ghi trong ngaên xeáp laø CS vaø IP (maõ 16 bit) 

 
Caùc thuû tuïc ñöôïc goïi baèng leänh CALL. Leänh naøy giöõ ñòa chæ trôû veà cuûa 

chöông trình trong ngaên xeáp vaø giaûm giaù trò con troû ngaên xeáp 2 ñôn vò neáu thuû tuïc 
laø NEAR. Sau ñoù nhaûy böôùc ñeán vò trí ñaõ xaùc ñònh. Con troû ngaên xeáp seõ giaûm 4 
neáu thuû tuïc laø FAR. 

  
Moät thuû tuïc ñöôïc söû duïng vôùi caùc ñònh höôùng bieân dòch PROC...ENDP. Ñeå 

coù theå trôû veà chöông trình chính, cuoái moãi thuû tuïc caàn coù theâm leänh RET. Ñieàu 
naøy giuùp laáy laïi ñòa chæ ñaõ ghi vaøo trong ngaên xeáp vaø taêng giaù trò con troû ngaên xeáp 
leân 2 neáu thuû tuïc laø NEAR vaø leân 4 neáu thuû tuïc laø FAR.  

 
Caáu truùc chung cuûa moät thuû tuïc nhö sau: 
 
Teân 

PROC 

NEAR (hoaëc FAR) 

 ; 
 

; thaân thuû tuïc 

 ; 
 ; 
 RET 
Teân ENDP 
 
 

Chöông trình chính 

 

thuû tuïc 

 

  

TEMPO 

PROC 

CALL   TEMPO 

 

 

 

 

 

 

 

 

CALL   TEMPO 

 

 

  

RET 

  

TEMPO 

ENDP 

Goïi thuû tuïc 

 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 40 - 

 

III. SÖÛ DUÏNG PTR VAØ LABEL: 

a- Neáu moät ñòa chæ ví duï [BX] xuaát hieän nhö moät soá haïng, 8088 phaûi bieát 

choïn xöû lyù 1 hoaëc 2 byte taïi ñòa chæ ñoù, ñeå cho roõ raøng caàn phaûi duøng BYTE PTR 
hoaëc WORD PTR 

 
Ví duï 1:  

MOV 

[BX],1 

 
 nghóa 

laø 

 
 MOV 

BYTE 

PTR 

[BX], 

hoaëc 
 MOV 

WORD 

PTR 

[BX], 

 
Ví duï 2: 
 .DATA 
  

.... 

  

DOLLARS 

DB 

1Ah 

  

CENTS 

 

DB 

52h 

  

.... 

 .CODE 

 

  

... 

  

MOV 

AX,WORD 

PTR 

 

DOLLARS 

; naïp      521A  --->  AX 
b- Ngöôøi ta coøn söû duïng ñònh höôùng bieân dòch LABEL ñeå ñònh nghóa laïi moät 

bieán theo loaïi khaùc 

 
Daïng: teân 

LABEL 

loaïi 

 
Ví duï 1: 

WORD_ARR 

LABEL 

WORD 

 BYTE_ARR 

DB 

100 

DUP 

(0) 

 
WORD_ARR ñònh nghóa moät maûng 50 töø vaø BYTE_ARR ñònh nghóa moät 

maûng 100 byte. 

 
Ví duï 2: 

.DATA 

  

... 

  

MONEY 

 

LABEL 

WORD 

  

DOLLARS 

DB 

1Ah 

  

CENTS 

 

DB 

52h 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 41 - 

 

  

... 

 .CODE 

 

  

... 

  

MOV 

AX, 

MONEY 

Ñieàu naøy gioáng nhö 
  

MOV 

AL, 

DOLLARS 

  

MOV 

AH,CENTS 

IV. VAØI CHÖÔNG TRÌNH ÖÙNG DUÏNG: 

1. Hieän soá thaäp phaân: 

 
Ñeå hieän moät soá leân maøn hình chuùng ta caàn phaûi taïo moät thuû tuïc. Ñeå laøm 

vieäc naøy chuùng ta caàn phaûi phaân tích soá sau ñoù hieän tuaàn töï töøng chöõ soá moät. Do 
ñoù chuùng ta caàn coù 2 thuû tuïc: 

Hieän moät chöõ soá; 
Hieän moät soá. 
 
a- Hieän moät chöõ soá: 
Haøm 2 ngaét 21h duøng ñeå hieän moät kyù töï leân maøn hình trong ñoù maõ ASCII 

cuûa kyù töï ñöôïc ñöa vaøo DL, ví vaäy chuùng ta caàn chuyeån chöõ soá sang maõ ASCII 
baèng caùch coâng theâm vaøo soá 48: 

 
 

Maõ ASCII 

Kyù töï 

 

 48 

(30h) 

 49 

(31h) 

 50 

(32h) 

 ... 
 
Hienchuso PROC 
 

PUSH 

AX 

    ;giöõAX 

 PUSH 

DX 

 

ADD 

AL, 48   ;Chöõ soá 0...9 

 MOV 

DL, 

AL 

 

MOV 

AH, 2      ;Hieän kyù töï 

 INT 

 

21h 

 

 POP 

DX 

 POP 

AX 

 RET 
Hienchuso ENDP 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 42 - 

 

 
b- Hieän soá: 
Baây giôø chuùng ta phaân tích soá cho hieän. Chuùng ta söû duïng pheùp chia cho 10, 

ñaët soá bò chia vaøo AX (neáu nhö soá naøy töông öùng vôùi moät töø). Thöông soá seõ naèm 
trong AL vaø soá dö trong AH. Neáu chia 1 soá laø töø ñoâi (double word) chuùng ta ñaët 
soá ñoù trong DX:AX vaø nhö vaäy thöông soá seõ ñaët trong AX vaø soá dö trong DX. 
Nhö vaäy, 

 8765 DIV 

10 = 876 

dö 5 

  876  DIV 

10 =  87 dö 6 

 87  DIV 

10 = 8  dö 7 

 8 

DIV 

10 = 0  dö 8 

 
Chuùng ta thaáy caùc soá dö laø nhöõng chöõ soá taïo thaønh keát quaû baèng soá tuy vaäy 

chuùng ta khoâng theå cho hieän caùc soá dö ngay sau khi chia vì nhö vaäy seõ ñaûo soá 
(5678), chuùng ta caàn phaûi naïp caùc chöõ soá tuaàn töï vaøo ngaên xeáp sau ñoù laáy ra vaø 
cho hieän leân maøn hình thì môùi ñaùp öùng ñöôïc yeâu caàu. 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 43 - 

 

HienSoTP PROC 
  

PUSH  BX 

 

  

PUSH  CX 

 

 

MOV  

BX, 10 

; soá chia 

taùch soá vaø ñaët nhöõng chöõ soá theo thöù töï phuø hôïp trong ngaên xeáp 

  

MOV 

  CX,0 

Tach: 
  

MOV 

  DX,0 

   

  

DIV 

  BX 

  

PUSH  DX 

  

INC 

  CX 

  

CMP 

  AX, 

  

JNZ 

  Tach 

Hienlen: 
  

POP 

  AX 

  

CALL  Hienchuso 

  

LOOP  Hienlen 

  

POP  CX 

  

POP  BX 

  

RET 

HienSoTP ENDP 
 
c- Caùc soá aâm: 
 
Thuû tuïc treân khoâng duøng ñeå hieän caùc soá coù daáu. Neân nhôù raèng 

neáu moät soá coù daáu thì bit lôùn nhaát laø bit daáu, caàn phaûi kieåm tra xem 
neáu soá laø soá aâm thì phaûi theâm daáu '-' ñoàng thôøi phaûi tính buø 2 cho soá 
ñoù 

 
HienAscii PROC 
  

PUSH  AX 

  

PUSH  DX 

  

MOV  DL,AL 

  

MOV  AH, 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 44 - 

 

  

INT 

21h 

  

POP  DX 

  

POP  AX 

  

RET 

HienAscii ENDP 
 
Ñeå kieåm tra xem moät soá aâm chuùng ta coù theå coäng theâm soá 0 roài 

kieåm tra bit chæ baùo SF ñeå bieát daáu cuûa keát quaû: 

 

 HienDauTP PROC 
  

PUSH AX 

  

PUSHF 

  

ADD AX, 

  

JNS  Khongdau 

  

PUSH AX 

  

MOV AL,'-' 

  

CALL HienAscii 

  

POP  AX 

  

NEG AX 

 Khongdau: 
  

CALL HienSoTP 

  

POPF 

  

POP  AX 

  

RET 

 HienDauTP ENDP 

 

2. Hieän soá nhò phaân vaø thaäp luïc phaân 

 
a-  Hieän soá nhò phaân: 
 
Trong moät soá tröôøng hôïp, chuùng ta laïi muoán bieåu dieãn moät soá nhò 

phaân. Chuùng ta phaûi laáy töøng bit ra sau ñoù cho hieän leân maøn hình.  

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 45 - 

 

 
HienNP PROC 
  

PUSHF 

  

PUSH  BX 

  

PUSH  CX 

  

MOV 

  BL,AL  

  

MOV 

  CX,8 

Hienbit: 
  

RCL 

  BL,1 

 MOV 

 

AL,0 

 ADC 

 

AL,30h 

 CALL 

HienAscii 

 LOOP 

Hienbit 

 POP 

CX 

 POP 

BX 

 POPF 
 RET 
HienNP ENDP 
 
b- Hieän Thaäp Luïc Phaân 
 
Nhöõng chöõ soá thaäp luïc phaân thöôøng ñöôïc söû duïng trong caùc 

chöông trình hôïp ngöõ, trong thöïc teá ñoâi khi caàn thieát phaûi hieän soá döôùi 
daïng naøy.  

 
HienTLP   PROC  

  PUSH 

 CX 

  PUSH 

 DX 

 

 

 

MOV  

DH,DL      ; DL laø moät kyù töï 

   MOV 

 CX,4 

 SHR 

  

DL,CL 

  

CALL 

 HienChusoTLP 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 46 - 

 

 MOV 

 DL,DH 

  AND 

 

 DL,0FH 

  CALL 

 HienChuSoTLP 

 POP 

 

 DX 

 POP 

 

 CX 

 RET 
HienTLP ENDP 
HienChuSoTLP   PROC  
 PUSH  

DX 

 CMP 

  

DL,10 

 JAE 

 

 ChuSoTLP 

  ADD 

 

 DL,'0' 

JMP    

HienChuSo 

ChuSoTLP: 
 ADD 

 

 DL,'A'-10 

HienChuSo: 
 MOV 

 AL, 

DL 

 CALL 

 HienAscii 

 POP 

DX 

 RET 
HienChuSoTLP ENDP  
 

3. Ñoïc töø baøn phím 

 

a- Ñoïc moät chuoãi kyù töï: 
 
Ñeå ñoïc moät chuoãi kyù töï, chuùng ta goïi ngaét 21h, dòch vuï 0Ah cho 

pheùp ñaët caùc kyù töï goõ treân baøn phím vaøo vuøng ñeäm DS:DX (buffer). 
Haøm naøy keát thuùc khi nhaán RETURN, trong vuøng ñeäm goàm caùc thoâng 
tin sau: 

 
Byte Noäi 

dung 

Giaù trò qui ñònh soá toái ña caùc kyù töï coù theå ñoïc, giaù 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 47 - 

 

trò naøy phaûi ñöôïc ñaët tröôùc khi goïi haøm  

Soá kyù töï thöïc teá ñoïc vaøo (Khoâng tính RETURN), 
giaù trò naøy ñöôïc ñaët khi haøm thöïc hieän. 

Töø vò trí naøy chuùng ta thaáy caùc kyù töï ñoïc vaøo. 

 
Phaûi ñònh nghóa moät vuøng döõ lieäu (vuøng ñeäm) trong chöông trình 

ñeåõ giöõ caùc kyù töï. 

 
DocChuoi PROC 
 PUSH 

BX 

 PUSH 

CX 

 

MOV 

BX,DX  ; 

Offset cuûa vuøng ñeäm 

 

PUSH        [BX];

giöõ 2byteñaàu cuûa vuøngñeäm 

 MOV 

[BX], 

AL 

 

 MOV 

AH, 

0Ah 

 INT 

21h 

 MOV 

AL,[BX+1] 

 POP 

CX 

 MOV 

[BX],CH 

 POP 

CX 

 POP 

BX 

 RET 
DocChuoi ENDP 
 
Neáu chuùng ta taïo ra moät chöông trình nhoû: 
 
.MODEL SMALL 
.STACK 100h 
.DATA 

VungDem  DB  255 DUP (?)  ; Vuøng giöõ kyù töï ñoïc 

Thongbao  DB  'Kyù töï ñoïc ', 13,10, '$' 

.CODE 
Main    

PROC 

MOV  

AX,@Data 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 48 - 

 

MOV DS, 

AX 

MOV 

DX, OFFSET VungDem 

MOV 

AL, 5  ; Ñoïc toái ña 5 kyù töï 

CALL DocChuoi 
MOV AH,0 
CALL HienSoTP 
MOV 

DX, Offset Thongbao 

CALL  

Hienchuoi 

MOV  

AH,4Ch 

INT  

21h 

Main  

ENDP 

 
Hienchuoi PROC 
 PUSH 

 

AX 

 MOV 

 

AH, 

09h 

 INT 

 

21h 

 POP 

 

AX 

 RET 
Hienchuoi ENDP 
.... 
 

END    

MAIN 

 

Baây giôø, chuùng ta thöïc hieän chöông trình, neáu chuùng ta goõ vaøo 

treân 5 kyù töï, ngaét 21h gaây ra 1 tieáng BÍP; chuùng ta coù theå söû duïng 
phím BACKSPACE ñeå xoaù 1 kyù töï trong quaù trình goõù. 

 

b- Ñoïc moät soá thaäp phaân 

 
Ñeå ñoïc moät soá thaäp phaân, chuùng ta seõ söû duïng thuû tuïc 

Docchuoi vaø sau ñoù chuyeån chuoãi thaønh soá. 

 
NB 
Soá        <-- 0 

Laëp Chöõ soá    <-- 1            kyù töï cuûa chuoãi 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 49 - 

 

 

 

Soá           <--  Soá * 10 + chöõ soá 

 

 

NB       <--  NB-1 

 
 

 

Neáu NB > 0   ñeán    Laëp 

 
Ví duï, ñeå chuyeån '827', ta coù 
Soá             <--0 
Chöõ soá  <-- 8 
Soá   

<-- Soá *10 + chöõ soá  = 0*10  +8 = 8 

Chöõ soá  <-- 2 
Soá   

<-- Soá * 10 + chöõ soá = 8*10  +2 = 82 

Chöõ soá  <-- 7 
Soá   

<-- Soá * 10 + chöõ soá = 82*10  +7 = 827 

 
Giatri PROC 
   PUSH  BX 
 PUSH 

 

CX 

 PUSH 

DX 

 PUSH 

SI 

 MOV 

AX,0 

   MOV  BX,DX 

Bx chæ ñeán ñaàu vuøng ñeäm 

 MOV 

CX,[DX+1] 

 MOV 

SI, 

Laplai: 
 MOV 

DX,10 

 MUL 

DX 

 MOV 

DL, 

[BX+SI] 

 INC 

SI 

 SUB 

DL,48 

 MOV 

DH,0 

 ADD 

AX, 

DX 

 LOOP 

Laplai 

 POP 

SI 

 POP 

DX 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 50 - 

 

 POP 

CX 

 POP 

BX 

 RET 
Giatri ENDP 
 
Chuù yù: thuû tuïc treân khoâng kieåm tra xem daõy kyù töï coù trong 

vuøng ñeäm coù ñuùng nhö yeâu caàu khoâng? nghóa laø taát caû ñeàu laø chöõ soá 
coù giaù trò töø 0 ñeán 9. Ngoaøi ra trong thuû tuïc naøy cuõng khoâng giaûi 
quyeát ñöôïc xem giaù trò cuûa soá coù vöôït quaù 65.535: caàn phaûi kieåm 
tra xem pheùp nhaân cuoái cuøng coù taïo ra nhôù khoâng? nghóa laø DX coù 
giaù trò khaùc 0 )  

 
DocSoTP PROC 
   PUSH  DX 
 

 MOV 

 AL, 

 

 MOV 

 DX, 

Offset 

temp1 

   CALL  DocChuoi 
   CALL  Giatri 
 

 POP 

 DX 

   RET 
DocSoTP ENDP 
 

 

 
 
 
 
 
 
 
 
 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 51 - 

 

CHÖÔNG 6:   MOÑUN CHÖÔNG TRÌNH & 

CAÙC KIEÅU ÑÒNH VÒ ÑÒA CHÆ 

 

I. MOÑUN CHÖÔNG TRÌNH 

 
Ñoái vôùi caùc chöông trình lôùn vôùi raát nhieàu thuû tuïc thì thaät tieän 

lôïi neáu chuùng ta ñaët caùc thuû tuïc trong caùc file rieâng bieät. Coù 2 
nguyeân nhaân chuû yeáu ñeå laøm ñieàu ñoù: 

 
. Caùc thuû tuïc coù theå ñöôïc vieát, hôïp dòch vaø kieåm tra rieâng bieät 

baèng caùc laäp trình vieân khaùc nhau 

 
. Khi caùc thuû tuïc ñöôïc hôïp dòch taùch bieät, chuùng coù theå söû duïng 

laïi caùc teân cho caùc bieán hay caùc nhaõn leänh. Sôõ dó coù ñöôïc ñieàu ñoù laø 
vì trình bieân dòch cho pheùp caùc teân mang tính chaát cuïc boä ñoái vôùi 
moãi file vaø noù seõ khoâng xung ñoät ñoái vôùi caùc teân gioáng nhö vaäy 
trong moät file khaùc. 

 

1. Ñònh höôùng bieân dòch extrn   

 
Trong khi bieân dòch moät moñun, trình bieân dòch phaûi ñöôïc 

thoâng baùo nhöõng teân ñöôïc duøng trong moñun hieän thôøi nhöng ñaõ 
khai baùo trong caùc mod8un khaùc, neáu khoâng chuùng seõ bò coi laø caùc 
teân chöa khai baùo. 

 
EXTRN  teân:loaïi [,teân:loaïi] 
 
baùo cho trình dòch hôïp ngöõ coù moät teân ngoaïi truù nghóa laø coù 

moät teân ñaõ ñònh nghóa trong moät moñun khaùc. Loaïi töông öùng phaûi 
gioáng nhö loaïi ñaõ ñònh nghóa trong moñun khaùc. Nhöõng loaïi naøy laø: 
NEAR, FAR, PROC, BYTE, WORD... 

 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 52 - 

 

 

2. Ñònh höôùng bieân dòch public 

 
Moät thuû tuïc hay bieán phaûi ñöôïc khai baùo vôùi ñònh höôùng bieân 

dòch PUBLIC neáu noù ñöôïc söû duïng trong caùc moñun khaùc nhau 

 
PUBLIC teân[, teân] 
 
ÔÛ ñaây 'teân' laø moät bieán, moät nhaõn trong moñun giöõ ñònh höôùng 

bieân dòch PUBLIC 

 
ÖÙng duïngï: 
   
Taïo moät chöông trình goàm 2 thuû tuïc ñeå noái chuoãi, moãi thuû tuïc 

naèm trong 1 taäp  tin khaùc nhau. 

 
 
Taäp tin thöù 1 coù teân MAIN.ASM 
Noäi dung laø 

   

   EXTRN     NoiChuoi:NEAR 
      public ChuoiCuoi 
     .MODEL    SMALL 
     .STACK    200H 
     .DATA 
Chuoi1        DB   'Chao ',0 
Chuoi2        DB   'cac ban ',0dh,0ah,'$',0 
Chuoicuoi   DB   50 DUP (?) 
 
 
     .CODE 
ProgramStart PROC 
     mov  ax,@data 
     mov  ds,ax 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 53 - 

 

     mov  ax,OFFSET Chuoi1 
     mov  bx,OFFSET Chuoi2 
     call NoiChuoi    

 

;  Noái 2 chuoãi laïi vôùi nhau 

     mov  ah,9 
     mov  dx,OFFSET ChuoiCuoi 
     int  21h        

 

 

; Hieän chuoãi 

     mov  ah,4ch 
     int  21h       
ProgramStart ENDP 

     END  ProgramStart 
 

 
Taäp tin thöù 2 coù teân SUB.ASM coù noäi dung laø 
 
EXTRN ChuoiCuoi:byte 
PUBLIC    NoiChuoi 
.MODEL    SMALL 
.CODE 
NoiChuoi  PROC 
     cld                         ;   Chuoãi taêng daàn 
     mov  di,SEG ChuoiCuoi 
     mov  es,di 
     mov  di,OFFSET ChuoiCuoi     ;ES:DI chæ ñeán ñích 
     mov  si,ax                  ; Chuoãi ñaàu ñöôïc cheùp ñi 
LapChuoi1: 
     lodsb                           ; nhaän trong chuoãi 1 kyù töï 
     and  al,al                    ; baèng  0? 
     jz   Chuoitiep              ;ñuùng thì chuyeån sang chuoåi tieáp 
     stosb                            ; löu 1 kyù töï vaøo chuoãi 
     jmp  LapChuoi1 
Chuoitiep: 
     mov  si,bx                  ; Cheùp chuoãi thöù hai 
LapChuoi2: 
     lodsb                          ;  laáy 1 kyù töï töø chuoãi 2  

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 54 - 

 

     stosb                           ;  giöõ kyù töï cuûa chuoãi 2 vaøo  
                                         ; (keå caû soá 0 neáu coù) 
     and  al,al                    ;   baèng  0? 
     jnz  LapChuoi2          ; khoâng, naïp kyù töï khaùc 
     ret                               ; xong 
NoiChuoi   ENDP 

     END 

 

3.  Laäp thö vieän - taïo vó leänh (macro) 

 

Thay vì lieân keát caùc moñun ñoái töôïng rieâng bieät ñeå taïo thaønh 

moät file .EXE , chuùng ta coù theå taïo ra moät file thö vieän cuûa caùc 
moñun ñoái töôïng chöùa thuû tuïc. Khi thö vieän ñöôïc xaùc ñònh trong 
quaù trình lieân keát, chöông trình LINK laáy ra baát kyø thuû tuïc naøo maø 
chöông trình caàn thö vieän vaø taïo ra file EXE.  

 
Chuùng ta coù daïng 
 
Teân    MACRO  {thoâng soá [ ,thoâng soá] } 
 
   Leänh 
 
   ENDM 
 
Taïo taäp tin vaên baûn ASCII laø thö vieän 
 
Ví duï
 
 THUVIEN.MAC 
 
Thoat MACRO 
 

 MOV 

 AH,4Ch 

 

 INT 

 21h 

   ENDM 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 55 - 

 

HienCh MACRO  Chuoi1 
 

 MOV 

 AH,9 

 

 LEA 

 DX, 

Chuoi1 

 

 INT 

 21h 

   ENDM 
Dockt MACRO  
 

 MOV 

 AH,1 

 

 INT 

 21h 

   ENDM 
HienKt MACRO 
 

 MOV 

 AH,2 

 

 INT 

 21H 

   ENDM 
 
ÖÙng duïng: Hieän soá nhò phaân 
 
EXTRN HienSoNP: NEAR 
.MODEL SMALL 
.STACK 100H 
.DATA 
 

Thongbao1  DB  'Nhaäp vaøo moät kyù töï: $' 

 

Thongbao2  DB  'Maõ ASCII soá nhò phaân: $' 

.CODE 
INCLUDE THUVIEN.MAC 
Batdau PROC 
 

 MOV 

 AX, 

@Data 

 

 MOV 

 DS, 

AX 

   HienCh  Thongbao1 
   DocKt 
   HienCh  Thongbao2 
 

 Call 

 HienSoNP 

   Thoat 
Batdau ENDP 
   END 

Batdau 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 56 - 

 

 

 

II. CAÙC KIEÅU ÑÒNH VÒ ÑÒA CHÆ 

 

Chuùng ta ñaõ bieát, moãi leänh ñeàu coù 2 phaàn chính: 
 
Phaàn pheùp toaùn thöïc hieän (coäng, tröø, dòch chuyeån,...) 
Phaàn döõ lieäu lieân quan. Caùc döõ lieäu naøy naèm trong caùc thanh 

ghi hoaëc trong boä nhôù.  

 
Ñeå laáy döõ lieäu trong boä nhôù, boä vi xöû lyù phaûi bieát ñòa chæ vaø soá 

byte duøng cho noù. 

 
Sau ñaây laø caùc loaïi ñònh vò ñòa chæ khaùc nhau: 
 
1. Kieåu ñònh vò ñòa chæ töùc thôøi 
 
 

Thanh ghi  <--- Giaù trò töùc thôøi 

 
Moät giaù trò töùc thôøi (coù theå laø moät haèng) seõ ñöa vaøo noäi dung 

cuûa thanh ghi  

 
Ví duï:     MOV  AH,12 
 
1-  Kieåu ñònh vò ñòa chæ tröïc tieáp: 
 

Thanh ghi   <-- boä nhôù(ñòa chæ tröïc tieáp) 
 

Noäi dung cuûa moät vuøng nhôù ñöôïc ñaët teân seõ ghi vaøo trong 

thanh ghi 8 bit hoaëc 16 bit phuï thuoäc vaøo loaïi döõ lieäu vaø kích thöôùc 
thanh ghi, neáu 2 yeáu toá naøy khoâng baèng nhau thì trình dòch hôïp ngöõ 
seõ baùo loãi.  

 
Ví duï: 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 57 - 

 

 
 

Id1  DB  2         ; 1 byte 

 

Id2  DW  5 

; 1 word = 2 byte 

 ...... 
 MOV 

  AH,Id1 

 MOV 

  BX,Id2 

 
3. Kieåu ñònh vò ñòa chæ neàn: 
 
 

Thanh ghi  <--  [BX]  ñòa chæ neàn döïa treân DS 

 
Laáy noäi dung trong vuøng boä nhôù ñòa chæ DS:[BX] ñöa vaøo 

trong thanh ghi. Trong tröôøng hôïp naøy [BX] cho bieát laø laáy noäi dung 
cuûa oâ nhôù coù phaàn offset cuûa ñòa chæ laø . Coù theå thöïc hieän vôùi 8 hoaëc 
16 bit. 

 
Ví 

duï: 

 MOV 

 BX,8 

 

  MOV 

 AX, 

[BX] 

 

 
AX <-- noäi dung cuûa vuøng nhôù coù ñòa chæ laø DS:0008 
 
4. Kieåu ñònh vò ñòa chæ chæ soáù: 
 
 

Thanh ghi  <--  [SI]   hoaëc   [DI]   ñòa chæ chæ soá 

 
Kieåu ñònh vò ñòa chæ naøy thöôøng duøng cho chuoãi kyù töï  hay caùc 

phaàn töû cuûa maõng. Thöôøng neàn laø  DS. 

 
Ví 

duï: 

 MOV 

 SI, 

 

  MOV 

 AX, 

[SI] 

 
AX  <-- noäi dung cuûa vuøng boä nhôù ôû ñòa chæ  DS:0 
 

 

 

5- Kieåu ñònh vò ñòa chæ neàn-chæ soá: 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 58 - 

 

 
  Thanh ghi  <--  [BX][SI] ñòa chæ  neàn-chæ soá döïa treân 

DS 

 

Thanh ghi  <--    [BX][DI] ñòa chæ neàn-chæ soá döïa treân  DS 

 
Loaïi ñòa chæ naøy söû duïng BX vaø, SI hoaëc DI, neàn laø DS 
 
Ghi chuù: ngöôøi ta coù theå duøng qui öôùc sau: 
 Thanh 

ghi 

<-- [BX+SI] 

 
Ví 

duï: 

 MOV 

 BX, 

 

  MOV 

 SI, 

 

  MOV 

 AH, 

[BX] 

[SI] 

 
AH <-- noäi dung cuûa oâ nhôù coù ñòa chæ laø DS:7 nghóa laø DS:5+2 
 
6- Kieåu ñònh vò ñòa chæ neàn-dòch chuyeån: 
 
 

Thanh ghi  <-- döõ lieäu[BX] ñòa chæ neàn döïa treân DS 

 

Thanh ghi  <-- döõ lieäu[BX] ñòa chæ neàn döïa treân SS 

 
Loaïi ñònh vò ñòa chæ naøy laø toå hôïp cuûa caùc loaïi treân. 
 
Ghi chuù: Coù theå söû duïng qui öôùc sau: 
 
 

 

Thanh ghi  <-- [BX+döõ lieäu] 

 
Ví duï: 

  Id1 

DW 

DUP 

(?) 

 

  .... 

 
 

  MOV 

 BX,2 

  MOV 

 AX, 

Id1[BX] 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 59 - 

 

AX  <-- phaàn töû thöù 3 cuûa maûng  Id1 

 
7. Ñònh vò ñòa chæ chæ soá-dòch chuyeån: 
 
 

Thanh ghi  <--  döõ lieäu[SI] 

 

Thanh ghi  <--  döõ lieäu[DI] 

 
Loaïi ñònh vò naøy laø toå hôïp cuûa caùc loaïi treân. 
 
Ghi chuù: Chuùng ta coù theå söû duïng qui öôùc sau: 
 
 

Thanh ghi  <-- [SI+döõ lieäu] 

 
Ví 

duï: 

  ..... 

 

 MOV 

 SI,4 

 

 

 MOV 

 AX, 

[SI+1] 

 
AX  <-- noäi dung cuûa vuøng nhôù taïi ñòa chæ  DS:4+1 
8- Kieåu ñònh vò ñòa chæ neàn-chæ soá-dòch chuyeån 
 
 

Thanh ghi  <--  döõ lieäu[BX][SI] 

 

Thanh ghi  <--  döõ lieäu[BX][DI] 

 

Thanh ghi  <--  döõ lieäu[BP][SI] 

 

Thanh ghi  <--  döõ lieäu[BP][DI] 

 
Loaïi ñònh vò naøy laø toå hôïp cuûa caùc loaïi treân. 
 
Ghi chuù: Coù theå söû duïng kyù hieäu sau: 
 
 

 

Thanh ghi  <--  [BX+SI+döõ lieäu] 

 
Ví duï: 

 

Id1  DB  15 DUP(?) 

 

  ..... 

 

  MOV 

 BX,5 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 60 - 

 

 

  MOV 

 SI,4 

 

  MOV 

 AX, 

Id1[BX][SI] 

AX  <-- phaàn töû thöù 9 cuûa maûng Id1 

III. CHÖÔNG TRÌNH ÖÙNG DUÏNG 

TAÄP TIN - THÖ MUÏC 

Chuùng ta tham khaûo moät soá thuû tuïc lieân quan ñeán caùc taäp tin 

baèng caùc goïi ngaét 21h: 

Taïo moät taäp tin; 
Môû moät taäp tin; 
Ñoùng moät taäp tin; 
Ñoïc moät taäp tin; 
Vieát vaøo moät taäp tin.... 
 
a - Caàn bieát: 
. Moät soá thuû tuïc söû duïng moät töø ñeå maõ hoaù thuoäc tính cuûa taäp 

tin. Caùc bit cuûa töø naøy coù yù nghóa nhö sau: 

 Bit 

YÙ 

nghóa 

 0 

Chæ 

ñoïc 

 1 

AÅn 

 2 

Heä 

thoáng 

Löu 

. Moät soá thuû tuïc söû duïng theû (handle), ñoù laø moät soá do heä ñieàu 

haønh MSDOS gaùn cho moät taäp tin khi môû hoaëc taïo taäp tin, con soá 
naøy seõ caàn thieát trong quaù trình ñoïc, vieát, ñoùng .v.v... taäp tin. 

 
 

Handle    DW  ? 

 
Chuù yù: neáu moät chöông trình xöû lyù nhieàu taäp tin thì phaûi coù 

nhieàu theû, moãi theû öùng vôùi moãi taäp tin. 

 

b - Taïo, môû, ñoùng taäp tin ñeå coù theå ghi noâi dung vaøo taäp tin. 

.MODEL SMALL 
.STACK 100H 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 61 - 

 

.DATA 
     TBAO1       DB 'Ñöa noâi dung vaên baûn vaøo:  ',13,10,'$'         

NOIDUNG  DB 10000 DUP(?) 

     TENTT       DB 'A:\THUCTAP.TXT',0 
     SO   

DW  ? 

     LFCR DB  13,10,'$' 

 

.CODE 
INCLUDE THUVIEN.MAC 
MAIN PROC 
            PRODATA 
  

HIENCH 

TBAO1 

 

XOR   

BX,BX 

    

MOV 

AH,1 ; 

LAP1: 

 INT 

21H 

     

CMP 

AL,1AH  ; CTRL+Z 

 JE 

CONT 

 MOV  NOIDUNG[BX],AL 
 CMP  AL,13 

ENTER 

 JNE 

NHAY1 

 MOV  NOIDUNG[BX],0Dh 
 INC 

BX 

            MOV 

NOIDUNG[BX],0Ah 

 LEA  DX,LFCR 
 MOV  AH,9 
 INT 

21H 

 MOV  AH,1 
NHAY1: 
 INC 

BX 

 JMP  LAP1 
TIEP: MOV 

SO,BX 

 

MOV 

AH,3CH   ; 

 

LEA 

DX,TENTT   ; TAO MOT TAP TIN 

 

MOV 

CX,20H   ;    THUOÄC TI'NH 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 62 - 

 

 

INT  

21H      ; 

 MOV  BX,AX 
 

LEA 

DX,TENTT   ; 

 

MOV 

AL,1     ; 

 

MOV  

AH,3DH   ; MÔÛ TAÄP TIN 

 

INT 

21H      ; 

 PUSH  AX 

GHI THEÛ ÑEÅ SÖÛ DUÏNG SAU NAØY 

 MOV 

  BX,AX 

 

MOV 

AH,40H    ; GHI VAØO TAÄP TIN 

 

LEA 

DX,NOIDUNG;     ÑEÄM 

 

MOV 

CX,SO    ;SOÁ BYTE ÑOÏC

 

 

INT 

21H       ; 

 

POP 

BX        ; 

 

MOV 

AH,3EH   ;ÑOÙNG TAÄP TIN 

 INT 

21H 

 THOAT 
MAIN ENDP 
END MAIN 
 

c- Ñoïc noäi dung taäp tin 

 

EXTRN WRITE_HEX:NEAR 
.MODEL SMALL 
.STACK 100H 
.DATA 
     NOIDUNG   

DB 10000 DUP(?) 

     TENTT    

DB 50 DUP (?) 

     CAUHOI    

DB 'NHAP DUONG DAÃN: ' 

     LFCR 

 

DB  10,13,'$' 

 

.CODE 
INCLUDE THUVIEN.MAC 
MAIN PROC 
    PRODATA 
 HIENCH 

 CAUHOI 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 63 - 

 

 XOR 

 

BX,BX 

 MOV 

 

AH,1 

LAP1: 
 INT  

21H 

 MOV 

 

TENTT[BX],AL 

 INC  

BX 

 CMP 

 

AL,13 

 JNE  

  LAP1 

 DEC  

BX 

  MOV      

TENTT[BX],'0' 

 HIENCH  LFCR 
 LEA  

DX,TENTT 

  MOV  

AL,2      

  MOV  

AH,3DH   ;  THEÛ 

  INT   

21H      ; 

  PUSH 

AX       ;   LÖU THEÛ 

  MOV  

BX,AX 

;  DÒCH VUÏ 3F : BX <-- THEÛ 

  MOV  

AH,3FH    ;    ÑOÏC TAÄP TIN 

 LEA  

DX,NOIDUNG; 

  MOV  

CX,0FFFFH    ; SO BYTE 

  INT   

21H       ; 

    POP      

BX 

  PUSH 

AX        ; 

 CALL 

DONG 

    XOR      

BX,BX 

    POP     

 CX   

TIEP1: 
 MOV 

 

DL,NOIDUNG[BX] 

    CALL     

HIENSOTLP 

  CALL      TRONG 

 INC 

 

BX 

 LOOP      TIEP1 
THOAT 

MAIN ENDP 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 64 - 

 

DONG PROC 
 MOV 

 

AH,3Eh 

 INT  

21h 

 RET 
DONG ENDP 

TRONG PROC 
 PUSH DX 
 PUSH AX 
 MOV 

 DL,' 

 MOV 

 AH,2 

 INT 

 21H 

 POP 

 AX 

 POP 

 DX 

 RET 
TRONG   ENDP 

 

END  MAIN 

 

 

 

d-ÑOÅI TEÂN, XOAÙ TAÄP TIN 

 

Ñoåi teân taäp tin: Haøm 56h - Ngaét 21h 
Xoaù taäp tin: Haøm 41h - Ngaét 21h 

 

  .MODEL SMALL 
  .STACK 100H 

.DATA 
          VUNGDEM    DB 20 
          LOAI               DB ? 
          TENTT            DB 50 DUP (0),0,'$' 
        DUONG 

DB 

'[A:] <DUONG> TEN TAP TIN[.EXT] $' 

          LOI 

 

DB 

'KHOÂNG THEÅ XOAÙ TAÄP TIN NAØY$' 

.CODE 
  INCLUDE THUVIEN.MAC 
 
  MAIN   PROC  

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 65 - 

 

          PRODATA 
    

HIENCH   DUONG 

 MOV 

 AH,0Ah 

 

 LEA 

 

 DX,VUNGDEM 

 INT 

  

21h 

 XOR 

 

 BX,BX 

 

 MOV 

  

BL,LOAI 

 ADD 

 

 BX,OFFSET 

TENTT 

   

MOV  

BYTE PTR [BX],0 

 LEA 

 

 DX,TENTT 

 MOV 

 AH,41h 

 

 INT 

 

 21h 

 JNC 

 

 RA 

 

HIENCH   LOI 

RA: THOAT 
MAIN ENDP 
END  MAIN 
         

e- THAY ÑOÅI THUOÄC TÍNH - CHEÙP TAÄP TIN: 
 

THAY ÑOÅI THUOÄC TÍNH TAÄP TIN:   Haøm 43h - Ngaét 21h 
 
CHEÙP TAÄP TIN 

.MODEL SMALL 
.DATA 
        BUFFER  DB 14 
 TYPE1 DB 

 

FILE1  

DB 12 DUP(00),0 

 

FILE2  

DB 8 DUP(00),".TXT",0 

  

HANDLE1 DW 

 

HANDLE2  DW 0 

   

THONGBAO DB 'VAO TEN PHAI COPY : $' 

          DATA1 

 DB 10000 DUP(?) 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 66 - 

 

.STACK  100H 
.CODE 
 INCLUDE THUVIEN.MAC 
 MAIN   PROC 

     

PRODATA 

  

HIENCH   

THONGBAO 

    

MOV  

AH,0AH 

 LEA 

 

 DX,BUFFER 

 INT 

 

 21H 

 

 MOV 

 [FILE1+12],0 

 MOV 

 CX,08 

 

 LEA 

 

 SI,FILE1 

 

 MOV 

 DI, 

SEG 

 

FILE2 

 

 MOV 

 ES, 

DI 

 LEA 

 

 DI,FILE2 

 REP 

 

 MOVSB 

 

 LEA 

 

 DX,FILE1 

 MOV 

 AX,3D02H 

 

 INT 

 

 21H 

 MOV 

 HANDLE1,AX 

   

MOV  

DX,OFFSET FILE2 

 MOV 

 AH,3CH 

 MOV 

 CX,0 

 INT 

 

 21H 

 MOV 

 HANDLE2,AX 

MOV  

AH,3FH 

 MOV 

 CX,10000 

 

MOV  

DX,OFFSET DATA1 

 MOV 

 BX,HANDLE1 

 

 INT 

  

21H 

 MOV 

  

CX,AX 

 MOV 

 AH,40H 

 MOV 

 BX,HANDLE2 

 INT 

 

 21H 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 67 - 

 

 MOV 

 AH,3EH 

 MOV 

 BX,HANDLE1 

 INT 

 21H 

 MOV 

 BX,HANDLE2 

 INT 

 

 21H 

 THOAT 

MAIN ENDP 
  

END 

MAIN 

f. CAÙC THÖ MUÏC: 
Dòch vuï 39h cuûa ngaét 21h söû duïng ñeå taïo thö muïc môùi 

(MKDIR) 

Dòch vuï 3Ah cuûa ngaét 21h söû duïng ñeå xoaù thö muïc (RMDIR) 
Dòch vuï 3Bh cuûa ngaét 21h söû duïng ñeå chuyeån thö muïc 

(CHDIR) 

IV. TAÏO TAÄP TIN .COM 

 

Nhöõng chöông trình trong ñoù döõ lieäu vaø leänh ñeàu naèm trong 

cuøng moät phaân ñoaïn ñeàu laø nhöõng chöông trình COM. Ñieàu naøy coù 
nghóa laø dung löôïng cuûa chöông trình coù giôùi haïn laø 64KByte. Ngay 
töø khi thöïc hieän chöông trình loaïi naøy, MSDOS ñöa vaøo boä nhôù 
toaøn boä taäp tin naøy vaø ñaët giaù trò ban ñaàu cho caùc thanh ghi CS, DS, 
SS, ES nhö nhau. Thanh ghi SP (Stack Pointer) ñöôïc ñaët laø FFFEh. 
Thanh ghi IP ñöôïc ñaët laøø 0100h vì moãi chöông trình ñaët ôû ñaàu boä 
nhôù moät vuøng100h byte (PSP), ñieàu naøy giaûi thích vì sao leänh thöù 
nhaát cuûa chöông trình (ñieåm vaøo) phaûi ñaët ôû ñaàu cuûa chöông trình 
vaø chuùng ta phaûi söû duïng ñònh höôùng bieân dòch ORG 100h. Vì vaäy 
chuùng ta coù hình aûnh cuûa boä nhôù nhö sau: 

 

Offset PSP 

 

100h JMP 

Batdau 

 

 

Döõ lieäu 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 68 - 

 

 

IP  ---> 

Batdau: 
 
 
 

SP=FFFE Ngaên 

xeáp 

 

1- Daïng cuûa moät chöông trình COM 

 
.MODEL SMALL 
.CODE 
 ORG 

100h 

BATDAU: 
   JMP 

CHINH 

; Ñaët döõ lieäu ôû ñaây 
CHINH PROC 
; Caùc leänh 
 

 MOV 

 AH,4Ch 

 

 INT 

 21h 

CHINH ENDP 
; Caùc thuû tuïc khaùc 
END  

BATDAU 

 
Ví duï: 
 
 Taäp tin     KIEMTRA.ASM 
 
.MODEL SMALL 
.CODE 
 ORG 

100h 

BATDAU: 
   JMP 

CHINH 

TBAO      DB     'Chao cac ban! $' 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 69 - 

 

CHINH PROC 
 

 LEA 

 DX,TBAO 

 

 MOV 

 AH,09 

 

 INT 

 21h 

 

 MOV 

 AH,4Ch 

 

 INT 

 21h 

CHINH ENDP 
END  

BATDAU 

 

 

 

Hôïp dòch chöông trình naøy: 

 
 

 

MASM    KIEMTRA; 

 

 

LINK       KIEMTRA; 

 

Ñeå chuyeån taäp tin  EXE sang COM söû duïng EXE2BIN   

 

 

EXE2BIN    KIEMTRA   KIEMTRA.COM 

2- Öùng duïng taäp tin .com 

 

a- ÖÙng duïng 1: 
 Xem soá ñóa cöùng, soá ñaàu töø, soá töø truï, soá cung treân raõnh 
 

.MODEL SMALL 
.CODE 
       ORG   

100h 

BATDAU: 
 

JMP    DIACUNG 
 
SODIA 

  

DB   10,13,'Soá ñóa cöùng: $' 

 

SODAU 

 

DB   10,13,'Soá ñaàu töø    : $' 

 

SOTUTRU   

DB  10,13,'Soá töø truï       : $' 

 

SOCUNG   

DB  10,13,'Soá cung         : $' 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 70 - 

 

DIACUNG PROC 

 MOV 

  AH,8 

 MOV 

  DL,80H 

 INT 

  13H 

 PUSH  CX  
 PUSH  CX 
 PUSH  DX 
 PUSH  DX 
 LEA 

  DX,SODIA 

 CALL  HIENCHUOI 
 POP 

  DX 

 AND 

  DX,00FFH 

 CALL  HIENSOTP 
 LEA 

  DX,SODAU 

 CALL  HIENCHUOI 
 POP 

  DX 

 AND 

  DX,0FF00H 

 MOV 

  DL,DH 

 MOV 

  DH,00 

 ADD 

  DL,1 

 CALL 

  HIENSOTP 

 LEA 

  DX,SOTUTRU 

 CALL  HIENCHUOI 
 POP 

  CX 

 AND 

  CX,1111111111000000B 

 XCHG  CH,CL 
 MOV 

  DX,CX 

 MOV 

  CX,2 

 ROL 

  DH,CL 

       ADD      

DL,2 

 CALL 

  HIENSOTP 

 LEA 

  DX,SOCUNG 

       CALL      HIENCHUOI 
 POP 

  CX 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 71 - 

 

 AND 

  CX,0000000000111111B 

 MOV 

  DX,CX 

 CALL 

  HIENSOTP 

 MOV 

  AH,4CH 

 INT 

  21H 

DIACUNG ENDP 
; Nhöõng thuû tuïc khaùc 
 
 END 

BATDAU 

 
 

b - ÖÙng duïng 2: Ñoïc noäi dung cuûa moät cung 

 

DOS baét ñaàu ñoïc töø cung 1, töø truï 0, maët 1 goïi laø cung 0 
moãi raõnh coù 17 cung 
* Moãi taäp tin chieám nhieàu nhoùm cung do vaäy phaûi coù moät baûng 
quaûn lyù taäp tin  -> FAT File Allocation Table coù 16 BIT  -> 
2

16

=65536 nhoùm cung 

 
* Vôùi ñóa meàm: 
Maët 0, raõnh 0, cung 1       -> löu phaàn khôûi ñoäng  DOS BOOT 
RECORD  (DBR) 
 
* Vôùi ñóa cöùng: 
Baét ñaàu laø phaàn  MASTER BOOT RECORD   (MBR)   
PARTITION 
sau ñoù maët 1, raõnh 0, cung 1   -> löu phaàn khôûi ñoäng DOS BOOT 
RECORD  (DBR) 
 
Taäp tin DIACUNG.ASM 
 
.MODEL SMALL 
.CODE 
  

ORG 

100h 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 72 - 

 

BATDAU:  
  

JMP 

 DOCCUNG 

  VUNGDEM 

DB  512 DUP (?) 

 

   DB 

'$' 

  THONGBAO 

DB  'Ñoïc toát ',13,10,'$' 

  BAOLOI   

DB  'Khoâng theå ñoïc',13,10,'$' 

 TRONG   

DB ' 

$' 

  GACH 

 

DB  ' - $' 

  DEM  

 

DW      ? 

 

CHU 

  DW 

 HANG   

DW ? 

 

LFCR 

  DB 

13,10,'$' 

 
DOCCUNG PROC 
 MOV 

 

DS,AX 

 XOR 

 

AX,AX 

 MOV 

 

AH,2 

  MOV  

AL,1   ; 1 Cung 

  MOV  

DL,1   ; Ñóa meàm B 

  MOV  

DH,1   ; Ñaàu töø 1 

  MOV  

CH,0   ; raõnh 0 

  MOV  

CL,9  ; cung 9 

 LEA  

BX,VUNGDEM 

 INT  

13H 

 JNC  

TOT 

 LEA  

DX,BAOLOI 

   MOV  

AH,9 

 INT 

  

21H 

 JMP  

RA 

TOT: 
 LEA 

 

 

DX,THONGBAO 

   MOV  

AH,9 

 INT 

  

21H 

RA: 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 73 - 

 

 MOV 

 

CX,300 

 MOV 

 

DEM,0 

 MOV 

 

CHU,0 

 MOV 

 

HANG,0 

LAP9: 
 MOV 

 

BX,DEM 

  MOV  

DX,WORD PTR VUNGDEM[BX] 

 CALL 

HIENSOTLP 

 LEA  

DX,TRONG 

 CALL 

HIENCHUOI 

 INC  

DEM 

 INC  

CHU 

 INC  

HANG 

 CMP 

 

CHU,10 

 JNE  

TIEP1 

 MOV 

 

CHU,0 

     CMP   

HANG,10 

 JA   

TIEP1 

 LEA  

DX,GACH 

 CALL 

HIENCHUOI 

TIEP1: 
 CMP 

 

HANG,20 

 JNE  

TIEP2 

 MOV 

 

HANG,0 

 LEA  

DX,LFCR 

 CALL 

HIENCHUOI 

TIEP2: 
 LOOP 

  LAP9 

 CALL 

THOAT 

DOCCUNG ENDP 
 
; Caùc thuû tuïc khaùc 
 
END BATDAU 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 74 - 

 

 
 
c - Öùng duïng 3: 
 

Ghi  1 cung 

 
.MODEL SMALL 
.CODE 

ORG     100h 

BATDAU: 
   

 

JMP     GHICUNG 

 
    VUNGDEM  

DB  512 DUP (00) 

 

   DB 

'$' 

  THONGBAO 

DB  13,10,'Ñoïc toát ',13,10,'$' 

  BAOLOI   

DB  13,10,'Khoâng theå ñoïc ',13,10,'$' 

  NHAP 

 

DB  'Goõ vaøo baøn phím :' 

 

LFCR 

  DB 

13,10,'$' 

  DEM  

 

DW      ? 

 
GHICUNG PROC 

 LEA 

  DX,NHAP 

 CALL  HIENCHUOI 
 MOV 

  DEM,0 

 MOV 

  AH,1 

LAP9: 
 INT 

  21H 

 

CMP   

AL,1AH  ; CTRL+Z 

 JE   TIEP1 
 MOV 

  BX,DEM 

 MOV 

  VUNGDEM[BX],AL 

 INC 

  DEM 

 

 JNE 

  LAP9 

TIEP1: 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 75 - 

 

 XOR 

  AX,AX 

 MOV 

  AH,3 

 

MOV  

AL,1   ; 1 Cung 

 

MOV  

DL,1   ; Ñóa meàm B 

 

MOV  

DH,1   ; Ñaàu töø 1 

 

MOV  

CH,0   ; Raõnh 0 

 

MOV  

CL,9  ; Cung 9 

 LEA 

  BX,VUNGDEM 

 INT 

  13H 

 JNC 

  TOT 

 LEA 

  DX,BAOLOI 

       CALL 

HIENCHUOI 

 JMP 

  THOATRA 

TOT: 
 LEA 

 

  DX,THONGBAO 

 CALL  HIENCHUOI 
THOATRA: 
 CALL  THOAT 

GHICUNG ENDP 
 
;Caùc thuû tuïc khaùc 
 

END   BATDAU 

 
 
 
 
 
 
 

 
 
 
 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 76 - 

 

CHÖÔNG 7: SÖÛ DUÏNG  PHAÂN ÑOAÏN TOAØN PHAÀN 

 

Phöông phaùp ñònh nghóa phaân ñoaïn ñôn giaûn hoaù maø chuùng ta vaãn 

thöôøng söû duïng töø tröôùc ñeán nay ñaõ aùp duïng ñöôïc haàu heát caùc muïc tieâu. 
Trong phaàn naøy chuùng ta xem xeùt caùch ñònh nghóa phaân ñoaïn toøn phaàn. Döôùi 
ñaây laø nguyeân nhaân chính ñeå söû duïng phöông phaùp naøy: 

 
. Vôùi caùc trình bieân dòch phieân baûn 5.0 trôû veà tröôùc chuùng ta chæ coù theå 

söû duïng phöông phaùp ñònh nghóa phaân ñoaïn toaøn phaàn. 

 
. Vôùi phöông phaùp ñònh nghóa phaân ñoaïn toaøn phaàn, laäp trình vieân coù 

theå ñieàu khieån ñöôïc thöù töï caùc phaân ñoaïn , vieäc keát hôïp chuùng vôùi nhau vaø söï 
lieân keát giöõa chuùng trong boä nhôù 

 

I- SÖÛ DUÏNG CAÙC ÑÒNH HÖÔÙNG BIEÂN DÒCH  

1. Segment 

 

Teân  SEGMENT  lieân keát  keát hôïp   'lôùp' 
;  

Teân ENDS 
 

Ví duï: 
D_SEG SEGMENT 
 
; caùc döõ lieäu 
 
D_SEG ENDS 
 

a - Loaïi  lieân keát (align): 
 

PARA 

Phaân ñoaïn baét ñaàu töø phaân ñoaïn tröôùc ñoù. 

BYTE   Phaân ñoaïn baét ñaàu töø byte tröôùc ñoù. 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 77 - 

 

WORD   Phaân ñoaïn baét ñaàu töø töø tröôùc ñoù. 
PAGE       Phaân ñoaïn baét ñaàu töø trang tröôùc ñoù. 

 
 

 

 

Maëc ñònh ngöôøi ta söû duïng loaïi PARA 

 
 

 

 

Ví duï: 

 
   SEG1 

 SEGMENT 

 PARA 

   DB 

 11h 

 

DUP 

(1) 

   

 

 

 

 

SEG1  

ENDS 

 
   SEG2 

 SEGMENT 

 PARA 

   DB 

 10H 

DUP 

(2) 

 

   SEG2 

 ENDS 

 

1010:0000    01 

01 

01 

01 

01 

01  -  01 

01 

01 

01 

01 

1010:0010 01 00 00 00 00 00 

 

 

00  00 00 00 00 

 

1010:0020 02 02 02 02 02 02 

 

 

02  02 02 02 02 

 
 

  SEG1 

 SEGMENT 

 PARA 

   DB 

 11h 

 

DUP 

(1) 

   

 

 

 

 

SEG1  

ENDS 

   SEG2 

 SEGMENT 

 BYTE 

   DB 

 10H 

DUP 

(2) 

 

   SEG2 

 ENDS 

 

1010:0000 01 01 01 01 01 01 

 

 

01  01 01 01 01 

1010:0010 01 02 02 02 02 02 

 

 

02  02 02 02 02 

1010:0020 02 00 00 00 00 00 

 

 

00  00 00 00 00 

 
 

 

b - Loaïi keát hôïp (combine): 

 

 

 

PUBLIC:Nhöõng phaân ñoaïn coù cuøng teân ñeàu gom laïi trong cuøng moät 

khoái nhôù keá tieáp nhau vaø thoáng nhaát. 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 78 - 

 

COMMON: Nhöõng phaân ñoaïn coù cuøng teân seõ gom laïi taïi moät vò trí 

boä nhôù vaø xeáp choàng leân nhau. 

 
STACK:  Taùc duïng gaàn nhö  PUBLIC ngoaïi tröø taát caû caùc ñòa chæ 

nhaûy böôùc (offset) cuûa caùc leänh vaø caùc döõ lieäu ñöôïc tính 
töông ñoái so vôùi thanh ghi SS.  SP ñöôïc ñaët ban ñaàu troû 
ñeán cuoái phaân ñoaïn. 

 
AT paragraph: Phaân ñoaïn ñöôïc baét ñaàu töø moät phaân ñoaïn xaùc ñònh 
 
Thöôøng ngöôøi ta söû duïng loaïi PUBLIC ñeå gom caùc phaân ñoaïn maõ 
coù cuøng teân trong nhöõng moñun khaùc nhau ñeå taïo ra moät phaân ñoaïn 
duy nhaát. Ñieàu naøy cuõng coù nghóa laø chuùng ta coù nhöõng thuû tuïc  
NEAR trong chöông trình.   
 
  c - Loaïi lôùp (class): 
 
Loaïi lôùp chuùng ta ñònh nghóa chæ ra thöù töï vò trí cuûa caùc phaân ñoaïn 
trong boä nhôù. Chuùng ta caàn ñaët loaïi naøy vaøo trong daáu nhaùy ( ' ). 
 

Ví duï:  

 
Neáu chuùng ta ñònh nghóa THUNHAT.ASM: 
 
C_SEG SEGMENT  

'CODE' 

; thuû tuïc chính 
C_SEG ENDS 
 
Vaø trong THUHAI.ASM 
 
C1_SEG 

 SEGMENT 

 'CODE' 

; caùc thuû tuïc khaùc 
C1_SEG  

ENDS 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 79 - 

 

 
Sau khi thöïc hieän leänh 
 
         LINK    THUNHAT+THUHAI 
C1_SEG seõ naèm sau C_SEG trong boä nhôù. 
 

2. Ñònh höôùng bieân dòch assume 

 

Khi moät chöông trình ñöôïc hôïp dòch, trình hôïp dòch phaûi bieát phaân 

ñoaïn naøo laø phaân ñoaïn maõ, phaân ñoaïn naøo laø phaân ñoaïn döõ lieäu, phaân ñoaïn 
naøo laø phaân ñoaïn ngaên xeáp. Muïc tieâu cuûa ñònh höôùng bieân dòch ASSUME laø 
lieân keát caùc thanh ghi  CS, DS, SS vaø ngay caû ES  vaøo caùc phaân ñoaïn ñaõ bieát. 

 

II - DAÏNG CUÛA CHÖÔNG TRÌNH .EXE SÖÛ DUÏNG TRONG CAÙC 
PHÖÔNG PHAÙP CUÕ: 

 S_SEG  SEGMENT 

STACK 

 

  DB 

 100h 

 S_SEG  ENDS 
 D_SEG  SEGMENT 
   

; döõ lieäu 

 D_SEG  ENDS 
 C_SEG  SEGMENT 
 

  ASSUME 

CS:C_SEG, 

SS:S_SEG, 

DS: 

D_SEG 

 MAIN 

PROC 

   

 

;Xaùc ñònh ban ñaàu DS 

 

  MOV 

 AX, 

D_SEG 

 

  MOV 

 DS, 

AX 

  ; 

caùc 

leänh 

khaùc 

 MAIN 

ENDP 

  ; caùc thuû tuïc khaùc 
 C_SEG  ENDS 
 

  END 

 MAIN 

 Moät ví duï chöông trình EXE 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 80 - 

 

 
   

Ñoåi ra chöõ HOA: 

     
 *  Taäp tin CTR11.ASM 
 
 EXTRN  CONVERS:FAR 
 S_SEG  SEGMENT 

 

STACK 

 

  DB 

 100 

 

DUP 

(0) 

 S_SEG  ENDS 
   

D_SEG SEGMENT 

  MSG        DB     'Nhaäp vaøo moät chöõ caùi thöôøng: $' 
 D_SEG  ENDS 
   

C_SEG SEGMENT 

   

 

ASSUME  CS:C_SEG, DS: D_SEG, SS: S_SEG 

 
 MAIN 

PROC 

 

  MOV 

 AX, 

D_SEG 

 

  MOV 

 DS, 

AX 

 

  MOV 

 AH, 

09 

 

  LEA 

 DX, 

MSG 

   

 

INT   

21H 

 

  MOV 

 AH, 

   

 

INT   

21H 

 

  CALL 

 CONVERS 

 

  MOV 

 AH,4CH 

   

 

INT   

21H 

 MAIN 

  ENDP 

 C_SEG  ENDS 
 

  END 

 MAIN 

 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 81 - 

 

Taäp tin CTR21.ASM 
 
 PUBLIC  CONVERS 
 
 D_SEG  SEGMENT 
   

MSG   

DB  0DH,0AH, 'Chöõ HOA laø:   ' 

   

CARAC 

DB  -20h,'  $' 

 

 D_SEG  ENDS 

 
C_SEG SEGMENT 
 

 

ASSUME  CS: C_SEG, DS: D_SEG 

CONVERT  

PROC 

FAR 

   PUSH DS 
   PUSH DX 
   MOV 

 DX, 

D_SEG 

   MOV 

 DS, 

DX 

   ADD 

 CARAC, 

AL 

   MOV 

 AH, 

09 

   LEA 

 DX, 

MSG 

 

 

 

INT   

21H 

   POP 

 DX 

   POP 

 DS 

 

 

 

RET 

CONVERS  

ENDP 

C_SEG   ENDS 
 

 

 

END 

 
Coù theå toái öu hoaù chöông trình treân: 
 

*  CTR12.ASM 
 
 EXTRN  CONVERS:NEAR 
 S_SEG  SEGMENT 

 

STACK 

 

  DB 

 100 

 

DUP 

(0) 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 82 - 

 

 S_SEG  ENDS 
  D_SEG 

SEGMENT  BYTE 

PUBLIC   'DATA' 

  MSG        DB     'Nhaäp vaøo moät chöõ caùi thöôøng: $' 
 D_SEG  ENDS 
  C_SEG 

SEGMENT  BYTE 

PUBLIC   'CODE' 

   

ASSUME  CS:C_SEG, DS: D_SEG, SS: S_SEG 

 MAIN 

PROC 

 

  MOV 

 AX, 

D_SEG 

 

  MOV 

 DS, 

AX 

 

  MOV 

 AH, 

09 

 

  LEA 

 DX, 

MSG 

   

 

INT   

21H 

 

  MOV 

 AH, 

   

 

INT   

21H 

 

  CALL 

 CONVERS 

 

  MOV 

 AH,4CH 

   

 

INT   

21H 

 MAIN 

  ENDP 

 C_SEG  ENDS 
 

  END 

 MAIN 

 
Taäp tin CTR22.ASM 
 
 PUBLIC  CONVERS 
  D_SEG 

SEGMENT   BYTE 

PUBLIC   'DATA' 

   

MSG   

DB  0DH,0AH, 'Chöõ HOA laø :   ' 

   

CARAC 

DB  -20h,'  $' 

 

 D_SEG  ENDS 

C_SEG 

SEGMENT   BYTE 

PUBLIC   'CODE' 

 

 

ASSUME  CS: C_SEG, DS: D_SEG 

CONVERT  

PROC 

NEAR 

   PUSH DX 
   ADD 

 CARAC, 

AL 

   MOV 

 AH, 

09 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 83 - 

 

   LEA 

 DX, 

MSG 

 

 

 

INT   

21H 

   POP 

 DX 

 

 

 

RET 

CONVERS  

ENDP 

C_SEG   ENDS 
 

 

 

END 

 
MASM    CTR21; 
MASM    CTR22; 
LINK   CTR21+CTR22 
 

III-  VÍ DUÏ CHÖÔNG TRÌNH COM 

 
MyProg SEGMENT 
  Org 

100h 

  ASSUME 

CS:MyProg, 

 

DS:MyData 

Start: 
 

 

JMP   

Main 

Main  

PROC 

  MOV 

 

 AH,9 

  LEA 

 DX,CS:MSG 

  INT 

 21h 

  INT 

 20h 

Main  

ENDP 

MyProg ENDS 
MyData SEGMENT 
    MSG 

DB  'Chaøo caùc baïn, heïn gaëp laïi  $' 

MyData ENDS 
  END 

 Start 

 
 

 

 

 

MASM    CTCUOI; 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 84 - 

 

LINK       CTCUOI; 
EXE2BIN  CTCUOI   CTCUOI.COM 
 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 85 - 

 

CHÖÔNG 8:  CHÖÔNG TRÌNH ÖÙNG DUÏNG 

 

I. IN NOÄI DUNG VAÊN BAÛN RA MAÙY IN: 

1. Söû duïng haøm 40h ngaét 21h (DOS) ñeå thöïc hieän 

 

   .MODEL SMALL 
   .STACK 100h 
   .DATA 
HelloMessage DB 'Hello, world',13,10,12    ; 12 Form Feed 
HELLO_MESSAGE_LENGTH EQU $ - HelloMessage 
   .CODE 
   mov  ax,@data 
   mov  ds,ax   ;set DS to point to the data segment 
   mov  ah,40h  ;DOS write to device function # 
   mov  bx,4    ;printer handle 
   mov  cx,HELLO_MESSAGE_LENGTH ;number of characters to print 
   mov  dx,OFFSET HelloMessage  ;string to print 
   int  21h       ;print "Hello, world" 
   mov  ah,4ch    ;DOS terminate program function # 
   int  21h       ;terminate the program 
   END 

 

2. Söû duïng haøm 01h ngaét 17h (ROMBIOS)  

 

.model small 
.stack 100h 
 
.data  
 

printe  equ 

17h 

 prin_first 

equ 

 
.code 
printe_char proc 
 mov 

ax,@data 

 mov 

ds,ax 

 mov 

dx,prin_first 

 mov 

ah,01 

 int 

printe 

 mov 

cx,0ffh 

conti: 
 mov 

al,41h 

 call 

pri 

 dec 

cx 

 cmp 

cx,0 

 jnz 

conti 

 mov 

al,0dh 

 call 

pri 

 mov 

ah,4ch 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 86 - 

 

 int 

21h 

printe_char endp 
pri proc 
 mov 

ah,0 

 int 

printe 

 ret 
pri endp 
 end 

printe_char 

 

 

 II. ÑEÁM SOÁ TÖØ TRONG MOÄT TAÄP TIN 

 

; Program to count the number of words in a file.  Words are 
; delimited by whitespace, which consists of spaces, tabs, 
; carriage returns, and linefeeds. 
.MODEL  SMALL                      ;code and data each fit in 64K 
        .STACK  200h                       ;512-byte stack 
        .DATA 
Count           DW    0                    ;used to count words 
InWhitespace    DB    ?                    ;set to 1 when the last 
                                           ; character read was whitespace 
TempChar        DB    ?                   ;temporary storage used by 
                                           ; GetNextCharacter 
Result          DB    'So tu la: ', 5 DUP (?) 
                                 ;string printed to report the count 
CountInsertEnd  DB    0dh,0ah,'$' 
                              ;DOS fn #9 expects strings to end with 
                                           ; a dollar sign 
        .CODE 
ProgramStart: 
        mov     ax,@data 
        mov     ds,ax              ;point DS to the .DATA segment 
        mov     [InWhitespace],1  ;assume we're in whitespace, since 
                               ; the first non-whitespace we'll find 
                               ; will mark the start of a word 
CountLoop: 
        call    GetNextCharacter  ;get next character to check 
        jz      CountDone         ;...if any 
        call    IsCharacterWhitespace      ;is it whitespace? 
        jz      IsWhitespace               ;yes 
        cmp     [InWhitespace],0           ;character is not 
                                 ; whitespace-are we currently in 
                                           ; whitespace? 
        jz      CountLoop        ;we're not in whitespace, and the 
                                 ; character isn't whitespace, so 
                                 ; we're done with this character 
        inc     [Count]          ;we are in whitespace, and the 
                                 ; character is not whitespace, so 
                             ; we just found the start of a new word 
        mov     [InWhitespace],0       ;mark that we're no longer  

;in whitespace 

        jmp     CountLoop           ;do the next character 
IsWhitespace: 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 87 - 

 

        mov     [InWhitespace],1    ;mark that we're in whitespace 
        jmp     CountLoop           ;do the next character 

; We're done counting--report the results. 
CountDone: 
        mov     ax,[Count]         ;number to convert to a string 
        mov     bx,OFFSET CountInsertEnd-1 ;point to the end of 

; the string to   put the number in 

        mov     cx,5          ;number of digits to convert 
        call    ConvertNumberToString  ;make the number a string 
        mov     bx,OFFSET Result       ;point to result string 
        call    PrintString            ;print the count 
        mov     ah,4ch                 ;DOS terminate program fn # 
        int     21h                    ;end the program 

; Subroutine to get the next character from the standard input. 

; Input: None 

; Output: 
;       AL = character, if one was available 
;       Z flag = 0 (NZ) if character available, 
;              = 1 (Z) if end of file reached 

; Registers destroyed: AH, BX, CX, DX 

GetNextCharacter        PROC 
        mov     ah,3fh                     ;DOS read from file fn # 
        mov     bx,0                       ;standard input handle 
        mov     cx,1                       ;read one character 
        mov     dx,OFFSET TempChar         ;put the character in TempChar 
        int     21h                        ;get the next character 
        jc      NoCharacterRead ;if DOS reports an error, then treat 
                                ; it as the end of the file 
        cmp     [TempChar],1ah             ;was it Control-Z? 
                                  ; (marks end of some files) 
        jne     NotControlZ       ;no 
NoCharacterRead: 
        sub     ax,ax             ;mark no character read 
NotControlZ: 
        and     ax,ax             ;set Z flag to reflect whether a 
                                  ; character was read (NZ), or the 
                                  ; end of the file was reached (Z). 
                                  ; Note that DOS fn #3fh sets AX to 
                                  ; the number of characters read 
        mov     al,[TempChar]     ;return the character read 
        ret                       ;done 
GetNextCharacter        ENDP 

; Subroutine to report whether a given character is whitespace. 

; Input: 
;       AL = character to check 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

; Output: 

 

background image

Hôïp Ngöõ 

 

 

- 88 - 

 

;       Z flag = 0 (NZ) if character is not whitespace 
;              = 1 (Z) if character is whitespace 

; Registers destroyed: none 

IsCharacterWhitespace   PROC 
        cmp     al,' '                     ;is it a space? 
        jz      EndIsCharacterWhitespace   ;if so, it's whitespace 
        cmp     al,09h                     ;is it a tab? 
        jz      EndIsCharacterWhitespace   ;if so, it's whitespace 
        cmp     al,0dh                     ;is it a carriage return? 
        jz      EndIsCharacterWhitespace   ;if so, it's whitespace 
        cmp     al,0ah                     ;is it a linefeed? If so, 
                                  ; it's whitespace, so return Z; 
                                  ; if not, it's not whitespace, 
                                  ; so return NZ as set by cmp 
EndIsCharacterWhitespace: 
        ret 
IsCharacterWhitespace   ENDP 

; Subroutine to convert a binary number to a text string. 

; Input: 
;       AX = number to convert 
;       DS:BX = pointer to end of string to store text in 
;       CX = number of digits to convert 

; Output: None 

; Registers destroyed: AX, BX, CX, DX, SI 

ConvertNumberToString   PROC 
        mov     si,10        ;used to divide by 10 
ConvertLoop: 
        sub     dx,dx        ;convert AX to doubleword in DX:AX 
        div     si           ;divide number by 10. Remainder is in 
                             ; DX--this is a one-digit decimal 
                             ; number. Number/10 is in AX 
        add     dl,'0'       ;convert remainder to a text character 
        mov     [bx],dl      ;put this digit in the string 
        dec     bx           ;point to the location for the 
                             ; next most-significant digit 
        loop    ConvertLoop  ;do the next digit, if any 
        ret 
ConvertNumberToString   ENDP 

; Subroutine to print a string on the display. 

; Input: 
;       DS:BX = pointer to string to print 

; Output: None 

; Registers destroyed: None 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 89 - 

 



PrintString     PROC 
        push    ax 
        push    dx           ;reserve registers in this subroutine 
        mov     ah,9         ;DOS print string function # 
        mov     dx,bx        ;point DS:DX to the string to print 
        int     21h          ;invoke DOS to print the string 
        pop     dx           ;restore registers we changed 
        pop     ax 
        ret 
PrintString     ENDP 
        END     ProgramStart 
 

III-   ÑOÅI NGÖÔÏC CHUOÃI 

 
   .MODEL SMALL 
   .STACK 100h 
   .DATA 
MAXIMUM_STRING_LENGTH  EQU  1000 
StringToReverse  DB  MAXIMUM_STRING_LENGTH DUP(?) 
ReverseString    DB  MAXIMUM_STRING_LENGTH DUP(?) 
   .CODE 
   mov  ax,@data 
   mov  ds,ax              ;set DS to point to the data segment 
   mov  ah,3fh             ;DOS read from handle function # 
   mov  bx,0               ;standard input handle 
   mov  cx,MAXIMUM_STRING_LENGTH    ;read up to maximum  

;number of characters 

   mov  dx,OFFSET StringToReverse   ;store the string here 
   int  21h                         ;get the string 
   and  ax,ax                       ;were any characters read? 
   jz   Done                        ;no, so you're done 
   mov  cx,ax                       ;put string length in CX, where 
                                    ; you can use it as a counter 
   push cx                          ;save the string length 
   mov  bx,OFFSET StringToReverse 
   mov  si,OFFSET ReverseString 
   add  si,cx 
   dec  si                 ;point to the end of the 
                           ; reverse string buffer 
ReverseLoop: 
   mov  al,[bx]       ;get the next character 
   mov  [si],al       ;store the characters in reverse order 
   inc  bx            ;point to next character 
   dec  si            ;point to previous location in reverse buffer 
   loop ReverseLoop   ;move next character, if any 
   pop  cx            ;get back the string length 
   mov  ah,40h        ;DOS write from handle function # 
   mov  bx,1          ;standard output handle 
   mov  dx,OFFSET ReverseString     ;print this string 
   int  21h                         ;print the reversed string 
Done: 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 90 - 

 

   mov  ah,4ch                 ;DOS terminate program function # 
   int  21h                         ;terminate the program 
   END 

 
 
 
 

IV. CHÖÔNG TRÌNH HIEÅN THÒ THÔØI GIAN 

 
Chöông trình bao goàm caùc böôùc sau ñaây: 

 
1- Laáy thôøi gian 
2- Ñoåi giôø, phuùt, giaây sang daïng chöõ soá ASCII 
3- Hieån thò caùc chöõ soá ASCII 

 
Taäp tin thöù 1: PGM1_1.ASM 
 
EXTRN GET_TIME:NEAR 
.MODEL SMALL 
.STACK 100h 
.DATA 
TIME_BUF 

DB  '00:00:00$' ; boä ñeäm thôøi gian 

 

 

 

 

 

 

;hr:min:sec 

.CODE 
MAIN PROC 
 MOV 

 

AX,@DATA 

 

MOV 

DX,AX 

 

; khôûi taïo DS 

;laáy vaø hieån thò thôøi gian 
 LEA 

BX,TIME_BUF 

 CALL 

GET_TIME 

 

 

;

ñöa thôøi gian  

 

 

  

 

 

;

hieän taïi vaøo DX 

 LEA 

DX,TIME_BUF 

 MOV 

AH,09H 

 INT 

21H 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 91 - 

 

;trôû veà DOS 
 MOV 

AH,4CH 

 INT 

21H 

MAIN ENDP 
 END 

MAIN 

 
 
 
Taäp tin thöù 2: PGM1_2.ASM 
 
PUBLIC GET_TIME 
.MODEL SMALL 
.CODE 
GET_TIME PROC 
;laáy thôøi gian trong ngaøy vaø chöùa caùc chöõ soá ASCII ;trong boä 
ñeäm thôøi gian 
 MOV 

AH,2CH 

 INT 

21H 

;ñoåi giôø sang daïng ASCII vaø löu tröõ 
 MOV 

AL,CH 

 CALL 

CONVERT 

 MOV 

[BX],AX 

;ñoåi phuùt sang daïng ASCII vaø löu tröõ 
 MOV 

AL,CL 

 CALL 

CONVERT 

 MOV 

[BX+3],AX 

;ñoåi giaây sang daïng ASCII vaø löu tröõ 
 MOV 

AL,CH 

 CALL 

CONVERT 

 MOV 

[BX+6],AX 

 RET 
GET_TIME ENDP 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 92 - 

 

CONVERT PROC 

; ñoåi soá kieåu byte (0-59) sang caùc chöõ soá ASCII 
; vaøo: 

AL = soá 

; ra:AX = caùc chöõ soá ASCII, AL = chöõ soá haøng chuïc 
; AH =  chöõ soá haøng ñôn vò 

 MOV 

AH,0 

 MOV 

DL,10 

 DIV 

DL 

 

OR 

AX, 0303H  

; ñoåi sang daïng ASCII 

 RET 

 

CONVERT END 
 END 
 
Chöông trình hieån thò thôøi gian vaø keát thuùc 
 

* Ñeå taïo chöông trình thôøi gian thuù vò hôn, chuùng ta cho hieån thò thôøi 

gian vaø caäp nhaät laïi sau moãi giaây 

 

Thuû tuïc SETUP_INT trong chöông trình PGM2_2.ASM caát vectô ngaét 

cuõ vaø thieát laäp vectô ngaét môùi. Noù nhaän soá hieäu ngaét trong AL, boä ñeäm ñeå caát 
vectô cuõ taïi DS:DI vaø boä ñeäm chöùa vectô ngaét môùi taïi DS:SI. Baèng vieäc hoaùn 
ñoåi hai boä ñeäm, SET_INT coù theå ñöôïc duøng ñeå phuïc hoài laïi vectô cuõ. 

 

Taäp tin PGM2_2.ASM 
 
PUBLIC  

SETUP_INT 

.MODEL SMALL 
.CODE 
SETUP_INT PROC 
;caát vectô cuõ 
 MOV 

AH,35H 

 

 

INT 

21H      ;ES:BX=vectô ngaét 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 93 - 

 

 

MOV 

[DI],BX  ; caát offset 

 MOV 

[DI+2],ES 

;

caát ñòa chæ phaân ñoaïn 

; thieát laäp vectô môùi 
 

MOV 

DX,[SI]  ;DX chöùa offset  

 

PUSH   DS 

;caát DS 

 

MOV 

DS,[SI+2];DS chöùa soá hieäu ñoaïn 

 MOV 

AH,25H 

 INT 

 

21H 

 

POP 

  DS  ; phuïc hoài DS 

 RET 
SETUP_INT END 
 END 
 

 

Ñieàu khieån con troû: 
 

Moãi khi hieån thò thôøi gian baèng haøm 9 ngaét 21h, con troû bò dòch ñi. 

Laàn hieån thò sau seõ xuaát hieän taïi moät vò trí khaùc treân maøn hình. Nhö vaäy 
ñeå thaáy thôøi gian caäp nhaät laïi ôû cuøng moät vò trí treân maøn hình, chuùng ta 
phaûi phuïc hoài con troû taïi vò trí nguyeân thuûy cuûa noù tröôùc khi hieån thò thôøi 
gian. Muoán thöïc hieän ñieàu naøy, tröôùc heát chuùng ta phaûi xaùc ñònh vò trí 
hieän taïi cuûa con troû, tieáp ñoù sau moãi thao taùc in chuoãi chuùng ta laïi 
chuyeån con troû troû veà vò trí ban ñaàu cuûa noù. 

 
Chuùng ta söû duïng caùc haøm 3 vaø 2 cuûa ngaét 10h ñeå caát vò trí cuûa 

con troû vaø di chuyeån con troû ñeán vò trí ban ñaàu cuûa noù sau moãi thao taùc in 
chuoãi. 
 
Thuû tuïc ngaét: 
 

Khi moät thuû tuïc ngaét ñöôïc kích hoaït, khoâng theå xem thanh ghi DS 

chöùa ñòa chæ phaân ñoaïn döõ lieäu cuûa chöông trình. Vì theá neáu muoán söû 
duïng baát cöù bieán naøo, phaûi khôûi taïo thanh ghi DS. Thanh ghi DS phaûi 
ñöôïc phuïc hoài laïi tröôùc khi keát thuùc trình phuïc vuï ngaét vôùi leänh IRET 
(Interrupt Return) 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 94 - 

 

 

PGM2_1.ASM chöùa thuû tuïc MAIN vaø thuû tuïc ngaét TIME_INT. 

 

 Caùc böôùc cuûa thuû tuïc MAIN goàm: 

Caát vò trí con troû hieän taïi 

Thieát laäp vectô ngaét cho TIME_INT 

Ñôïi vaøo 1 phím 

phuïc hoài laïi ngaét cuõ vaø keát thuùc 

 

Thöïc hieän böôùc thöù 2, chuùng ta söû duïng toaùn töû giaû OFFSET vaø 

SEG ñeå laáy offset vaø ñòa chæ phaân ñoaïn cuûa thuû tuïc TIEME_INT, vectô 
naøy sau ñoù ñöôïc löu vaøo trong boä ñeäm NEW_VEC. Thuû tuïc SETUP_INT 
ñöôïc goïi ñeå thieát laäp vectô cho ngaét nhòp thôøi gian 1Ch. Ngaét 16h, haøm 0 
ñöôïc duøng trong böôùc 3 ñeå vaøo 1 phím. Thuû tuïc SETUP_INT laïi ñöôïc 
goïi moät laàn nöõa trong böôùc 4, laàn naøy SI troû ñeán vectô cuõ vaø DI troû ñeán 
vectô cuûa thuû tuïc TIME_INT. 

 

Caùc böôùc cuûa thuû tuïc TIME_INT goàm 

 

(1)  Thieát laäp DS 
(2)  Laáy thôøi gian môùi 
(3)  Hieån thò thôøi gian 
(4)  phuïc hoài vò trí con troû 
(5)  Phuïc hoài DS 

 

Chöông trình ñöôïc tieán haønh nhö sau: sau khi thieát laäp con troû vaø 

caùc vectô ngaét, thuû tuïc MAIN ñôïi 1 phím nhaán. Khi aáy thuû tuïc ngaét 
TIME_INT caäp nhaät thôøi gian môùi moãi khi coù xung nhòp cuûa maïch thôøi 
gian. Sau khi moät phím ñöôïc nhaán, vectô cuõ ñöôïc phuïc hoài vaø chöông 
trình keát thuùc. 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 95 - 

 

PGM2_1.ASM 

 

EXTRN  GET_TIME:NEAR, SETUP_INT:NEAR 

.MODEL SMALL 

.STACK 100H 

.DATA 

TIME_BUF DB 

'00:00:00$' 

CURSOR_POS DW 

NEW_VEC DW 

?,? 

OLD_VEC DW 

?,? 

.CODE 

MAIN PROC 

 MOV 

AX,@DATA 

 MOV 

DS,AX 

;Khôûi 

taïo 

DS 

;caát vò trí con troû 

 MOV 

AH,3 

 MOV 

BH,0 

;trang 

 INT 

10H 

 

MOV 

CURSOR_POS,DX; caát vò trí con troû 

;thieát laäp thuû tuïc ngaét baèng caùch 

; ñöa segment:offset cuûa TIME_INT vaøo NEW_VEC 

 MOV 

NEW_VEC, 

OFFSET 

TIME_INT 

 MOV 

NEW_VEC+2,SEG 

TIME_INT 

 

LEA DI, OLD_VEC ;DI troû ñeán boä ñeäm vectô 

 

LEA SI, NEW_VEC   ;SI troû ñeán vectô môùi 

 

MOV 

AL,1CH    ; ngaét thôøi gian 

 

CALL 

SETUP_INT 

; thieát laäp vectô môùi 

; ñoïc baøn phím 

 MOV 

AH,0 

 INT 

 

16H 

;phuïc hoài vectô ngaét cuõ 

 LEA 

 

DI,NE_VEC 

 LEA 

 

SI,OLD_VEC 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 96 - 

 

 MOV 

AL,1CH 

 CALL 

SETUP_INT 

;trôû veà DOS 

 MOV 

AH,4CH 

 INT 

21H 

MAIN ENDP 

TIME_INT PROC 

;thuû tuïc ngaét 

;kích hoaït bôûi maïch thôøi gian 

 

PUSH 

DS; caát giaù trò töùc thôøi cuûa DS 

 MOV 

AX,@DATA 

 

MOV 

DS,AX 

;DS troû ñeán ñoaïn döõ lieäu 

;laáy thôøi gian môùi 

 

LEA  

BX, TIME_BUF  ; BX troû ñeán boä ñeäm  

 

     ;thôøi 

gian 

 

CALL 

GET_TIME ; caát thôøi gian trong boäñeäm 

;hieån thò thôøi gian 

 LEA 

 

DX,TIME_BUF 

 MOV 

AH,09H 

 INT 

 

21H 

;phuïc hoài vò trí con troû 

 MOV 

AH,2 

 MOV 

BH,0 

 MOV 

DX,CURSOR_POS 

 INT 

 

10H 

 IRET 

TIME_INT ENDP 

;  

 END 

MAIN 

 

Leänh LINK goàm caùc moñun PGM2_1.ASM, PGM1_2.ASM, 

PGM2_2.ASM 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 97 - 

 

V. CHÖÔNG TRÌNH THÖÔØNG TRUÙ BOÄ NHÔÙ. 

 

Cuõng vaãn hieån thò giôø nhöng baây giôø laø ôû thöôøng truù trong boä nhôù 

(terminate and stay resident) 
 

Thoâng thöôøng khi keát thuùc moät chöông trình, boä nhôù maø noù chieám 

giöõ ñöôïc DOS söû duïng ñeå naïp chöông trình khaùc. Tuy nhieân khi moät 
chöông trình TSR keát thuùc, boä nhôù khoâng bò thu hoài laïi. Chính vì theá moät 
chöông trình TSR coøn ñöôïc goïi laø chöông trình thöôøng truù boä nhôù 
(memory resident program) 
 

Ñeå trôû veà DOS, moät chöông trình TSR keát thuùc baèng caùch söû duïng 

ngaét 27h hay ngaét 21h (haøm 31h) 

 
Chuùng ta seõ taïo moät chöông trình .COM vì ñeå söû duïng ngaét 27h 

chuùng ta caàn xaùc ñònh soá byte ñöôïc ôû laïi thöôøng truù trong boä nhôù. Caáu 
truùc cuûa moät chöông trình .COM khieán vieäc tính toaùn deã daøng hôn vì noù 
chæ coù moät phaân ñoaïn chöông trình. 

 
Moät khi muoán keát thuùc hoaøn toaøn nghóa laø chöông trình TSR 

khoâng hoaït ñoäng. Chöông trình naøy phaûi ñöôïc kích hoaït bôûi caùc taùc ñoäng 
ngoaøi nhö moät toå hôïp phím naøo ñoù (Ví duï:Ctrl+Shift). Öu ñieåm cuûa 
chöông trình thöôøng truù laø chuùng coù theå ñöôïc kích hoaït khi ñang chaïy 
moät chöông trình naøo khaùc. 

 
Chöông trình goàm 2 phaàn: Phaàn khôûi taïo thieát laäp vectô ngaét vaø 

phuïc vuï ngaét 

 

Taäp tin PGM3_1.ASM 
 
EXTRN MAIN:NEAR, 

SETUP_INT:NEAR 

EXTRN NEW_VEC:DWORD, 

OLD_VEC:DWORD 

PUBLIC INITIALIZE 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 98 - 

 

C_SEG SEGMENT PUBLIC 
 ASSUME 

CS:C_SEG 

INITIALIZE PROC 
;thieát laäp vectô ngaét 
 MOV 

NEW_VEC,OFFSET 

MAIN; 

löu ñòa chæ 

 MOV 

NEW_VEC+2,CS

 

 

LEA DI, OLD_VEC           ; 

DI troû veà vectô cuõ

 

 

LEA SI, NEW_VEC           ; 

SI troû veà vectô môùi

 

 

MOV 

AL,09H            ;

ngaét baøn phím 

 

CALL 

SETUP_INT    

; thieát laäp vectô ngaét 

;trôû veà DOS 
 LEA 

DX, 

INITIALIZE 

 

INT  27H   ; 

Keát thuùc vaø ôû laïi thöôøng truù 

INITIALIZE ENDP 
C_SEG ENDS 
 END 

INITIALIZE 

 

  

 

Caùch ñôn giaûn ñeå nhaän bieát caùc phím ñieàu khieån laø kieåm tra caùc 

côø phím (haøm 2- ngaét 16h). Chuùng ta seõ söû duïng toå hôïp phím Ctrl vaø 
Shift phaûi ñeå kích hoaït vaø keát thuùc söï hieån thò ñoàng hoà. Khi kích hoaït, 
thôøi gian hieän taïi seõ ñöôïc hieån thò taïi goùc phaûi treân cuûa maøn hình . Ñaàu 
tieân phaûi cheùp laïi döõ lieäu maøn hình ñeå sau khi keát thuùc hieån thò ñoàng hoà 
ta coù theå phuïc hoài laïi maøn hình cuõ. 

 
Thuû tuïc SET_CURSOR thieát laäp vò trí con troû taïi haøng 0 vaø coät 

trong DL 

Thuû tuïc SAVE_SCREEN cheùp döõ lieäu maøn hình vaøo boä ñeäm 
Thuû tuïc RESTOR_SCREEN traû laïi döõ lieäu cho boä ñeäm maøn hình 

 

Taäp tin PGM3_2.ASM  

EXTRN SS_BUF:BYTE 

PUBLIC  SAVE_SCREEN,RESTOR_SCREEN, SET_CURSOR 

C_SEG SEGMENT 

PUBLIC 

 ASSUME 

CS:C_SEG 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 99 - 

 

SAVE_SCREEN   PROC 

;löu giöõ 8 kyù töï ôû goùc phaûi treân cuûa maøn hình 

 

LEA 

DI,SS_BUF   ; Boä ñeäm maøn hình 

 MOV 

CX,8 

 

MOV  DL,72    ;coät 72 

 

CLD      ; xoaù DF cho thao taùc chuoãi 

SS_LOOP: 

 

CALL  SET_CURSOR;thieát laäp con troû 

 

MOV  AH,08H  ; ñoïc kyù töï treân maøn hình 

 

INT 

10H   ;AH=thuoäc tính/AL=kyù töï 

 

STOSW                ; caát kyù töï vaø thuoäc tính 

 

INC 

DL   ; coät tieáp theo 

 LOOP 

SS_LOOP 

 RET 

SAVE_SCREEN   ENDP 

RESTOR_SCREEN PROC 

;phuïc hoài maøn hình ñaõ caát 

 

LEA 

SI,SS_BUF  ;SI troû ñeán boä ñeäm 

 

MOV  DI,8   

;laëp 8 laàn 

 MOV 

DL,72 

;coät 

72 

 

MOV  CX,1   

; moãi laàn 1 kyù töï 

RS_LOOP: 
 

CALL  SET_CURSOR ;di chuyeån con troû 

 

LODSW  

;AL=kyù töï/AH=thuoäc tính 

 MOV 

BL,AH 

 

MOV  AH,9 ; vieát kyù töï vaø thuoäc tính 

 MOV 

BH,0 

;trang 

 INT 

10h 

 

INC 

DL  ;vò trí kyù töï tieáp theo 

 DEC 

DI 

 JG 

 

RS_LOOP 

 RET 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 100 - 

 

RESTOR_SCREEN END 

SET_CURSOR PROC 
;chuyeån con troû ñeán haøng 0, coät DL 
; vaøo DL=soá hieäu coät 
 MOV 

AH,2 

 MOV 

BH,0 

 MOV 

DH,0 

 INT 

10H 

SET_CURSOR END 

C_SEG ENDS 
 END 
 

Baây giôø chuùng ta ñaõ saün saøng ñeå vieát thöôøng trình ngaét. Ñeå xaùc 

ñònh xem söï hieån thò thôøi gian coù ñöôïc kích hoaït hay khoâng ta söû duïng côø 
bieán ñoåi ñöôïc ON_FLAG. Côø naøy ñöôïc thieát laäp baèng 1 khi thôøi gian 
ñöôïc hieån thò. MAIN laø thuû tuïc ngaét 
 
Taäp tin PGM3_3.ASM 
 
;chöông trình thöôøng truù boä nhôù chæ thôøi gian 
; kích hoaït baèng toå hôïp phím Ctrl+Shift phaûi 
EXTRN INITIALIZE:NEAR,SAVE_SCREEN:NEAR 
EXTRN RESTOR_SCREEN:NEAR,SET_CURSOR:NEAR 
EXTRN GET_TIME:NEAR 
PUBLIC MAIN 
PUBLIC NEW_VEC,OLD_VEC,CURSOR_POS 
C_SEG SEGMENT 
 

ASSUME  CS:C_SEG, DS:C_SEG, SS:C_SEG 

 ORG 

100H 

START: 
 JMP 

MAIN 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 101 - 

 

SS_BUF 

DB 

16DUP(?) ;boä ñeäm löu giöõ maøn hình 

TIME_BUF DB  '00:00:00$' 
CURSOR_POS 

DW ? 

;vò trí con troû 

ON_FLAG  DB 

0   

;1=chaïy thuû tuïc ngaét 

NEW_VEC  DW  ?,?   

; chöùa vectô môùi 

OLD_VEC  DW  ?,?   

;chöùa vectô cuõ 


MAIN  

PROC 

;thuû tuïc ngaét 
; caát caùc thanh ghi 
 PUSH 

DS 

 PUSH 

ES 

 PUSH 

AX 

 PUSH 

BX 

 PUSH 

CX 

 PUSH 

DX 

 PUSH 

SI 

 PUSH 

DI 

 MOV 

AX,CS 

;

thieát laäp DS 

 MOV 

DS,AX 

 MOV 

ES,AX 

;Goïi thuû tuïc ngaét baøn phím cuõ 
 PUSHF 
 CALL 

INITIALIZE 

  ;laáy caùc côø baøn phím 
 MOV 

AX,CS 

;

thieát laäp laïi DS 

 MOV 

DS,AX 

 MOV 

ES,AX 

;

ES cho phaân ñoaïn hieän haønh 

 MOV 

AH,02 

xem côø baøn phím

 

 INT 

16H 

 

;

AL chöùa caùc côø baøn phím 

 TEST 

AL,1 

 

Shift phaûi

 JE 

I_DONE 

khoâng, thoaùt 

 TEST 

AL,100B 

;

Ctrl?

 

 JE 

I_DONE 

;

khoâng, thoaùt 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 102 - 

 

;ñuùng, xöû lyù 

 CMP 

ON_FLAG,1;

thuû tuïc ñang ñöôïc kích hoaït? 

 JE 

RESTOR 

;

ñuùng, khöû kích hoaït

 

 MOV 

ON_FLAG,1 

;

khoâng, kích hoaït 

;caát vò trí con troû vaø thoâng tin maøn hình 

 MOV 

AH,03 

;

laáy vò trí con troû 

 MOV 

BH,0 

 

;

trang 0

 

 INT 

10H 

 

;

DH=haøng,DL=coät 

 MOV 

CURSOR_POS,DX 

;

löu vò trí con troû 

 CALL 

SAVE_SCREEN 

;

löu maøn hình  

 

 

 

 

 

;

 hieån thò thôøi gian 

;

 ñònh vò con troû ñeán goùc treân beân phaûi 

 MOV 

DL,72 

;

 coät 72 

 CALL 

SET_CURSOR 

 LEA 

BX,TIME_BUF 

 

CALL GET_TIME ; 

laáy thôøi gian hieän taïi 

;

hieån thò thôøi gian 

 LEA 

SI,TIME_BUF 

 MOV 

CX,8 

 

8kyù töï

 

 MOV 

BH,0 

 

; trang 0 

 MOV 

AH,0EH 

vieát kyù töï 

M1: 
 LODSB 

 

 

;

kyù töï trong AL

 

 INT 

10H 

 

;

con troû ñöôïc chuyeån  

 

 

 

 

;

 ñeán haøng tieáp theo 

 

LOOP 

M1   

; laëp laïi 8 laàn 

 JMP 

RES_CURSOR 

RESTOR: 

;phuïc hoài maøn hình 

 MOV 

ON_FLAG,0 

 

;

xoaù côø

 

 CALL 

RESTOR_SCREEN 

;phuïc hoài vò trí con troû löu tröõ 

RES_CURSOR: 
 MOV 

AH,02 

 

;

thieát laäp con troû

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 103 - 

 

 MOV 

BH,0 

 MOV 

DX,CURSOR_POS 

 INT 

10H 

;phuïc hoài caùc thanh ghi 

I_DONE: POP  DI 
 POP 

SI 

 POP 

DX 

 POP 

CX 

 POP 

BX 

 POP 

AX 

 POP 

ES 

 POP 

DS 

 IRET 

 

;

trôû veà töø ngaét

 

MAIN ENDP 
C_SEG ENDS 
 END 

START 

 

Taäp tin PGM3_4.ASM 

 

PUBLIC GET_TIME,SETUP_INT 
C_SEG SEGMENT 

 

PUBLIC 

  

ASSUME 

CS:C_SEG 


GET_TIME PROC 
 MOV 

AH,2CH 

 INT 

21H 

 MOV 

AL,CH 

 CALL 

CONVERT 

 MOV 

[BX],AX 

 MOV 

AL,CL 

 CALL 

CONVERT 

 MOV 

[BX+3],AX 

 MOV 

AL,DH 

 CALL 

CONVERT 

 MOV 

[BX+6],AX 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 104 - 

 

 RET 
GET_TIME ENDP 

CONVERT PROC 
 MOV 

AH,0 

 MOV 

DL,10 

 DIV 

DL 

 OR 

AX,0303H 

 RET 
CONVERT ENDP 

SETUP_INT PROC 
 MOV 

AH,35H 

 INT 

21H 

 MOV 

[DI],BX 

 MOV 

[DI+2],ES 

 MOV 

DX,[SI] 

 PUSH 

DS 

 MOV 

DS,[SI+2] 

 MOV 

AH,25H 

 INT 

21H 

 POP 

DS 

 RET 
SETUP_INT ENDP 

C_SEG ENDS 
 END 
 

LINK   PGM3_3+PGM3_2+PGM3_4+PGM3_1. 
Chuù yù PGM3_1 ñöôïc lieân keát cuoái cuøng ñeå thuû tuïc INITIALIZE 

ñöôïc ñöa vaøo cuoái chöông trình. Vieát caùc chöông trình TSR raát phöùc taïp, 
neáu nhö ñaõ coù moät chöông trình TSR khaùc trong heä thoáng, chöông trình 
hieän coù coù theå khoâng coøn thöïc hieän ñuùng nöõa 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 105 - 

 

PHUÏ LUÏC A: MOÄT SOÁ CHÖÔNG TRÌNH PHUÏC VUÏ CUÛA DOS 

 

Chöùc naêng 

Ngaét 

(Hex) 

TG vaøo 

Keát thuùc chöông trình 

20 

 

Keát thuùc nhöng naèm 
thöôøng tröïc (max 64KB) 

27 

DS:DX=ñòachæ byte sau vuøng ñöôïc giöõ 
laïi thöôøng truù 

 
 

CAÙC CHÖÔNG TRÌNH PHUÏC VUÏ CUÛA DOS (NGAÉT 21h) 

 

Chöùc naêng 

Soá (Hex) 

TG vaøo 

TG ra 

Ñöa vaøo töø baøn phím 

01 

AH=01 
AL=kyù töï vaøo 8 bit 

 

Ñöa ra maøn hình moät kyù 
töï 

02 

AH=02 
DL=kyù töï ra 8 bit 

 

Ñöa ra maùy in 

05 

AH=05 
DL=kyù töï 

 

Ñöa vaøo tröïc tieáp töø baøn 
phím vaø khoâng hieän 

07 

AH=07 
AL=kyù töï vaøo 8 bit 

 

Ñöa ra maøn hình moät 
chuoãi 

09 

AH=09 
DS:DX = troû ñeán 
chuoãi keát thuùc baèng 
'$' 

 

Ñöa vaøo ñeäm baøn phím 

0A 

AH=0A 
DS:DX=troû ñeán ñeäm 
baøn phím 

 

Thieát laäp vectô ngaét 

25 

AH=25 
AL= soá hieäu ngaét 
DS:DX= troû tôùi 
chöông trình xöû lyù 
ngaét 

 

Laáy ngaøy thaùng naêm 

2A 

AH=2A 

AL=thöù trong tuaàn 
CX=naêm (1980-2099 
DH=thaùng 
DL=ngaøy 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 106 - 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

Chöùc naêng 

Soá (Hex) 

TG vaøo 

TG ra 

Ñaët ngaøy thaùng naêm 

2B 

AH=2B 
CX=naêm (1980-2099 
DH=thaùng 
DL=ngaøy 
 

AL=maõ traû veà 

Laáy thôøi gian 

2C 

AH=2C CL=phuùt 

CH=giôø 
DL=phaàn traêm giaây 
DH=giaây 

Ñaët thôøi gian 

2D 

AH=2D 
CL=phuùt 
CH=giôø 
DL=phaàn traêm giaây 
DH=giaây 

 

Keát thuùc chöông trình vaø 
thöôøng truù 

31 

AH=31 
AL=maõ traû veà 
DX=ñòa chæ ñoaïn 
chöông trình treân boä 
nhôù ñeå giaûi phoùng 
 

AX=maõ traû veà 

Laáy vectô ngaét 

35 

AH=35 
AL=soá hieäu ngaét 
 

ES:BX=vectô ngaét 
AX=maõ traû veà 

Taïo thö muïc 

39 

AH=39 
DS:DX = troû ñeán 
chuoãi ASCII teân 
ñöôøng 

Neáu sai CF=01, 
 AX= maõ loãi 
Neáu toát: CF=00 

Xoaù thö muïc 

3A 

AH=3A 
DS:DX = troû ñeán 
chuoãi ASCII teân 
ñöôøng 

Neáu sai CF=01, 
 AX= maõ loãi 
 

Ñoåi thö muïc hieän thôøi 

3B 

AH=3B 
DS:DX = troû ñeán 
chuoãi ASCII teân 
ñöôøng 

Neáu sai CF=01, 
 AX= maõ loãi 
 

Taïo file 

3C 

AH=3C 
CX=ñaëc tính file 
DS:DX= troû ñeán 

AX=theû file hoaëc maõ 
traû veà 
CF=00 (toát), 01 (sai) 

 

background image

Hôïp Ngöõ 

 

 

- 107 - 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

Chöùc naêng 

Soá (Hex) 

TG vaøo 

TG ra 

chuoãi ASCII teân file 

Môû theû 

3D 

AH=3D 
CX=maõ truy nhaäp 
DS:DX = troû ñeán 
chuoãi ASCII teân file 

AX=theû file hoaëc maõ 
traû veà 
 

Ñoùng theû 

3E 

AH=3E 
BX=theû file 

AX=theû file hoaëc maõ 
traû veà 

Ñoïc file hoaëc töø thieát bò 

3F 

AH=3F 
BX=theû file 
CX=soá byte caàn ñoïc 
DS:DX= troû ñeán 
vuøng ñeäm döõ lieäu 

AX=soá byte ñoïc ñöôïc 
hoaëc maõ traû veà 

Ghi file hoaëc ra thieát bò 

40 

AH=40 
BX=theû file 
CX=soá byte caàn ghi 
DS:DX= troû ñeán 
vuøng ñeäm döõ lieäu 

AX=soá byte ghi ñöôïc 
hoaëc maõ traû veà 

Xoaù file 

41 

AH=41 
DS:DX = troû ñeán 
chuoãi ASCII teân file 

Neáu sai CF=01, AX= 
maõ traû veà 

Keát thuùc quaù trình 

4C 

AH=4C 
AL= maõ traû veà 

 

Ñoåi teân file 

56 

AH=56 
DS:DX = troû ñeán 
chuoãi ASCII teân cuõ 
ES:DI = troû ñeán 
chuoãi ASCII teân môùi 

Neáu sai CF=01, AX= 
maõ traû veà 

 
 
 
 
 
 
 
 

 

background image

Hôïp Ngöõ 

 

 

- 108 - 

 

PHUÏ LUÏC B: MOÄT SOÁ CHÖÔNG TRÌNH PHUÏC VUÏ CUÛA ROM-

BIOS 

 
 
 

Chöùc naêng 

Ngaét 

(Hex) 

TG vaøo 

TG ra 

Di chuyeån con troû 

10 

AH=2 
BH=soá hieäu trang 
DH=soá hieäu doøng 
DL=soá hieäu coät

 

 

Laáy vò trí con troû 

10 

AH=3 
BH=soá hieäu trang 

DH=soá hieäu coät 
DL=soá hieäu doøng 
CH=doøng queùt ñaàu 
cuûa con troû 
CL=doøng queùt cuoái 
cuûa con troû 

Ñoïc moät kyù töï vaø thuoäc 
tính 

10 

AH=8 
BH=trang maøn hình 

AH=thuoäc tính 
AL=kyù töï 

Ghi 1 kyù töï 

10 

AH=0E 
AL=kyù töï 
BL=maøu trong kieåu 
ñoà thò 

 

Ñoïc moät cung 

13 

AH=02 
AL= soá cung 
CH=raõnh 
CL=cung 
DL=oå ñóa 
ES:BX=con troû ñeán 
ñeäm 

CF=baùo keát quaû 
toát/hoûng 
AH=maõ traïng thaùi 
AL=soá cung ñöôïc 
ñoïc 

Ghi moät cung 

13 

AH=03 
AL= soá cung 
CH=raõnh 
CL=cung 
DL=oå ñóa 
ES:BX=con troû ñeán 
ñeäm 

CF=baùo keát quaû 
toát/hoûng 
AH=maõ traïng thaùi 
AL=soá cung ñöôïc ghi

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 

background image

Hôïp Ngöõ 

 

 

- 109 - 

 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

Chöùc naêng 

Ngaét 

(Hex) 

TG vaøo 

TG ra 

Laáy caùc tham soá hieän 
thôøi cuûa oå ñóa 

13 

AH=08 
DL=soá hieäu ñóa 
 
 

DL=soá oå ñóa 
DH=soá löôïng maët 
max 
CL[0,5]=soá hieäu 
cung max 
CL[6,7]=2 bit cao 
cuûa soá löôïng töø truï 
max 
CH=ca'c bit thaáp cuûa 
soá löôïng töø truï max 
CF=côø baùo keát quaû 
toát/hoûng 
AH=maõ traïng thaùi 

Ñoïc kyù töï tieáp töø baøn 
phím 

16 

AH=00 

AH=maõ queùt baøn 
phím 
AL=maõ ASCII 

Laáy côø baøn phím 

16 

AH=02 AL=côø 

caùc 

phím 

bit 0=1: Shift phaûi 
bit 1=1: Shift traùi 
bit 2=1: Ctrl 
bit 3=1: Alt 
bit 4=1: Scroll lock 
bit 5=1: Num Lock 
bit 6=1:Caps lock 
bit 7=1: Cheá ñoä cheøn 

Göûi moät byte ra maùy in 

17 

AH=00 
AL=kyù töï 
DX=soá maùy in 

Giaù trò caùc bit: 
0: quaù thôøi gian 
1: khoâng söû duïng 
2: khoâng söû duïng 
3=1:loái vaøo/ra 
4=1: ñaõ ñöôïc choïn 
5=1:heát giaáy 
6=1:xaùc nhaän 
7=1:khoâng baän 

 

 

background image

Hôïp Ngöõ 

 

 

- 110 - 

 

TAØI LIEÄU THAM KHAÛO 

 
 
 

1.  Ngoân ngöõ laäp trình Assembly vaø maùy vi tính IBM-PC - Ytha Yu vaø 

Charles Marut (Quaùch Tuaán Ngoïc-Ñoã Tieán Duõng- Nguyeãn Quang 
Khaûi bieân dòch) -  Nhaø xuaát baûn Giaùo duïc  

 
2.  Laäp trình Hôïp ngöõ Turbo Assembler 2.0 - Phan Tröông Daàn - Nhaø xuaát 

baûn Giaùo duïc 

 

3.  Caåm nang laäp trình - Peter Norton (Nguyeãn Minh San dòch) - Nhaø xuaát 

baûn Giaùo Duïc 

 

4.  Caåm nang cho ngöôøi laäp trình treân maùy vi tính IBM- Peter Norton - 

Nhaø xuaát baûn Thoáng keâ - Vieän Ñieän töû - Tin hoïc 

 

5.  Assembleur facile - PhMercier- Marabout  

 

6.  Hardware Reference Manual 8088 - Intel 

 

7.  Macro Assembler Programmer's Guide 5.0 - Microsoft 

 
 
 
 
 
 
 
 
 

 
Nguyeãn Höõu Loäc 

 

Khoa Vaät Lyù 

 


Document Outline