Assermbler

Màu nền
Font chữ
Font size
Chiều cao dòng

Bµi 1 : Më ®Çu

I. Giíi thiÖu vÒ Assembly Language (Hîp ng÷)

1. Giíi thiÖu vÒ Assembly Language (Hîp ng÷)

ViÖc lËp tr×nh b»ng ng«n ng÷ m¸y ®ßi hái ng­êi lËp tr×nh cÇn ph¶i nhí c¸c m· lÖnh b»ng sè, ph¶i s¾p ®Æt vÞ trÝ cña m· lÖnh vµ tÊt c¶ c¸c sè liÖu trong bé nhí cña m¸y tÝnh, ngay c¶ c¸c sè liÖu còng ph¶i viÕt d­íi d¹ng sè. C«ng viÖc nµy hÕt søc nÆng nhäc vµ rÊt dÔ g©y nhÇm lÉn.

ChÝnh v× vËy ng­êi ta cÇn ®Õn Assembly Language, nã cho NSD c¸c kh¶ n¨ng sau:

Cho phÐp dïng c¸c ký hiÖu gîi nhí thay cho c¸c m· lÖnh b»ng sè cña bé VXL, vÝ dô ADD thay cho 00000000; INT 13h thay cho 11001101 00010011 .v.v... c¸c ký hiÖu lo¹i nµy ®­îc gäi lµ m· lÖnh (Op-Code).

Cho phÐp dïng c¸c tªn gäi (nh·n: Label) ®Ó chØ c¸c ®Þa chØ nhí, NSD gäi ®Õn c¸c tªn nµy nh­ viÖc gäi c¸c thñ tôc hoÆc nh­ lµ viÖc truy nhËp ®Õn c¸c biÕn hay h»ng sè trong c¸c ng«n ng÷ lËp tr×nh bËc cao.

Cho phÐp dïng c¸c chØ thÞ cho chÝnh Assembler (Assembler Directive), ®Ó nã biÕt cÇn ph¶i chuyÓn c¸c m· cña NSD nh­ thÕ nµo, ch­¬ng tr×nh b¾t ®Çu ë ®©u; dù tr÷ kho¶ng trèng bao nhiªu cho d÷ liÖu; b¸o r»ng kh«ng cßn lÖnh ®Ó chuyÓn m· ng÷ tiÕp n÷a .v.v. VÝ dô ORG 100h: ®o¹n m· lÖnh b¾t ®Çu ë ®Þa chØ 100h,Code_seg: segment: tªn Code_seg lµ ®¹i diÖn cho 1 segment trong bé nhí

end: hÕt m· ng÷.

Cho phÐp viÕt c¸c chó thÝch trong ch­¬ng tr×nh, lµm cho ch­¬ng tr×nh dÔ ®äc, dÔ b¶o tr×.

Khi hîp dÞch, c¸c m· lÖnh ®­îc chuyÓn trùc tiÕp thµnh c¸c lÖnh cña bé vxl ®Ó nã cã thÓ thùc hiÖn trùc tiÕp ®­îc. C¸c nh·n, c¸c chØ thÞ cho Assembler chØ ®­îc chÝnh Assembler sö dông, kh«ng chuyÓn thµnh m· m¸y; cßn c¸c chó thÝch (comment) th× bÞ bá qua. ChÝnh v× vËy mµ c¸c ch­¬ng tr×nh viÕt b»ng Assembly rÊt ng¾n gän, ch¹y rÊt nhanh.

Ch­¬ng tr×nh ®­îc viÕt b»ng c¸c ký hiÖu cña ng«n ng÷ Assembly ®­îc gäi lµ ch­¬ng tr×nh nguån (Source Program). Ch­¬ng tr×nh ë d¹ng sè t­¬ng t­¬ng víi ch­¬ng tr×nh nguån mµ bé VXL cã thÓ hiÓu ®­îc (microprocessor-compatible form) gäi lµ ch­¬ng tr×nh ®Ých (Object Program). Assembler lµ ch­¬ng tr×nh thùc hiÖn chuyÓn (convert) ch­¬ng tr×nh nguån (Source Program) thµnh ch­¬ng tr×nh ®Ých (Object Program).

2. Mét sè vÊn ®Ò vÒ hÖ ®Õm 2, sè cã dÊu, sè bï 2

2.1 HÖ ®Õm 2

Nh­ ta ®· biÕt, c¸c phÇn tö nhí c¬ b¶n cÊu t¹o nªn bé nhí còng nh­ c¸c phÇn tö trong khèi tÝnh to¸n cña m¸y tÝnh ®Òu lµ c¸c phÇn tö cã 2 tr¹ng th¸i c©n b»ng æn ®Þnh 'on' vµ 'off' (ta cã thÓ dïng ®Ó biÓu diÔn sè 1 vµ 0) gièng nh­ tr¹ng th¸i ®ãng m¹ch vµ c¾t m¹ch cña mét c¸i c«ng t¾c ®iÖn. TÊt c¶ ch­¬ng tr×nh vµ sè liÖu mµ ch­¬ng tr×nh sö dông ®Òu ®Æt trong bé nhí tr­íc khi ®­îc bé VXL ®äc. Nh­ vËy sù kÕt hîp cña mét d·y c¸c sè 0 vµ 1 cã thÓ biÓu diÔn bÊt cø con sè nµo. HÖ ®Õm chØ sö dông c¸c sè 0 vµ 1 ®­îc gäi lµ hÖ nhÞ ph©n (Binary numbering system) hay hÖ ®Õm 2 , ®ã lµ hÖ ®Õm c¬ së cho mäi lo¹i MT§T ngµy nay.

Mét phÇn tö nhí chØ cã 1 trong hai gi¸ trÞ 0, 1 ®­îc gäi lµ 1 bit, ®ã lµ ch÷ viÕt t¾t cña Binary digit. Còng t­¬ng tù nh­ trong hÖ thËp ph©n, trong mét sè nhÞ ph©n gi¸ trÞ cña mçi bit trong con sè phô thuéc vµo vÞ trÝ cña nã trong con sè ®ã nh­ ®­îc thÓ hiÖn sau ®©y:

7 6 5 4 3 2 1 0 vÞ trÝ bit trong con sè

x x x x x x x x

27 26 25 24 23 22 21 20 träng sè cña bit

128 64 32 16 8 4 2 1 gi¸ trÞ t­¬ng øng trong hÖ thËp ph©n

§Ó chuyÓn mét sè tõ hÖ thËp ph©n sang hÖ nhÞ ph©n ta thùc hiÖn mét lo¹t c¸c phÐp MOD 2 ®èi víi sè ®ã cho tíi khi sè thËp ph©n b»ng 0:

Gi¸ trÞ cña phÐp tÝnh MOD 2 ®Çu tiªn lµ gi¸ trÞ cña bit 0

Gi¸ trÞ cña phÐp tÝnh MOD 2 tiÕp theo lµ gi¸ trÞ cña bit 1.v.v...

Trong c¸c lÜnh vùc tin häc, th­êng sö dông mét ®¬n vÞ lín h¬n, ®ã lµ byte, 1 byte gåm 8 bit, nh­ vËy 1 byte cã thÓ biÓu diÔn mét con sè cã gi¸ trÞ tõ 00000000 ®Õn 11111111 (0 - 255 trong hÖ thËp ph©n).

Ngoµi ra cßn cã c¸c ®¬n vÞ 1KB = 2^10 byte, 1MB = 2^20 byte ...

2.2 Sè cã dÊu

Khi sö dông 1 byte ®Ó biÓu diÔn sè cã dÊu, ng­êi ta chØ sö dông 7 bit thÊp ®Ó biÓu diÔn sè, cßn bit cao nhÊt (bit 7) ®Ó biÓu diÔn dÊu cña con sè ®ã, nÕu bit nµy = 0 th× con sè lµ d­¬ng, nÕu bit nµy = 1 th× con sè lµ ©m. Nh­ vËy víi 1 byte cã thÓ biÓu diÔn c¸c sè tõ -128 ®Õn +127.

Theo quy ­íc nµy sè -1 cã gi¸ trÞ nh­ sau: 10000001 nÕu ta ®em céng

víi 1 th× kÕt qu¶ l¹i = 10000010 = -2D! kh«ng nh­ chóng ta chê ®îi lµ = 0; chÝnh v× lý do nµy mµ ng­êi ta ph¶i dïng mét d¹ng sè ®Æc biÖt - d¹ng bï 2 (two's complemented) ®Ó biÓu diÔn sè ©m.

§Ó t×m d¹ng biÓu diÔn nhÞ ph©n cña mét sè ©m (nghÜa lµ t×m d¹ng bï 2 cña nã), ta chØ viÖc lÊy sè d­¬ng t­¬ng øng råi ®¶o gi¸ trÞ c¸c bit, sau ®ã céng 1 vµo kÕt qu¶ lµ xong. ThÝ dô t×m biÓu diÔn nhÞ ph©n cña sè -1: 0000 0001 ®¶o c¸c bit thµnh 1111 1110, ®em céng thªm 1 trë thµnh 1111 1111.NÕu ta ®em sè -1 nµy céng víi +1 th× kÕt qu¶ lµ 1 0000 0000, ta lê sè nhí (1) ®i th× ®­îc sè 0000 0000 nh­ mong muèn!

®ã lµ c¸ch biÓu diÔn sè ©m trong m¸y tÝnh!

Nh×n vµo sè ©m d¹ng bï 2 ta khã mµ hiÓu ®­îc sè thËp ph©n (©m) t­¬ng øng b»ng bao nhiªu, nÕu muèn tÝnh, ta vÉn ¸p dông quy t¾c trªn ®Ó tÝnh ®­îc sè d­¬ng t­¬ng øng.ThÝ dô muèn biÕt 1101 0000 cã gi¸ trÞ thËp ph©n t­¬ng øng b»ng bao nhiªu?

§¶o c¸c bit 0010 1111

Céng thªm 1 = 0000 0001

KÕt qu¶ = 0011 0000 = 32 + 16 = +48 , sè thËp ph©n t­¬ng øng lµ -48

2.3. HÖ ®Õm thËp lôc ph©n (hÖ 16)

BiÓu diÔn sè trong hÖ c¬ sè 2 cã nhiÒu ®iÓm bÊt tiÖn cho ng­êi lËp tr×nh, v× vËy ng­êi ta t×m c¸ch biÓu diÔn kh¸c cho tiÖn lîi h¬n, tuy vËy cÇn ph¶i nhÊn m¹nh r»ng bªn trong m¸y tÝnh tÊt c¶ lÖnh vµ sè liÖu ®Òu ®­îc biÔu diÔn d­íi d¹ng nhÞ ph©n.

Ngay tõ khi m¸y tÝnh ®iÖn tö míi ra ®êi, ng­êi lËp tr×nh còng ®· th­êng thao t¸c trªn tõng nhãm bit chø kh«ng ph¶i trªn tõng bit. C¸c bé VXL ®Çu tiªn lµ lo¹i 4 bit, v× thÕ ng­êi ta cã thÓ nhãm 4 bit l¹i vµ biÓu diÔn b»ng mét ký hiÖu duy nhÊt. Víi 4 bit cã thÓ biÓu diÔn 16 gi¸ trÞ kh¸c nhau, ng­êi ta dïng c¸c ký hiÖu 0..9, A, B, C, D, E, F ®Ó biÓu diÔn c¸c gi¸ trÞ nhÞ ph©n tõ 0000 ®Õn 1111. HÖ ®Õm nh­ vËy ®­îc gäi lµ hÖ thËp lôc ph©n (hÖ ®Õm c¬ sè 16) - hexadecimal numbering system.

3. Mét sè vÊn ®Ò cÇn nh¾c l¹i (sau gi¸o tr×nh CTMT) vÒ bé VXL

C¸c Mode lµm viÖc: C¸c bé VXL 80286 (vµ c¸c bé VXL míi h¬n cña INTEL) cã thÓ ho¹t ®éng trong 2 mode kh¸c nhau: Real Address Mode vµ Protected Virtual Address Mode.

Real Address Mode : Trong Mode nµy 80286 ho¹t ®éng còng gièng nh­ 8086, nh­ng thùc hiÖn c¸c ch­¬ng tr×nh nhanh h¬n tõ 2 ®Õn 5 lÇn, nã hç trî tÊt c¶ c¸c lÖnh cña 8086, thªm vµo ®ã lµ c¸c lÖnh cña riªng 80286. Khi chóng ta míi bËt m¸y, 80286 b¾t ®Çu ë Mode nµy, chØ khi nµo ch­¬ng tr×nh ra lÖnh cho nã chuyÓn sang Mode kia (Protected Mode).

Protected Mode : Trong Mode nµy 80286 vÉn cã mäi tÝnh n¨ng nh­ ë Real Address Mode nh­ng ®­îc thªm vµo mét sè tÝnh n¨ng tinh vi ®Ó b¶o vÖ d÷ liÖu vµ qu¶n lý bé nhí. TÝnh n¨ng næi bËt nhÊt cña Mode nµy lµ nã cho phÐp 80286 truy cËp mét bé nhí rÊt lín (so víi 8086) b»ng c¸ch sö dông mét kü thuËt gäi lµ Virtual Addressing.B»ng kü thuËt nµy 80286 cã thÓ lµm viÖc víi 2 lo¹i bé nhí: kh«ng gian ®Þa chØ vËt lý (Physical address space) vµ kh«ng gian ®Þa chØ ¶o (Virtual address space).

Kh«ng gian ®Þa chØ vËt lý lµ miÒn bé nhí mµ 80286 cã thÓ lµm viÖc víi nã t¹i mét thêi ®iÓm, b»ng 224 = 16MB

Kh«ng gian ®Þa chØ ¶o lµ miÒn bé nhí mµ 80286 cã thÓ ®¸nh ®Þa chØ, b»ng 230 = 1GB (1 Giga byte). ThuËt ng÷ ¶o (Virtual) ®­îc sö dông bëi v× nÕu mét ch­¬ng tr×nh cÇn truy cËp bé nhí mµ ®Þa chØ kh«ng thuéc kh«ng gian ®Þa chØ nhí vËt lý, hÖ ®iÒu hµnh cã thÓ sö dông kh¶ n¨ng qu¶n lý bé nhí cña 80286 ®Ó chuyÓn ®æi (swap) mét phÇn thÝch hîp (applicable piece) cña bé nhí ¶o. ViÖc chuyÓn ®æi bé nhí (swapping) nµy ng­êi lËp tr×nh kh«ng thÊy ®­îc v× vËy anh ta cã thÓ viÕt ch­¬ng tr×nh truy cËp bÊt cø ®Þa chØ nhí nµo trong toµn bé kh«ng gian ®Þa chØ lín ®Õn 1GB. Virtual Disk tõ Version 3.0 trë lªn, DOS hç trî viÖc sö dông bé nhí trªn 1MB, ta cã thÓ sö dông nã nh­ 'Virtual Disk' (®Üa ¶o hay RAM Disk). §Ó truy cËp vïng nhí cao nµy, bé VXL t¹m thêi (momentarily) chuyÓn (switch) sang Protected Mode, thùc hiÖn viÖc (vËn) chuyÓn d÷ liÖu råi l¹i chuyÓn trë vÒ Real Mode nh­ b×nh th­êng. KÕt qu¶ chung lµ ta cã thÓ sö dông mét bé nhí RAM cã kÝch th­íc lín, tèc ®é thao t¸c cùc nhanh so víi tèc ®é thao t¸c trªn ®Üa. * Protected Mode ®­îc ng­êi thiÕt kÕ OS quan t©m, víi ng­êi lËp tr×nh b×nh th­êng chØ cÇn quan t©m tíi Real Mode lµ ®ñ.

II TËp lÖnh cña bé vi xö lý 8088/8086

1. B¶ng lÖnh 8088/8086 (xem tµi liÖu chôp)

2. Ph©n lo¹i c¸c lÖnh

C¨n cø vµo c«ng viÖc mµ lÖnh thùc hiÖn, cã thÓ chia lµm 5 nhãm

lÖnh nh­ sau:

1/ C¸c lÖnh sè häc:

ADD dest,src céng 2 to¸n h¹ng, ®Æt kÕt qu¶ trong dest

dest:= dest + src

ADC dest, src céng 2 to¸n h¹ng, céng thªm sè nhí (Carry) tõ lÖnh ADD tr­íc ®ã

dest:= dest + src +Cf

INC dest t¨ng destination lªn 1 (dest cã thÓ lµ thanh ghi hoÆc ®Þa chØ)

dest:= dest + 1

DEC dest gi¶m destination bít 1 (dest cã thÓ lµ thanh ghi hoÆc ®Þa chØ)

dest:= dest - 1

SUB dest,src lÊy dest trõ ®i src, ®Ó kÕt qu¶ trong dest

dest:= dest - src

SBB dest,src lÊy dest trõ ®i src vµ trõ thªm sè m­în tõ lÖnh SUB tr­íc ®ã ,kÕt qu¶ ®Ó trong dest

dest:= dest - src - CF

NEG dest ®æi dÊu cña to¸n h¹ng

dest:= 0-dest

CMP dest, src so s¸nh (b»ng c¸ch trõ, nh­ng kh«ng lµm thay ®æi dest vµ src) ®Ó ®Æt c¸c cê hiÖu lµ nhí, trµn, v.v...

MUL src nh©n AL hay AX víi mét sè d­¬ng (kh«ng cã dÊu) lµ src (src lµ reg/mem)

AX:= (AL*src8); DX:AX:=(AX*Immed16)

IMUL src nh©n AL hay AX víi mét sè nguyªn cã dÊu

DIV src chia AL hoÆc AX cho gi¸ trÞ trong reg/mem kh«ng dÊu nÕu chia cho 0 hoÆc kÕt qu¶ qu¸ lín sÏ g©y ra INT 0

AL < (AX*src8); AH < (AX MOD src8)

AX < (DX:AX*src16); DX < (DX:AX MOD src16)

IDIV src chia AL hoÆc AX cho gi¸ trÞ trong reg/mem cã dÊu CBW ®æi byte thµnh Word

AL më réng theo dÊu vµo AH

AH ®­îc ®iÒn ®Çy theo bit 7 cña AL

CWD ®æi Word thµnh Word

AX më réng theo dÊu vµo DX

DX ®­îc ®iÒn ®Çy theo bit 15 cña AX

.v.v...

2/ C¸c lÖnh logic

AND dest,src : nh©n logic tõng bit trong dest vµ src

OR dest,src : OR logic tõng bit trong dest vµ src

XOR dest,src : XOR logic tõng bit trong dest vµ src

NOT dest : ®¶o tõng bit trong dest (lÊy bï 1)

.v.v...

3/ C¸c lÖnh vËn chuyÓn sè liÖu

MOV dest,src : copy d÷ liÖu tõ src (reg/mem) tíi dest. L­u ý r»ng kh«ng thÓ MOV tõ « nhí (mem) vµo « nhí

XCHG dest,src ®æi (chç) gi¸ trÞ gi÷a 2 thanh ghi hoÆc gi÷a thanh ghi vµ bé nhí

IN Port8 (or DX) nhËn d÷ liÖu tõ cæng vµo AL hay AX

byte : AL port

word : AL [port]

AH [port+1]

OUT Port8 (or DX) göi d÷ liÖu tõ AL hay AX ra cæng

byte : AL port

word : AL [port]

AH [port+1]

LEA reg16, mem1 n¹p ®Þa chØ vµo thanh ghi, mem1 ph¶i lµ mét nh·n. reg16 ®­îc n¹p ®Þa chØ cña mem1 chø

kh«ng ph¶i d÷ liÖu chøa trong mem1

( n¹p kÕt qu¶ viÖc tÝnh to¸n EA cña ®Þa chØ t­¬ng ®èi vµo

reg16)

PUSH src cÊt gi¸ trÞ thanh ghi 16 bit (hoÆc r/mem16) vµo stack PUSH immed cÊt gi¸ trÞ 16 bit (hoÆc 8 bit më réng dÊu) vµo stack

PUSHF cÊt gi¸ trÞ cña thanh ghi cê vµo stack

POP dest chuyÓn gi¸ trÞ tõ stack vµo dest (reg16 hoÆc r/mem

hoÆc thanh ghi ®o¹n)

POPF chuyÓn gi¸ trÞ tõ stack vµo thanh ghi cê

.v.v...

4/ C¸c lÖnh thao t¸c trªn x©u ký tù

CLD Clear direction flag to UP (DF:=0)

string Ops auto-increment

STD set direction flag to Down (DF:=1)

string Ops auto-decrement

REP/REPE/REPZ

lÆp l¹i thao t¸c x©u ký tù (CX:= CX-1) cho ®Õn khi C=0

REPNE/REPNZ

lÆp l¹i thao t¸c x©u ký tù ,sö dông kÕt hîp víi lÖnh CMPS vµ

SCAS

.v.v...

5/ C¸c lÖnh ®iÒu khiÓn sù thùc hiªn ch­¬ng tr×nh

JMP short/near/far target nh¶y kh«ng ®iÒu kiÖn ®Õn nh·n

short : IP (IP + (target displacement sign-extended))

b¸o cho assembler lµ nh·n ®Ých cña lÖnh nh¶y JMP kh«ng xa

h¬n 127 bytes kÓ tõ ®Þa chØ cña lÖnh tiÕp theo.

near : IP (IP + (target displacement)

far : SS target_seg; IP target_offset

indirect : IP (register or value in memory)

JCXZ: nh¶y tíi nh·n khi CX=0, kh«ng kiÓm tra cê

LOOP short_label CX CX-1

JA/JNBE JAE/JNB

JB/JC JE/JZ

JG/JNGE JGE/JNL

.V.V...

INT TYPE thùc hiÖn ng¾t phÇn mÒm (call a systen function)

INTO type: if OF=OV=1 then perform INTO type

IRET quay trë vÒ tõ lÖnh gäi ng¾t. Nã cã ¶nh h­ëng nh­

lÖnh POP IP; POP CS; POPF

6/ C¸c lÖnh ®iÒu khiÓn bé VXL

CLS xo¸ cê CY thµnh NC (CF 0)

CMC lÊy phÇn bï (®¶o gi¸ trÞ cña) cê Carry)

STC ®Æt cê carry thµnh CY

CLD clear direction flag

(c¸c lÖnh víi x©u ký tù tù ®éng t¨ng)

CLI cÊm c¸c ng¾t (cã thÓ che)

STI bá mÆt n¹ ng¾t (cho phÐp cã thÓ ng¾t)

HLT ngõng xö lý (thùc hiÖn c¸c lÖnh NOP cho ®Õn khi mét

lêi gäi ng¾t x¶y ra)

.v.v...

7/ C¸c lÖnh ®iÒu khiÓn tÝnh b¶o vÖ (80286/80386/80486)

(ch­a ®­a vµo ch­¬ng tr×nh phÇn nµy) 3. Ph©n tÝch mét sè m· lÖnh - Trong hÖ lÖnh cña 8088/8086... cã nhiÒu lÖnh tÝnh chÊt gièng nhau,

chØ kh¸c nhau ë ®Þa chØ cña c¸c to¸n h¹ng. ChÝnh v× vËy cã nh÷ng

lÖnh chØ cÇn 1 byte m· lÖnh lµ ®ñ ®Ó bé VXL thùc hiÖn, l¹i cã nh÷ng

lÖnh cÇn thªm mét sè th«ng tin n÷a míi cã thÓ thùc hiÖn ®­îc, c¸c th«ng tin nµy ®­îc chøa trong 1 byte, ®i ngay sau byte m· lÖnh thø nhÊt. ViÖc x¸c ®Þnh xem 1 lÖnh nµo ®ã cã cÇn ®äc thªm byte lÖnh thø 2

hay kh«ng ®­îc bé gi¶i m· lÖnh quyÕt ®Þnh. - Ta ph©n tÝch lÖnh ADD lµm vÝ dô:

Cã c¸c kh¶ n¨ng sau ®èi víi viÖc céng 2 to¸n h¹ng

1/ r/m r8 : céng néi dung thanh ghi 8 bit vµo mét thanh ghi

hay 1 « nhí

2/ r/m r16 : céng néi dung mét thanh ghi 16 bit vµ mét thanh

ghi 16 bit hoÆc vµo (2) « nhí

3/ r8 r/m céng néi dung tõ thanh ghi (8 bit) hoÆc tõ 1 « nhí (tÊt nhiªn lµ 8 bit) vµo 1 thanh ghi 8 bit

4/ r16 r/m céng néi dung mét thanh ghi hoÆc « nhí vµo 1

thanh ghi 16 bit

5/ AL im8 céng trùc tiÕp 1 gi¸ trÞ 8 bit vµo AL

6/ AX im16 céng trùc tiÕp 1 gi¸ trÞ 16 bit vµo AX

7/ r im8 hoÆc im16; tr­êng hîp nµy r # AX

CÊu t¹o cña m· lÖnh nh­ sau:

1/ tr­êng hîp 1 d: direction

reg/memory with reg to either = 1: 'to' reg

= 0 : 'from' reg

0 0 0 0 0 0 d w mod reg r/m w : word operation

= 1 : with word = 0: with byte

m· lÖnh nµy chøa ®ùng c¸c kh¶ n¨ng:

nªu ë trªn

2/ tr­êng hîp 2

Immediate to reg/mem (not to AX) s: sign

s= 1: signed value

s= 0: unsigned value

1 0 0 0 0 0 s w mod 0 0 0 r/m data data

byte 1 byte 2 nÕu

s:w = 01

m· lÖnh nµy chøa ®ùng c¸c kh¶ n¨ng:

nªu ë trªn

3/ tr­êng hîp 3

Immediate to AX (Accumulator)

0 0 0 0 0 1 0 w data data

byte 1 byte 2 nÕu

s:w = 01

m· lÖnh nµy chøa ®ùng c¸c kh¶ n¨ng:

nªu ë trªn

III. CÊu t¹o cña lÖnh, c¸c Mode ®Þa chØ cña Assembly Language

Trªn thÞ tr­êng cã mét sè Assembler, trong tµi liÖu nµy chóng ta sö dông

MACRO ASSEMBLER (MASM); vÒ MASM sÏ ®­îc ®Ò cËp ë bµi 2.

1. CÊu t¹o cña lÖnh

nh·n M· lÖnh c¸c to¸n h¹ng ghi chó

Data: MOV cx,ax ;n¹p vµo cx gi¸ trÞ trong ax

- Tr­êng nh·n (label field), Nh·n dµi tèi ®a 31 ký tù. Ên ®Þnh mét tªn ®¹i diÖn cho 1 lÖnh assembly, ®Ó cho c¸c lÖnh kh¸c cã thÓ dïng tªn nµy thay cho ®Þa chØ cña lÖnh ®ã trong bé nhí.

Nh·n kh«ng ®­îc b¾t ®Çu b»ng 1 con sè, kh«ng chøa dÊu ph©n c¸ch, nh·n kÕt thóc b»ng dÊu:; trong nh·n cã thÓ cã c¸c ký tù '$', '?', '@','_'... - M· lÖnh (Op-code) dµi tõ 2-7 ký tù, lµ nh÷ng ch÷ viÕt t¾t gîi trÝ nhí, ®Ó chØ c¸c lÖnh cña bé vxl. M· lÖnh cã thÓ ®øng liÒn sa dÊu ': ' cña nh·n hoÆc ph©n c¸ch bëi 1 sè dÊu c¸ch (space). Gi÷a m· lÖnh vµ c¸c to¸n h¹ng ph¶i cã mét sè dÊu c¸ch. - C¸c to¸n h¹ng (operands): b¸o cho MPU biÕt ph¶i t×m c¸c to¸n h¹ng ë ®©u - c¸c ghi chó (comments) dïng ®Ó diÔn gi¶i dßng lÖnh trong ch­¬ng tr×nh, ®Ó ®äc l¹i cho dÔ hiÓu h¬n. Trong c¸c ch­¬ng tr×nh dµi c¸c chó thÝch rÊt quan träng vµ cÇn thiÕt.

ghi chó ph¶i ®i sau ký hiÖu ';' vµ kÕt thóc bëi dÊu xuèng dßng (Enter)

2. C¸c Mode ®Þa chØ

- Ph­¬ng ph¸p x¸c ®Þnh vÞ trÝ trong bé nhí cña cña 1 to¸n h¹ng ®­îc gäi lµ Mode ®Þa chØ (Addressing Mode). Mode ®Þa chØ cña mét to¸n h¹ng phô thuéc vµo vÞ trÝ trong bé nhí cña d÷ liÖu øng víi to¸n h¹ng ®ã. Cã mét sè c¸ch ph©n lo¹i Mode ®Þa chØ kh¸c nhau, d­íi ®©y nªu ra hai trong c¸c c¸ch ®ã: - C¸ch thø nhÊt: chia lµm 3 lo¹i Mode ®Þa chØ:

1. Mode ®Þa chØ tøc thêi (Immediate Addressing Mode): sö dông chÝnh

gi¸ trÞ b»ng sè ë vÞ trÝ cña to¸n h¹ng.

vÝ dô mov ax,0001h

trong mode ®Þa chØ nµy ph¶i cã 1 vÞ trÝ nhí hay thanh ghi lµm

destination.(sè chu kú m¸y cÇn thiÕt t­¬ng øng lµ 10 vµ 4)

2. Mode ®Þa chØ thanh ghi (register addressing mode) c¶ dest vµ src

®Òu lµ thanh ghi. V× c¶ hai ®Òu ë bªn trong MPU nªn ®­îc thùc hiÖn rÊt

nhanh.

vÝ dô mov ax,cx cÇn 2 chu kú m¸y

3. Mode ®Þa chØ bé nhí (Memory Addressing Mode)

dest hoÆc src lµ ®Þa chØ nhí (hay nh·n còng vËy)

cã 2 lo¹i mode ®Þa chØ bé nhí:

1. §Þa chØ trùc tiÕp (direct)

2. §Þa chØ gi¸n tiÕp (indirect)

-direct: dest hoÆc src lµ mét ®Þa chØ nhí ®­îc x¸c ®Þnh b»ng sè ®Þa

chØ hoÆc nh·n.

vÝ dô: mov ax, mem1 th× néi dung « nhí cã nh·n mem1 ®­îc chuyÓn

vµo ax.

-indirect: ®Þa chØ nhí kh«ng ®­îc nªu ra trùc tiÕp. cã mét thanh ghi dïng ®Ó chøa ®Þa chØ cña « nhí chøa d÷ liÖu. Nh­ vËy thanh ghi cã

t¸c dông nh­ lµ mét ®Þa chØ gi¸n tiÕp ®Ó x¸c ®Þnh vÞ trÝ d÷ liÖu.

vÝ dô: mov [bx],cx

Cã mét sè biÕn c¸ch cña mode gi¸n tiÕp nµy, tuy vËy ý nghÜa c¬ b¶n

kh«ng kh¸c nhau. - C¸ch thø 2: chia lµm 7 Mode ®Þa chØ

1. Register addressing ®Þa chØ thanh ghi

thÝ dô MOV AX,BX

2. Immediate addressing ®Þa chØ tøc thêi

MOV CL,-30; MOV CL, PI (PI EQU 3.14)

3. Direct addressing ®Þa chØ trùc tiÕp

thÝ dô MOV AX,TABLE (trong ®ã TABLE lµ mét nh·n)

4. Register indirect addressing ®Þa chØ gi¸n tiÕp thanh ghi

thÝ dô MOV AX,[BX]

5. Base relative addressing ®Þa chØ t­¬ng ®èi c¬ së

thÝ dô MOV AX,[BX] + 4

6. Direct indexed addressing ®Þa chØ ®­îc chØ sè ho¸ trùc tiÕp

(MOV DI,2)

MOV AL, TABLE[DI] (trong ®ã TABLE lµ mét tªn cña 1 byte (tªn biÕn)

7. Base indexed addressing ®Þa chØ ®­îc chØ sè ho¸ c¬ së

MOV AX, [BX][DI+2] IV. C¸c chØ thÞ cho Assembler (Assembler Directives)

(cã kho¶ng 60)

C¸c chØ thÞ Assembler tr«ng rÊt gièng c¸c m· lÖnh ng«n ng÷ Assembly, mçi chØ thÞ gåm cã 4 tr­êng (Fields)

tªn ChØ thÞ ®èi sè (argument) ghi chó

PI EQU 3.14 ;x¸c ®Þnh gi¸ trÞ cña PI

- tªn (name field) còng gièng nh­ tr­êng nh·n trong dßng lÖnh

cã chØ thÞ assembler cÇn tr­êng tªn, cã chØ thÞ kh«ng cÇn, tªn b¾t ®Çu b»ng ch÷ c¸i, kÕt thóc b»ng kho¶ng trèng. - ChØ dÉn Assembler (directive field)

còng t­¬ng tù nh­ Op_code trong dßng lÖnh.

b¾t ®Çu b»ng kho¶ng trèng vµ kÕt thóc b»ng kho¶ng trèng hoÆc xuèng dßng - argument field: chøa 1 ®Þa chØ nhí hoÆc 1 sè ®Ó sö dông cïng víi chØ thÞ

vµ do chØ thÞ x¸c ®Þnh.

b¾t ®Çu b»ng kho¶ng trèng vµ kÕt thóc b»ng xuèng dßng

*trong c¸c ch­¬ng tr×nh ®¬n gi¶n th­êng dïng c¸c chØ thÞ sau:

ASSUME chØ ®Þnh c¸c thanh ghi ®o¹n; gióp Assembler ®æi c¸c nh·n thµnh c¸c ®Þa chØ b»ng c¸ch b¸o cho Assembler biÕt ta ®Þnh

dïng thanh ghi ®o¹n nµo ®Ó ®¸nh ®Þa chØ c¸c nh·n nµy.

format: ASSUME Seg-reg: Seg-name [,...]

trong ®ã Seg-reg lµ mét trong c¸c thanh ghi ®o¹n sau DS, CS,

ES, SS; Seg-name lµ tªn sÏ ®øng tr­íc chØ thÞ SEGMENT.

thÝ dô assume cs: cseg, ds: dseg

SEGMENT §Þnh nghÜa ®o¹n

D¹ng chung: SEGMENT COMBINE-TYPE ALIGN_TYPE CLASS .. ALIGN_TYPE: chØ ra biªn cña segment b¾t ®Çu ë ®©u trong bé nhí.

- BYTE: begin anywhere.

- WORD: begin at an even-numbered address (word).

- PARA: begin at an address divisible by 16

- PAGE: begin at an address divisible by 256

COMBINE_TYPE: chØ ra mét Segment sÏ ®­îc kÕt hîp víi c¸c Segment kh¸c cã cïng tªn nh­ thÕ nµo. Mét ch­¬ng tr×nh cã thÓ sö

dông 4 Segment: Data, Code, Extra vµ Stack.

Code, Data vµ Extra cã thÓ ®­îc nèi l¹i (joined) víi nhau

(PUBLIC) hoÆc trïm lªn nhau (Overlapped) (COMMON).

Stack Segment nhÊt thiÕt ph¶i cã kiÓu STACK.

CLASS TYPE: ¶nh h­ëng tíi thø tù s¾p ®Æt c¸c Segment trong bé nhí. C¸c Segment cã cïng tªn Class ®­îc s¾p ®Æt liªn tiÕp, C¸c Segment kh¸c tªn Class ®­îc s¾p ®Æt theo thø tù mµ

ch­¬ng tr×nh LINK gÆp.

- CODE - DATA

- EXTRA

Víi SEGMENT directive ta cã thÓ dïng nh­ sau:

víi DATA SEGMENT: SEGMENT PARA PUBLIC 'DATA' víi CODE SEGMENT: SEGMENT PARA PUBLIC 'CODE'

víi EXTRA SEGMENT: SEGMENT PARA PUBLIC 'EXTRA' víi STACK SEGMENT: SEGMENT PARA STACK 'STACK'

ENDS n¬i kÕt thóc ®o¹n hay cÊu tróc. SEGMENT vµ ENDS chØ ®¸nh dÊu ®iÓm ®Çu vµ ®iÓm cuèi cña mét Segment, chóng kh«ng cho Assembler biÕt ®ang ®Þnh nghÜa lo¹i Segment g×; viÖc nµy lµ

nhiÖm vô cña Pseudo-Op: ASSUME.

ORG ®Þa chØ khëi ®Çu cña ch­¬ng tr×nh

DB ®Þnh vïng d÷ liÖu d¹ng byte

DW ®Þnh vïng d÷ liÖu d¹ng word

DD ®Þnh vïng d÷ liÖu d¹ng 2 word, thÝ dô DD 0 nghÜa lµ 4 byte

b»ng 0

DUP lÆp l¹i d÷ liÖu

EQU Equate: g¸n tªn cho mét h»ng sè (kiÓu sè hoÆc kiÓu String) tªn nµy vÜnh viÔn nhËn gi¸ trÞ h»ng sè ®ã (kh¸c víi

Directive = ') thÝ dô PI EQU 3.14

Message EQU 'Hay vao so lieu'

PUBLIC khai b¸o tªn dïng chung, lµm cho 1 hoÆc nhiÒu symbol ®· ®­îc §N cã thÓ ®­îc dïng chung trong nhiÒu Module mµ c¸c Module

®ã sÏ ®­îc Linked víi Module chøa khai b¸o PUBLIC nµy.

D¹ng: PUBLIC Symbol [,...]

Symbol ë ®©y cã thÓ lµ c¸c tªn biÕn, nh·n kÓ c¶ c¸c nh·n cña Proc vµ c¸c tªn ®· ®­îc ®Þnh nghÜa bëi c¸c

Pseudo_Op EQU, = .

PUBLIC cã b¹n ®ång hµnh lµ EXTRN

EXTRN External - B¸o lµ tham chiÕu ngoµi;

format: External name: type[,...]

Nh­ EXTRN get_hex

chØ ra c¸c SYMBOL ®· ®­îc ®Þnh nghÜa trong Modul

get_hex

- NAME lµ mét Symbol ®· ®­îc ®Þnh nghÜa vµ ®­îc m« t¶ lµ

PUBLIC ë mét Modul hîp ng÷ kh¸c.

- TYPE cã thÓ lµ mét trong c¸c kiÓu sau:

+ nÕu NAME lµ mét ký hiÖu trong DATA SEGMENT, EXTRA

SEGMENT th× kiÓu cã thÓ lµ BYTE, WORD hoÆc DWORD

+ nÕu NAME lµ mét nh·n thñ tôc th× kiÓu cã thÓ lµ NEAR

hoÆc FAR

+ nÕu NAME lµ mét h»ng ®­îc ®Þnh nghÜa bëi EQU, =, th×

kiÓu ph¶i lµ ABS

* chó ý:

PUBLIC vµ EXTRN th­êng ®­îc sö dông ®Ó ph©n chia c¸c thñ tôc. Ch¼ng h¹n ®Ó ch¹y mét thñ tôc cã tªn lµ SORT tõ ch­¬ng tr×nh chÝnh th× MODUL trong ®ã ®Þnh nghÜa SORT ph¶i chøa khai b¸o PUBLIC SORT vµ MODUL chÝnh cã chøa lêi gäi tíi SORT

ph¶i cã chøa khai b¸o:

EXTRN SORT: NEAR (hoÆc FAR).

PROC vµ ENDP ®¸nh dÊu chç b¾t ®Çu vµ chç kÕt thóc thñ tôc. Thñ tôc lµ mét khèi c¸c chØ thÞ (instructions) cã thÓ ®­îc gäi thùc

hiÖn tõ c¸c vÞ trÝ kh¸c nhau trong ch­¬ng tr×nh.

END n¬i kÕt thóc ch­¬ng tr×nh nguån

D¹ng: END Nh·n ®iÓm vµo ch­¬ng tr×nh (nh·n cña lÖnh ®Çu

tiªn cña ch­¬ng tr×nh)

NÕu ch­¬ng tr×nh cña ta cã chøa nhiÒu MODUL, ta (ph¶i) g¸n nh·n cho chØ dÉn END ë cuèi MODUL ch­¬ng tr×nh chÝnh, cßn trong c¸c MODUL phô kh¸c nhau kh«ng ®­îc g¸n nh·n cho chØ

dÉn END

*sau ®©y lµ b¶ng c¸c chØ thÞ cho assembler

AND vµ logic, vÝ dô: mov ax,7 and 8 BYTE ®Þnh d÷ liÖu dµi 1 byte COMMENT b¾t ®Çu cña lêi b×nh CREF cross reference:danh s¸ch c¸c ký hiÖu dïng ®Ó tham chiÕu chÐo CGROUP

(TLTK, b¶n dÞch cña LNH, trg 44) DGROUP

(TLTK, b¶n dÞch cña LNH, trg 44) DQ define quadruple:®Þnh vïng d÷ liÖu d¹ng 4 word

nh­ DQ 0:t¸m byte 0 DT define ten: ®Þnh vïng d÷ liÖu d¹ng 10 byte

nh­ DT 0: m­êi byte 0 DW define word: ®Þnh vïng d÷ liÖu d¹ng word (2 byte) DWORD double word: ®Þnh d÷ liÖu dµi 2 word

nh­: JMP DWORD PTR[SI] DUP Duplicate: lÆp l¹i mét x©u . Nh­ 10 DUP ('stack') ELSE ENDIF ENDM end macro ENDP EQ Equal: so s¸nh logic EVEN §Æt ®Þa chØ ch½n EXITM Exit macro. Tho¸t khái macro FAR B¸o nh·n n»m ë ngoµi ®o¹n. Nh­ old_e LABEL FAR GE Greater than or Equal. PhÐp to¸n logic lín h¬n hay b»ng GROUP Nhãm c¸c ®o¹n thµnh mét ®o¹n; Nh­ Nhãm GROUP code, data

(TLTK, b¶n dÞch cña LNH, trg 44) GT Greater Than. PhÐp to¸n logic lín h¬n HIGH ChØ byte cao cña mét word ;* VÒ c¸c Pseudo_Op ®iÒu kiÖn, xem

(TLTK, b¶n dÞch cña LNH, trg 45) IF Khèi ®iÒu kiÖn IF1 Khèi ®iÒu kiÖn cho lÇn duyÖt thø nhÊt IF2 Khèi ®iÒu kiÖn cho lÇn duyÖt thø hai IFB If blank. Khèi ®iÒu kiÖn khi kh«ng cã tham sè IFDEF If Defined. Khèi ®iÒu kiÖn khi ®· cã ®Þnh nghÜa IFDIF If diffent. Khèi ®iÒu kiÖn khi hai tham sè kh¸c nhau IFE If Equal. Khèi ®iÒu kiÖn khi b»ng 0 IFIDN If Identical. Khèi ®iÒu kiÖn khi hai tham sè b»ng nhau IFNB If not Blank. Khèi ®iÒu kiÖn khi cã tham sè INCLUDE ChÌn thªm vµo ch­¬ng tr×nh mét sè chØ thÞ lÊy tõ mét tËp tin

kh¸c. Nh­ INCLUDE mylib.mac IRP Indefinite Repeat. Macro cã sè lÇn lÆp kh«ng x¸c ®Þnh.

Nh­ IRP para?. <one,two,three,four> sÏ lÆp l¹i 4 lÇn IRPC Indefinite Repeat Character. Macro cã sè lÇn lÆp ch÷

kh«ng x¸c ®Þnh. Nh­ IRPC para?. ABCD sÏ lÆp l¹i 4 lÇn LABEL Nh·n

(TLTK, b¶n dÞch cña LNH, trg 44) LE Less than or Equal. PhÐp to¸n logic nhá h¬n hay b»ng LENGTH X¸c ®Þnh chiÒu dµi mét kÝ hiÖu LOCAL §Þnh c¸c kÝ hiÖu chØ ®­îc dïng trong néi bé macro LOW ChØ byte thÊp cña mét word LT Less Than. PhÐp to¸n logic nhá h¬n .LALL LiÖt kª toµn bé macro .LFCOND LiÖt kª khèi ®iÒu kiÖn .LIST LiÖt kª ch­¬ng tr×nh MACRO B¾t ®Çu macro MASK MÆt n¹ d¹ng bit MOD Modulo. Cho sè d­ trong phÐp chia NAME §Þnh tªn cña mét ch­¬ng tr×nh hay m«-®un NE Not Equal. PhÐp to¸n logic kh«ng b»ng NEAR B¸o nh·n n»m trong ®o¹n NOT PhÐp to¸n logic lÊy bï OFFSET Offset trong ®o¹n OR PhÐp to¸n logic hoÆc %OUT In x©u ra mµn h×nh PAGE B¾t ®Çu trang míi vµ ®Þnh kÝch th­íc trang sÏ ®­îc in ra

(mµn h×nh vµ m¸y in) khi hîp dÞch.

D¹ng: PAGE [LINE], [COLLUMN]

ngÇm ®Þnh lµ: 57,80 (hîp víi khæ giÊy A4) PTR Pointer. Dïng chung víi BYTE, WORD, DWORD, NEAR vµ FAR ®Ó

®Þnh kÝch th­íc cña mét nh·n hay mét biÕn .RADIX §Þnh c¬ sè RECORD §Þnh kiÓu b¶n ghi REPT Repeat. Macro lÆp .SALL Kh«ng liÖt kª macro SEG Gi¸ trÞ ®o¹n øng víi mét kÝ hiÖu SHL Shift left. PhÐp dÞch chuyÓn tr¸i.Nh­ MOV AX,7 SHL 1 SHORT Nh¶y xu«i gÇn SHR Shift right. PhÐp dÞch chuyÓn ph¶i.

Nh­ MOV A,8 SHR 1 .SFCOND Kh«ng liÖt kª c¸c khèi ®iÒu khiÓn sai STRUC Structure. §Þnh nghÜa cÊu tróc .TCOND LiÖt kª mÆc ®Þnh cho c¸c khèi ®iÒu kiÖn TITLE Psuedo_Op ®Ó t¹o ra mét tiªu ®Ó ®­îc c¨n th¼ng tr¸i trªn dßng thø 2 cña mçi trang (in). TITLE th­êng ®­îc ®Æt ë ®Çu ch­¬ng tr×nh, nh­ng ta còng cã thÓ ®Æt nã ë bÊt cø ®©u trong

ch­¬ng tr×nh.

§é dµi tèi ®a cña TITLE: 60 dßng SUBTTL Sub Title ®Ó t¹o ra mét tiªu ®Ò phô ®­îc ®Þnh t©m ë dßng thø 3 (cña trang tiÕp theo ?), tiªu ®Ò nµy th­êng ®­îc sö

dông ®Ó m« t¶ néi dung cña trang ®ã

§é dµi tèi ®a cña SUBTITLE: 60 dßng XOR PhÐp to¸n logic hoÆc. Nh­ MOV AX,7 XOR 9 .XALL LiÖt kª c¸c macro sinh ra c¸c m· lÖnh hoÆc d÷ liÖu .XCREF Kh«ng liÖt kª danh s¸ch ®Ó tham chiÕu chÐo .XLIST Kh«ng liÖt kª ch­¬ng tr×nh WIDTH §Þnh ®é réng cña tr­êng trong b¶n ghi WORD §Þnh d÷ liÖu dµi mét word = G¸n tªn cho mét h»ng (kiÓu sè hoÆc kiÓu String) sau nµy trong

ch­¬ng tr×nh cã thÓ g¸n l¹i

(kh¸c víi Directive EQU) .286C gi¶ lÖnh chÕ ®é, b¸o cho Assembler sö dông tËp lÖnh cña 80286 ph¶i ®Æt nã t¹i ®Çu ch­¬ng tr×nh, ngay sau c¸c Pseudo-Op liÖt

kª danh s¸ch. .8086 gi¶ lÖnh chÕ ®é, b¸o cho Assembler sö dông tËp lÖnh cña 8086

®©y lµ chÕ ®é ngÇm ®Þnh. $ Offset hiÖn hµnh

V. c¸c to¸n tö trong Assembly language

( PhÇn nµy sö dông ®Ó tra cøu, TLTK sè 1, trang 48 )

To¸n tö lµ mét sù söa ®æi (modifier) ®­îc sö dông trong tr­êng to¸n h¹ng (Operand Field) cña mét Op_code hay Pseudo_Op. Cã 5 lo¹i to¸n tö: Sè häc, logic, quan hÖ, tr¶ l¹i gi¸ trÞ, cho thuéc tÝnh. (An operator is a modifier used in the operand field of an assembly language or pseudo-op statement.)

1. To¸n tö sè häc (xem trang 29)

* format: value1 * value2;multiplies value2 by value1 * format: value1 * value2;multiplies value2 by value1

/ format: value1 / value2;divides value1 by value2 and returns the

the quotient.

MOD format: value1 MOD value2; divides value1 by value2 and

returns the remainder.

SHL format: value SHL expression; shifts values left by expression

bit positions.

SHR format: value SHR expression; shifts values right by expression

bit positions. 2. To¸n tö logic (xem trang 29)

AND format: value1 AND value2; takes logical AND of value1 and

value2

OR format: value1 OR value2; takes logical inclusive-OR of

value1 and value2

XOR format: value1 XOR value2; takes logical exclusive-OR of

value1 and value2

NOT format: NOT value; reverses the state of each bit

in value; that is, it takes the

one's complement. 3. To¸n tö quan hÖ (xem trang 30)

EQ format operand1 EQ operand2; true if the two operands are

identical.

NE format operand1 NE operand2; true if the two operands are

not identical.

LT format operand1 LT operand2; true if operand1 is less than

operand2.

GT format operand1 GT operand2; true if operand1 is greater

than operand2.

LE format operand1 LE operand2; true if operand1 is less than

or equal to operand2.

GE format operand1 GE operand2; true if operand1 is greater

than or equal to operand2.

4. To¸n tö tr¶ l¹i gi¸ trÞ (xem trang 30)

$ format: $

cho l¹i gi¸ trÞ hiÖn thêi cña bé ®Õm vÞ trÝ bé nhí.

SEG format: SEG Var_name, hoÆc

SEG Label_name

tr¶ l¹i gi¸ trÞ Segment cña biÕn hoÆc nh·n

OFFSET format: OFFSET Var_name. hoÆc

OFFSET Label_name

tr¶ l¹i gi¸ trÞ OFFSET cña biÕn hoÆc nh·n

LENGTH format: LENGTH Var_name

tr¶ l¹i ®é dµi tÝnh b»ng ®¬n vÞ (Byte hoÆc Word) cña biÕn ®·

®­îc ®Þnh nghÜa b»ng DUP.

TYPE format: TYPE Var_name, hoÆc

TYPE Label_name

®èi víi c¸c biÕn, TYPE cho l¹i 1 nÕu lµ kiÓu Byte, 2 nÕu lµ kiÓu Word, 4 nÕu lµ kiÓu Double Word. ®èi víi c¸c nh·n TYPE cho l¹i

-1 nÕu lµ NEAR, -2 nÕu lµ FAR.

SIZE D¹ng SIZE Var_name

tr¶ l¹i gi¸ trÞ lµ tÝch cña Length vµ Type

5. To¸n tö thuéc tÝnh

PTR format: TYPE PTR EXPRESSION

khai b¸o l¹i kiÓu (type) (BYTE hoÆc WORD) hoÆc kho¶ng c¸ch (NEAR hoÆc FAR) cña mét to¸n h¹ng ®Þa chØ bé nhí. TYPE lµ thuéc tÝnh míi cßn Expression lµ mét tªn (indentifier) mµ thuéc tÝnh cña nã

bÞ thay ®æi (overriden).

DS: format: seg-reg:addr-expr hoÆc ES: seg-reg:label hoÆc

SS: seg-reg:variable

CS: thay thÕ (overrides) thuéc tÝnh ®o¹n (segment attribute) cña mét

nh·n, biÕn hoÆc biÓu thøc ®Þa chØ.

SHORT xem ë lÖnh JMP, trang

HIGH format: HIGH value hoÆc

HIGH expression

tr¶ l¹i gi¸ trÞ lµ byte cao cña 1 gi¸ trÞ sè hoÆc ®Þa chØ 16 bit

LOW format: LOW value hoÆc

LOW expression

tr¶ l¹i gi¸ trÞ lµ byte thÊp cña 1 gi¸ trÞ sè hoÆc ®Þa chØ 16

bit. VI H»ng sè trong ch­¬ng tr×nh nguån

Assembler chÊp nhËn viÖc sö dông mét vµi d¹ng h»ng sè sau: 1. Binary

lµ mét d·y sè 0,1 kÕt thóc bëi ký tù B, thÝ dô 10111010B 2. Decimal

lµ mét d·y c¸c ch÷ sè tõ 0 ®Õn 9, cã thÓ kÕt thóc bëi ký tù D hoÆc kh«ng

còng ®­îc, thÝ dô 512 , 512D 3. Hexadecimal

lµ mét d·y c¸c ch÷ sè tõ 0 ®Õn 9 vµ c¸c ký tù A, B, C, D, E, F

- ph¶i kÕt thóc bëi ký tù H

- ký tù ®Çu tiªn nhÊt thiÕt ph¶i lµ ch÷ sè (0..9)

thÝ dô 8FH, 0EDH 4. Character

®ã lµ mét d·y c¸c ch÷ c¸i, ch÷ sè, ký hiÖu ®­îc ghi trong dÊu nh¸y ®¬n

hay kÐp, thÝ dô 'Hello World!', "Don't enter a number here" bµi tËp 1. §æi c¸c sè thËp ph©n sau sang d¹ng nhÞ ph©n:

a) 12; b) 17; c) 45; d) 72 2. §æi c¸c sè nhÞ ph©n sau sang d¹ng thËp ph©n:

a) 00001000; b) 00010101; c) 00011111; d) 11000011 3. §æi c¸c sè ë c©u 2 sang d¹ng thËp lôc ph©n 4. §æi sang d¹ng thËp ph©n sè 0D8H trong tr­êng hîp: - 0D8H biÓu diÔn sè kh«ng dÊu - 0D8H biÓu diÔn sè cã dÊu

---------- hÕt bµi 1 ----------

Bµi gi¶ng m«n Assembly Language, Bµi 1 - $ - NguyÔn §×nh ViÖt, Khoa CNTT, §HQGVN,HN 1995 ---------------------------------------------------------------------------

Bµi 2 C¸c b­íc trong qu¸ tr×nh t¹o 1 ch­¬ng tr×nh ch¹y ®­îc

Trªn thÞ tr­êng cã kh¸ nhiÒu Assembler, trong c¸c bµi gi¶ng m«n häc nµy chóng ta sÏ sö dông Macro Assembler cña MicroSoft (MASM.EXE), nã t­¬ng thÝch víi IBM Macro Assembler.

Cho ®Õn nay (1990), IBM ®· ®­a ra thÞ tr­êng 2 Version cña Macro Assembler, Version 1 , version2. §Ó x©y dùng ch­¬ng tr×nh cho hä m¸y AT, chóng ta cÇn ph¶i dïng version 2 (cña IBM Macro Assembler) hoÆc version 3 (cña MicroSoft Macro Assembler).

§Üa Macro Assembler cña IBM cã 2 ch­¬ng tr×nh Assembler t¸ch biÖt: - Small Assembler (ASM): ®Ó dïng cho c¸c m¸y tÝnh cã bé nhí <= 128 KB vµ

cã tËp lÖnh Ýt h¬n cña MASM. MicroSoft kh«ng cã Small Assembler nh­ IBM. - Macro Assembler (MASM)

I. C¸c b­íc chÝnh

Bø¬c 0:

X¸c ®Þnh nhiÖm vô cña ch­¬ng tr×nh, thiÕt kÕ ch­¬ng tr×nh. Trong b­íc nµy ta th­êng cÇn vÏ l­u ®å (Flowchart). B­íc nµy ®Æc biÖt quan träng nÕu ch­¬ng tr×nh lµ dµi vµ phøc t¹p. Nªn thùc hiÖn chiÕn thuËt "Top-Down Program Design".

B­íc 1. So¹n ch­¬ng tr×nh nguån

Dïng 1 ch­¬ng tr×nh so¹n th¶o v¨n b¶n, vÝ dô SideKick, Turbo Pascal

®Ó so¹n th¶o ch­¬ng tr×nh nguån - Kh«ng nªn dïng c¸c hÖ so¹n th¶o trong ®ã cã sö dông c¸c m· ASCII më réng, hoÆc c¸c ký tù ®iÒu khiÓn (Nh­ Word Perfect, Bked .v.v...) - dïng SideKick cã rÊt nhiÒu tiÖn lîi, v× ®ã lµ ch­¬ng tr×nh th­êng tró nhá c¸c lÖnh so¹n th¶o kh¸ gièng Turbo Pascal Version 3.01a, quen thuéc víi sinh viªn. - dïng Turbo Pascal ®Ó so¹n th¶o rÊt dÔ tr×nh bµy ch­¬ng tr×nh nguån ®Ñp v× chøc n¨ng TAB cña nã rÊt tiÖn lîi cho so¹n th¶o ch­¬ng tr×nh. - (h­íng dÉn sinh viªn sö dông SideKick nÕu cÇn thiÕt) - ghi file nguån lªn ®Üa, vÝ dô víi tªn lµ vidu1.asm

B­íc 2. Hîp dÞch ch­¬ng tr×nh nguån

- Hîp dÞch

A:\> masm vidu1

sau ®ã ta ph¶i tr¶ lêi 3 c©u hái sau:

Object filename [vidu1.obj]: nÕu ta ®ång ý th× Ên Enter (nãi chung lµ ta

®ång ý víi c¸c gîi ý cña MASM)

Source Listing [Nul.lst]: Cross Reference [Nul.crf]:

Sau ®ã MASM sÏ hiÓn thÞ nh­ sau:

Microsoft (R) Macro Assembler Version 5.10 Copyright (C) Microsoft Corp. 1981-1985. All right reserved. 51712 + 154624 Bytes symbol space free

nn nnn Byte Free

m Warning Errors l Severe Errors

A:\>

tr­êng hîp kh«ng cã lçi nµo x¶y ra th× m=0, l=0

- VÒ File .lst

§©y lµ File v¨n b¶n nguån do MASM t¹o ra, nã chøa c¸c lÖnh nguån vµ c¸c m· sè cña chóng ®Ó ta cã thÓ in ra xem c¸ch Assembler biªn dÞch ch­¬ng

tr×nh cña m×nh.

Trong file .lst Macro Assembler cßn ®­a ra c¶ ®Þa chØ (Segment:Offset) cña c¸c lÖnh vµ d÷ liÖu cña ch­¬ng tr×nh, viÖc nµy rÊt cã Ých khi chóng ta muèn ph©n tÝch c¸c ch­¬ng tr×nh khã, ch¼ng h¹n ph©n tÝch c¸c ®o¹n m·

Virus .v.v. - cross-reference listing file:

File vidu1.crf (crf: cross reference) cßn gäi lµ File tham kh¶o chÐo, (cross-reference listing), nã cho sè dßng t¹i ®ã mçi ký hiÖu (symbol) ®­îc ®Þnh nghÜa vµ sè hiÖu tÊt c¶ c¸c dßng kh¸c, t¹i ®ã cã tham chiÕu

(refer to) tíi ký hiÖu nµy. §Ó MASM.EXE sinh ra file nµy khi ®­îc hái:

Cross Reference [Nul.crf]:

ta cÇn ®¸nh tªn file (®u«i ngÇm ®Þnh lµ .crf). Sau khi ®· hîp dÞch (ch¹y

MASM.EXE) cÇn ch¹y ch­¬ng tr×nh CREF.EXE

CREF VIDU1; - .MAP - Map listing file (file b¶n ®å ch­¬ng tr×nh)

ViÖc t¹o ra file nµy lµ tuú chän ®èi víi LINK.EXE. File nµy tãm t¾t vÒ c¸c ®o¹n cña ch­¬ng tr×nh, trong mçi ®o¹n nã chØ ra ®Þa chØ offset 'start' vµ 'stop' , chiÒu dµi mçi ®o¹n cña ch­¬ng tr×nh vµ class (lo¹i)

cña c¸c ®o¹n.

§Ó t¹o ra file .MAP ta lµm nh­ sau:

LINK VIDU1,,; (2 dÊu phÈy tr­íc dÊu chÊm phÈy)

L­u ý: - tr­êng hîp cã ®¸nh dÊu '; ' sau tªn cña ch­¬ng tr×nh nguån: MASM.EXE tù ®éng ®Æt tªn file ®Ých lµ vidu1.obj , kh«ng t¹o c¸c file .lst vµ .crf

t­¬ng øng. - tr­êng hîp kh«ng ®¸nh dÊu '; ' sau tªn cña ch­¬ng tr×nh nguån: MASM.EXE

thùc hiÖn theo c¸c b­íc nªu trªn.

- c¸ch sö dông c¸c chØ dÉn cho MASM.EXE ®Ó cã thÓ in c¸c th«ng b¸o lçi ra m¸y in, t¹o c¸c file tham chiÕu chÐo, ®Þnh trang in (sè dßng/1 trang,

sè cét mçi dßng) ...

* sau b­íc nµy Assembler míi t¹o ra File vidu1.obj; ®©y lµ mét File trung gian, gäi lµ File ®Ých (Object file), nã chøa ch­¬ng tr×nh cña chóng ta ë d¹ng ng«n ng÷ m¸y, nh­ng kÌm theo mét sè th«ng tin mµ ch­¬ng tr×nh Link

cña DOS sÏ dïng ®Õn. - söa c¸c lçi do Assembler th«ng b¸o:

nÕu cã lçi, Assembler sÏ th«ng b¸o sè thø tù cña dßng cã lçi, lo¹i lçi, sau ®ã Assembler tiÕp tôc hîp dÞch c¸c dßng ch­¬ng tr×nh nguån tiÕp sau

vµ l¹i th«ng b¸o lçi nÕu gÆp ph¶i.

Ta nªn ghi l¹i c¸c th«ng b¸o lçi vµ STT dßng cã lçi ®Ó söa (cã thÓ in

lu«n ra giÊy b»ng lÖnh Print Screen) lu«n mét lÇn. - hîp dÞch l¹i vµ l¹i söa lçi cho ®Õn khi hÕt lçi

* Mét sè th«ng b¸o lçi cña Macro Assembler:

- Block nesting error:

th«ng b¸o lçi nµy th­êng kÌm theo th«ng b¸o "Open procedures" hoÆc "Open

segments", h·y xem gi¶i thÝch vÒ c¸c th«ng b¸o nµy nh­ ë d­íi ®©y. - End of file, no END directive:

thiÕu chØ thÞ assembler END ë cuèi file hoÆc ph¶i thªm 1 dßng trèng sau

dßng chøa chØ thÞ END. - Must be declared in pass 1:

th«ng b¸o nµy th­êng liªn quan ®Õn gi¶ lÖnh GROUP, cã thÓ ta ch­a ®Þnh

nghÜa mét tªn ®o¹n ®­îc khai b¸o trong gi¶ lÖnh GROUP. - No or Unreadable CS:

MASM cÇn thÊy gi¶ lÖnh ASSUME khi hîp dÞch mét sè chØ thÞ nh­ CALL hay

JMP. - Open procedures:

thiÕu nh·n PROC hay ENDP hoÆc c¸c tªn kh«ng trïng nhau trong cÆp gi¶

lÖnh PROC - ENDP. - Open segments:

thiÕu gi¶ lÖnh Segment hoÆc ENDS hoÆc tªn ®i cïng víi hai gi¶ lÖnh nµy. - Symbol not defined

§©y lµ mét th«ng b¸o lçi th­êng thÊy khi chóng ta míi häc ng«n

ng÷ Assmblly, cÇn kiÓm tra c¸c vÊn ®Ò sau:

+ sö dông mét tªn ch­a khai b¸o hoÆc ®¸nh sai mét tªn ®· ®­îc khai b¸o

+ thiÕu khai b¸o EXTRN mµ ch­¬ng tr×nh l¹i sö dông mét tªn n»m trong Modul ngoµi; hoÆc tªn trong modul ngoµi vµ tªn ®­îc gäi ®Õn kh«ng

trïng nhau (do ta ®¸nh sai ch¼ng h¹n)

B­íc 3 Link (kÕt nèi ch­¬ng tr×nh vµ sè liÖu .v.v...)

ch­¬ng tr×nh LINK cã 2 nhiÖm vô chÝnh: 1./ DOS cã thÓ ®Ó 1 ch­¬ng tr×nh ë chç nµo ®ã do nã s¾p ®Æt cho thuËn tiÖn. ViÖc nµy tr¸nh cho NSD kh«ng ph¶i chØ ra viÖc ®Æt ch­¬ng tr×nh ë ®©u. Muèn cho ch­¬ng tr×nh nguån (vµ sau ®ã lµ d¹ng .obj) sö dông ®­îc ®Æc

®iÓm nµy (relocatable) cÇn ph¶i cã ch­¬ng tr×nh LINK cña DOS. 2./ NSD th­êng viÕt ch­¬ng tr×nh theo c¸c modul, thö riªng rÏ tõng Modul, do vËy sÏ t¹o ra nhiÒu file .obj t­¬ng øng. NhiÖm vô thø 2 cña LINK chÝnh lµ kÕt nèi c¸c object module l¹i thµnh 1 modul duy nhÊt, ch¹y

®­îc.

ThÝ dô LINK MOD1 + MOD2 + MOD3 sÏ kÕt nèi c¸c file MOD1.OBJ,

MOD2.OBJ, MOD3.OBJ ®Ó t¹o thµnh file MOD1.EXE ch¹y ®­îc.

Ta cÇn sö dông ch­¬ng tr×nh Link.exe (lÖnh ngo¹i tró cña DOS) ®Ó t¹o ra

mét file .exe tõ File .obj. - A:\> Link vidu1;

Microsoft 8086 Object Linker

Version 3.02 (C) Copyright Microsoft Corp. 1983, 1984, 1985

Warning: No stack segment

There was an error detected

Error lµ lçi nh­ng chÝnh lµ ®iÒu chóng ta muèn, nã b¸o r»ng ch­a cã ®o¹n

stack. * sau khi thùc hiÖn b­íc nµy, ta cã file vidu1.exe, nãi chung cã thÓ cho

ch¹y ngay ®­îc. Tuy nhiªn ta cÇn nghiªn cøu c¸ch t¹o file .com tr­íc ®·. * Xem tuú chän cña LINK ®Ó t¹o ra file .MAP ®· tr×nh bµy ë b­íc 2.

* Mét sè th«ng b¸o lçi cña LINK

- Fixup offset exceeds field with:

Víi th«ng b¸o nµy ta còng khã t×m ra ®­îc lçi, cã thÓ lµ do cã mét lêi gäi xa tíi mét thñ tôc (Call far) nh­ng trong thñ tôc ®ã l¹i khai b¸o nã lµ near (Proc near). Lçi nµy còng cã thÓ x¶y ra nÕu toµn bé ch­¬ng

tr×nh v­ît qu¸ 64KB, dïng file .MAP cã thÓ thÊy ®­îc ®iÒu nµy.

- Symbol defined more than once:

x¶y ra khi LINK ph¸t hiÖn thÊy 1 biÕn hay thñ tôc ®­îc ®Þnh nghÜa

trong hai file.

- Unresolved externals:

cã thÓ do thiÕu khai b¸o public cho 1 biÕn hay thñ tôc, hoÆc tªn trong

1 thñ tôc external sai.

- Warning: no stack segment

§©y thùc ra kh«ng ph¶i lµ th«ng b¸o lçi mµ lµ lêi nh¾c nhë cña LINK, ta

th­êng lu«n thÊy nã khi LINK c¸c file .OBJ ®Ó t¹o ra c¸c file .COM

B­íc 4. DÞch ch­¬ng tr×nh sang File d¹ng .COM

§Ó t¹o ra file .com, ta cÇn ch­¬ng tr×nh Exe2bin.exe cña DOS. Ch­¬ng tr×nh nµy chuyÓn 1 file d¹ng .exe hay .bin sang file d¹ng .com - Exe2bin vidu1 vidu1.com

Chóng ta dïng lÖnh DIR cña DOS ®Ó kiÓm tra sù tån t¹i cña vidu1.com trªn

®Üa.

§«i khi cã thÓ thÊy th«ng b¸o lçi 'File cannot be converted', ®©y lµ th«ng b¸o lçi duy nhÊt cña EXE2BIN, nguyªn nh©n sinh ra lçi nµy cã thÓ

nh­ sau:

+ c¸c ®o¹n xÕp sai thø tù, cÇn kiÓm tra l¹i b»ng file .MAP (xem phô lôc

C trong s¸ch 'NhËp m«n Assembler', Peter Norton.

+ ch­¬ng tr×nh chÝnh kh«ng ®øng ®Çu tiªn trong lÖnh LINK.

+ ch­¬ng tr×nh chÝnh kh«ng cã chØ thÞ Assembler ORG 100H ®øng liÒn d­íi

khai b¸o CODE_SEG SEGMENT PUBLIC.

Ngoµi ra cÇn kiÓm tra l¹i xem sau chØ thÞ END cuèi cïng trong modul ch­¬ng tr×nh chÝnh ®· ghi nh·n cña lÖnh ®Çu tiªn cña ch­¬ng tr×nh ch­a.

- L­u ý: c¸c Version Dos sau 5.0 kh«ng cã File Exe2bin.exe v× DOS kh«ng chñ tr­¬ng hç trî viÖc t¹o c¸c file .com, muèn thùc hiÖn b­íc 4 nµy ta

cÇn ®Æt lÖnh

DEVICE=PATH_NAME\SETVER.EXE

trong file CONFIG.SYS, tÊt nhiªn cÇn ph¶i cã SETVER.EXE t¹i ®­êng dÉn

PATH_NAME.

B­íc 5. Ch¹y thö ch­¬ng tr×nh

- NÕu ch­¬ng tr×nh kh«ng dµi, th× tèt nhÊt lµ dïng Debug ®Ó ch¹y thö tõng b­íc LÖnh T (Trace), theo dâi qu¸ tr×nh biÕn ®æi néi dung c¸c thanh ghi,

viÖc chuyÓn sè liÖu .v.v... - NÕu chia ch­¬ng tr×nh thµnh tõng khèi, cã thÓ hîp dÞch tõng khèi vµ cho

ch¹y thö tõng Modul, sau khi ch¹y tèt míi ghÐp nèi l¹i víi nhau. - NÕu cã lçi th× lÆp l¹i c¸c b­íc trªn

II. H­íng dÉn sö dông ch­¬ng tr×nh Debug

Tr×nh bµy 19 lÖnh cña DEBUG, 4 lÖnh cßn l¹i liªn quan ®Õn bé nhí më réng

XMS vµ EMS kh«ng cÇn tr×nh bµy.

Bµi tËp 2.1 In ra mµn h×nh 1 ký tù (ký tù 'A')

Bµi tËp 2.2 In ra mµn h×nh mét x©u ký tù 'Darling, I love you'

Bµi tËp 2.3 hái tªn ng­êi (tõ bµn phÝm) råi göi lêi chµo ng­êi ®ã

Bµi tËp 2.4 NhËn vµo tõ bµn phÝm 5 x©u ký tù (n <= 5); in ra mµn h×nh 1 trong 5 x©u ký tù ®ã

Bµi tËp 2_1 (BT2_1.ASM) In ra mµn h×nh 1 ký tù (ký tù 'A')

Seg_a segment:100 jmp 103

assume cs:seg_a, ds:seg_a:102 db 41

org 100h:103 mov ah,02 start: jmp short loc_1:105 mov dl,[102] data_1 db 41h:109 int 21 loc_1 mov ah,02:10b int 20

mov dl,data_1

int 21h int 20h seg_a ends end start

;--------------------------------------------------------------------------

Bµi tËp 2.2 In ra mµn h×nh mét x©u ký tù 'Darling, I love you'

Seg_a segment:100 jmp 118

assume cs:seg_a, ds:seg_a:102 db'Darling, I love you$'

org 100h:118 mov dx,0102 start: jmp short loc_1:11b mov ah,09 data_1 db'Darling, I love you$':11d int 21 loc_1 mov dx,offset data_1:11f int 20

mov ah,09

int 21

int 20 seg_a ends end start

;--------------------------------------------------------------------------

Bµi tËp 2.3 hái tªn ng­êi (tõ bµn phÝm) råi göi lêi chµo ng­êi ®ã ;========================================================================== ;== BT2_3.LST == ;== Created: 4-Aug-95 == ;== Passes: 5 Analysis Options on: QRSUX == ;========================================================================== SEG_A SEGMENT BYTE PUBLIC

ASSUME CS:SEG_A, DS:SEG_A

ORG 100h

BT2_3 PROC FAR

94E0:0100 START: 94E0:0100 EB 25 JMP SHORT LOC_1;(0127) 94E0:0102 90 DB 90H 94E0:0103 0D 0A 24 DATA_1 DB 0DH, 0AH, '$' 94E0:0106 57 68 61 74 20 69 DATA_2 DB 'What is your name ?: $' 94E0:010C 73 20 79 6F 75 72;xref 94E0:0129, 012C 94E0:0112 20 6E 61 6D 65 20 94E0:0118 3F 20 3A 20 24 94E0:011D 48 65 6C 6C 6F 20 DATA_3 DB 'Hello Mr.$';xref 94E0:0143, 0146 94E0:0123 4D 72 2E 24 94E0:0127 LOC_1:;xref 94E0:0100 94E0:0127 B4 09 MOV AH,9 94E0:0129 .BA 0106 MOV DX,OFFSET DATA_2 94E0:012C CD 21 INT 21H;DOS Service 09h

;display char string at ds:dx 94E0:012E B4 0A MOV AH,0AH 94E0:0130 .BA 015F MOV DX,OFFSET DATA_4 94E0:0133 8B DA MOV BX,DX 94E0:0135 C6 07 FE MOV BYTE PTR [BX],0FEH 94E0:0138 CD 21 INT 21H; DOS Service 0Ah

; get keybd line, put at ds:dx 94E0:013A B4 09 MOV AH,9 94E0:013C .BA 0103 MOV DX,OFFSET DATA_1 94E0:013F CD 21 INT 21H 94E0:0141 B4 09 MOV AH,9 94E0:0143 .BA 011D MOV DX,OFFSET DATA_3 94E0:0146 CD 21 INT 21H 94E0:0148 B4 09 MOV AH,9 94E0:014A .BB 015F MOV BX,OFFSET DATA_4 94E0:014D 8B D3 MOV DX,BX 94E0:014F 02 5F 01 ADD BL,[BX+1] 94E0:0152 83 C3 02 ADD BX,2 94E0:0155 C6 07 24 MOV BYTE PTR [BX],24H; '$' 94E0:0158 83 C2 02 ADD DX,2 94E0:015B CD 21 INT 21H 94E0:015D CD 20 INT 20H; Program Terminate 94E0:015F 3F DATA_4 DB 3FH; '?'

BT2_3 ENDP SEG_A ENDS

END START

;--------------------------------------------------------------------------

Bµi tËp 2.4 NhËn vµo tõ bµn phÝm 5 x©u ký tù (n <= 5); in ra mµn h×nh 1 trong 5 x©u ký tù ®ã

;GET 5 STRING FROM KBD, THEN ASK WHICH OF THEM WILL BE SEND TO SCR CGROUP GROUP CODE_SEG

ASSUME CS: CGROUP CODE_SEG SEGMENT BYTE PUBLIC

ORG 100H

START: JMP FIRST

MSG DB "Enter 5 string ",0DH,0AH,"$" MSG1 DB "one:$" MSG2 DB "two:$" MSG3 DB "three:$" MSG4 DB "four:$" MSG5 DB "five:$" ASK_FOR_OUT DB "Which string will be out ?: $" NUMBER DB 0

FIRST: MOV AH, 09H

MOV DX,OFFSET MSG

INT 21H

MOV AH,09H;ask for 1st string

MOV DX,OFFSET MSG1

INT 21H

MOV AH,0AH

MOV DX,OFFSET STR1

INT 21H

CALL CR_LF

MOV AH,09H;ask for 2nd string

MOV DX,OFFSET MSG2

INT 21H

MOV AH,0AH

MOV DX,OFFSET STR2

INT 21H

CALL CR_LF

MOV AH,09H;ask for 3rd string

MOV DX,OFFSET MSG3

INT 21H

MOV AH,0AH

MOV DX,OFFSET STR3

INT 21H

CALL CR_LF

MOV AH,09H;ask for 4th string

MOV DX,OFFSET MSG4

INT 21H

MOV AH,0AH

MOV DX,OFFSET STR4

INT 21H

CALL CR_LF

MOV AH,09H;ask for 5th string

MOV DX,OFFSET MSG5

INT 21H

MOV AH,0AH

MOV DX,OFFSET STR5

INT 21H

CALL CR_LF

MOV AH,09H

MOV DX,OFFSET ASK_FOR_OUT

INT 21H

MOV AH,01;GET STRING NUMBER TO SEND OUT

INT 21H

CALL CR_LF

SUB AL,30H

MOV NUMBER,AL

MOV AX,100H;256d

XOR CX,CX

MOV CL,NUMBER

DEC CL MUL CX

ADD AX,OFFSET STR1

MOV BX,AX

MOV CL,[BX+1]

ADD BX,CX

ADD BX,2

MOV BYTE PTR [BX],"$"

MOV DX,AX

ADD DX,2

MOV AH,09H

INT 21H

INT 20H ;-------------------------------------------------------------------------- CR_LF PROC NEAR

PUSH AX PUSH DX

MOV AH,02 MOV DL,13

INT 21H

MOV DL,10

INT 21H

POP DX POP AX

RET CR_LF ENDP ;-------------------------------------------------------------------------- STR1 DB 0FEH,?,0FEH DUP(0) STR2 DB 0FEH,?,0FEH DUP(0) STR3 DB 0FEH,?,0FEH DUP(0) STR4 DB 0FEH,?,0FEH DUP(0) STR5 DB 0FEH,?,0FEH DUP(0)

CODE_SEG ENDS END START

Bµi gi¶ng m«n Assembly Language, Bµi 2 - $ - NguyÔn §×nh ViÖt, Khoa CNTT, §HQGVN,HN 1995 ---------------------------------------------------------------------------

Bµi 3 D¹ng cña 1 ch­¬ng tr×nh mÉu

Bµi nµy tr×nh bµy

-c¸c m« h×nh tæng qu¸t ®Ó x©y dùng nªn 1 ch­¬ng tr×nh. MÉu ch­¬ng tr×nh nµy lµ chung nhÊt cho mäi ch­¬ng tr×nh. Khi chóng ta viÕt ch­¬ng tr×nh cña m×nh, ta chØ cÇn ®iÒn sè liÖu vµ c¸c chØ thÞ cho ch­¬ng tr×nh cô thÓ ®ã.

-vÒ sù kh¸c nhau gi÷a .com files vµ .exe files

I. Main Program Module: M« dul ch­¬ng tr×nh chÝnh

Sau ®©u lµ 1 mÉu chung cho 1 modul nguån, nã bao gåm 1 ch­¬ng tr×nh ®Çy ®ñ hoÆc nã sÏ ®­îc kÕt nèi víi 1 hoÆc 1 sè modul (phô) kh¸c ®Ó t¹o nªn 1 ch­¬ng tr×nh.

PAGE ,132 TITLE (Insert title here) SUBTTL (Insert sub_title here) (Insert EXTRN statement, if approriate)

STACK SEGMENT PARA PUBLIC 'STACK'

DB 64 DUP('STACK ') STACK ENDS

DSEG SEGMENT PARA PUBLIC 'DATA'

(Insert data here) DSEG ENDS

CSEG SEGMENT PARA PUBLIC 'CODE'

ASSUME CS:CSEG, DS:DSEG, SS:STACK

ENTRY PROC FAR;entry point

;set up the stack to contain the proper values so this program ;can return to DOS or Debug

PUSH DS

SUB AX,AX

PUSH AX

;initialize the data segment address

MOV AX,DSEG

MOV DS,AX

(insert instructions here)

RET;return to DOS or Debug ENTRY ENDP CSEG ENDS END ENTRY

chó ý mÉu nµy lµ ch­¬ng tr×nh tæng qu¸t, ta cã thÓ söa ®æi 1 sè ®iÓm sau: -Title: Tiªu ®Ò th­êng chØ ra tªn File trªn ®Üa cña ch­¬ng tr×nh nµy -NÕu Modul nµy cã chøa tham chiÕu tíi c¸c thñ tôc hoÆc biÕn, mµ chóng ®­îc dÞnh nghÜa ë Modul phô, th× nhÊt thiÕt ph¶i cã chØ thÞ EXTRN ®Ó liÖt kª

danh s¸ch chóng. -Ta dïng AX ®Ó khëi t¹o STACK vµ ®Þa chØ ®o¹n d÷ liÖu, nh­ng còng cã thÓ

dïng c¸c thanh ghi ®a n¨ng kh¸c.

V× vËy, nÕu ch­¬ng tr×nh cña ta nhËn gi¸ trÞ vµo cña ng­êi sö dông tõ thanh ghi AX, khi ®ã ta b¾t buéc ph¶i dïng thanh ghi kh¸c (vÝ dô DI) ®Ó

khëi t¹o. -VÒ thñ tôc:

C¸c Pseudo_Op Proc vµ Endp ®¸nh dÊu ®iÓm ®Çu vµ ®iÓm cuèi cña 1 thñ tôc. Thñ tôc lµ mét khèi lÖnh mµ cã thÓ ®­îc gäi thùc hiÖn tõ nhiÒu n¬i trong

ch­¬ng tr×nh.

NÕu thñ tôc kÕt thóc b»ng lÖnh RET (Return from Procedure) th× ta cã thÓ gäi nã lµ mét ch­¬ng tr×nh con (Subroutine). LÖnh RET lµm cho MPU thùc hiÖn ch­¬ng tr×nh ®· gäi (tíi thñ tôc)tiÕp tôc thùc hiÖn lÖnh (tr×nh tù)

sau lêi gäi ®ã.

Mét thñ tôc lu«n cã mét trong hai thuéc tÝnh: NEAR vµ FAR ®­îc chØ

ra bëi Operand ®øng ngay sau Proc directive, trong ®ã NEAR lµ ngÇm ®Þnh.

+ Proc_name PROC NEAR: thñ tôc Proc_name chØ cã thÓ ®­îc gäi tõ trong chÝnh SEGMENT chøa thñ tôc ®ã. Khi gÆp lêi gäi tíi 1 thñ tôc NEAR,

MPU chØ cÊt Offset (IP) cña ®Þa chØ trë vÒ lªn Stack.

Víi ch­¬ng tr×nh d¹ng .COM, lu«n lu«n dïng NEAR.

+ Proc_name PROC FAR: thñ tôc Proc_name cã thÓ ®­îc gäi tõ bÊt cø

SEGMENT nµo. Khi gÆp lêi gäi tíi 1 thñ tôc FAR, MPU chØ cÊt ®Þa chØ

trë CS:IP lªn Stack.

Víi ch­¬ng tr×nh d¹ng .EXE, lu«n lu«n dïng FAR cho thñ tôc chÝnh.

II. SECONDARY Module: M« dul phô

sau ®©y lµ mÉu modul phô, sÏ ®­îc Linked víi Main Modul ë vÝ dô trªn

Page ,132 Title (®iÒn c¸c tiªu ®Ò ë ®©y.) public pname

(khai b¸o public cho c¸c biÕn t¹i ®©y nÕu cÇn thiÕt) dseg segment para public 'data'

(®Æt c¸c d÷ liÖu t¹i ®©y) dseg ends cseg segment para public 'code'

assume cs:cseg, ds:dseg pname proc near

(®Æt c¸c lÖnh ë ®©y)

ret;trë l¹i ch­¬ng tr×nh gäi pname endp cseg ends

end

Chó ý cã thÓ söa ®æi l¹i mét sè khai b¸o nh­ sau:

1. V× Code segment cña modul phô nµy cã cïng tªn (cseg) víi tªn cña code segment thuéc modul chÝnh, nªn ta khai b¸o Pname proc near. §Ó gäi Pname tõ segment kh¸c, ph¶i thay near b»ng far. 2. v× data segment cña modul phô nµy cã cïng tªn víi data segment cña modul chÝnh, nªn ta kh«ng cÇn khëi t¹o DS (kh«ng cÇn assume ds:dseg). NÕu modul phô nµy dïng data segment kh¸c tªn víi data segment cña modul chÝnh th× ta ph¶i dïng pseudo op: assume ds: tªn data segment <> dseg. 3. ë ®©y ta ®Æt tªn thñ tôc lµ Pname, khi lËp ch­¬ng tr×nh cña m×nh, ta cã thÓ thay b»ng tªn theo ý ta ë c¸c vÞ trÝ: + khai b¸o public ë trªn ®Çu thñ tôc + khai b¸o proc ë gi÷a + khai b¸o endp ë cuèi 4. ë modul phô, ta cã khai b¸o public ®Ó t­¬ng øng víi khai b¸o Extrn ë modul chÝnh. trong 2 vÝ dô nµy, nÕu modul chÝnh gäi modul phô, th× ë modul chÝnh ph¶i cã khai b¸o

extrn pname: near III. .com file

DOS cã thÓ ch¹y ®­îc 2 lo¹i file ch­¬ng tr×nh viÕt b»ng assembly language, ®ã lµ .com file vµ .exe file. Nãi chung ng­êi sö dông dïng .exe file khi cÇn t¹o c¸c ch­¬ng tr×nh lín, dµi h¬n 64 KB, vµ dïng .com file khi cÇn t¹o c¸c file ch­¬ng tr×nh <= 64KB. viÖc t¹o ra .com file cÇn theo mét sè quy t¾c kh¸c .exe file, sau ®©y lµ mét sè ®iÓm quan träng:

1. C¸c quy t¾c ®Ó t¹o ra .com file

1/ bá qua tÊt c¶ c¸c stack, data vµ extra segments.

2/ chØ x¸c ®Þnh 1 code segment, nh­ng ®Ó tÊt c¶ lÖnh vµ d÷ liÖu vµo ®ã

3/ ë assume pseudo-op ta trá tÊt c¶ 4 thanh ghi ®o¹n tíi code segment.

vÝ dô

cseg segment para public 'code'

assume cs:cseg, ds:cseg, es: cseg, ss: cseg

4/ ®Æt tr­íc ®iÓm vµo cña ch­¬ng tr×nh (lÖnh ®Çu tiªn cña ch tr) víi

chØ thÞ assembler

org 100h; ®Ó dµnh 256 byte ®Çu tiªn cho PSP (Program segment prefix)

5/ ®Æt tÊt c¶ c¸c d÷ liÖu tr­íc c¸c lÖnh cña ch tr×nh. TÊt nhiªn tr­íc

d÷ liÖu ph¶i cã 1 lÖnh JMP ®Ó nh¶y qua vïng d÷ liÖu

vÝ dô entry: jmp our_prog

source db 10,20,30,40

dest db 4 dup(?)

our_prog proc near

(c¸c lÖnh ...)

6/ x¸c ®Þnh tÊt c¶ c¸c Procedure lµ near (ngÇm ®Þnh)

7/ cuèi ch­¬ng tr×nh sau END pseudo_op ph¶i cã nh·n cña lÖnh ®Çu tiªn

cña ch­¬ng tr×nh

vÝ dô

end entry

2. C¸c quy t¾c t¹o c¸c modul phô cña .com file

còng tu©n theo c¸c quy t¾c trªn, nh­ng cÇn l­u ý: - ®Æt tªn cho segment ë modul phô gièng tªn segment ë modul chÝnh

vÝ dô tªn cseg dïng ë c¶ modul chÝnh lÉn phô. - còng gièng nh­ ë .exe file, ë lÖnh END cuèi modul phô, kh«ng ®­îc viÕt

nh·n sau END

3. MÉu cho 1 .com file

MÉu cho 1 m« ®un chÝnh

Page ,132 Title (ta ®Ó tiªu ®Ò ë ®©y) (®Æt khai b¸o Extrn t¹i ®©y nÕu cÇn)

Cseg segment Para Public 'Code'

Assume cs: cseg, ds: cseg, es:cseg, ss:cseg

org 100h

Entry: jmp start

(vïng data) Start proc near

(c¸c lÖnh cña thñ tôc Start)

ret (trë vÒ ch tr×nh gäi, hoÆc DOS, hoÆc Debug) Start endp Cseg ends

end Entry

MÉu cho 1 m« ®un phô (ch tr×nh con) cña .com file

Page ,132 Title (ta ®Ó tiªu ®Ò ë ®©y)

public Pname (®Æt Public cho c¸c biÕn t¹i ®©y, nÕu cã)

Cseg segment Para Public 'Code'

Assume cs: cseg, ds: cseg, es:cseg, ss:cseg

jmp Pname; nh¶y qua miÒn d÷ liÖu

(vïng data)

Pname proc near

(c¸c lÖnh cña thñ tôc Pname)

ret (trë vÒ ch tr×nh gäi) Pname endp Cseg ends

end

3. .EXE file

4. ¦u ®iÓm vµ nh­îc ®iÓm cña .Com files so víi .exe files

4.1 ­u ®iÓm

1) ng¾n h¬n h¼n so víi .exe files

2) nãi chung n¹p vµo bé nhí nhanh h¬n .exe files

3) dÔ viÕt h¬n v× kh«ng ph¶i khëi t¹o c¸c thanh ghi cho Stack, DS,

ES

4) c¸c ch tr×nh th­êng tró ph¶i viÕt d­íi d¹ng .com 4.1 nh­îc ®iÓm

1) Kh«ng thÓ dµi h¬n 64 KB

2) chóng yªu cÇu ph­¬ng ph¸p viÕt ch tr×nh chÆt chÏ h¬n

3) v× chØ sö dông cã 1 segment nªn kh«ng cã sù t¸ch biÖt hoµn toµn

gi÷a c¸c lÖnh vµ sè liÖu

4) Kh«ng truy nhËp ®­îc c¸c thñ tôc hoÆc sè liÖu ë c¸c segment kh¸c, do ®ã rÊt khã sö dông c¸c modul ®­îc NSD kh¸c x©y dùng, nÕu c¸c modul nµy ®Æt tªn cho segment mµ chóng dïng kh¸c tªn segment cña

ta.

Bµi tËp 3.1 NhËn vµo tõ bµn phÝm 2 con sè 8 bit, kh«ng dÊu (sè d­¬ng), in ra mµn h×nh tÝch cña chóng.

;BT3_1.ASM Get in 2 un_sign 8 bit number2 (0=< and <= 255) ;Then print out the product

CODE_SEG SEGMENT BYTE PUBLIC

ASSUME CS:CODE_SEG, DS:CODE_SEG

ORG 100H

START: JMP FIRST

MSG DB "Enter 2 number (0 =< x <= 255):$" MSG1 DB "number 1:$" MSG2 DB "number 2:$" msg3 DB "The Product is: $" NUMBER_1 DB 0 NUMBER_2 DB 0 RESULT LABEL BYTE PRODUCT DW 0

FIRST: MOV AH,09H

MOV DX,OFFSET MSG

INT 21H

CALL CR_LF

MOV AH,09H;ask for the 1st number

MOV DX,OFFSET MSG1

INT 21H

call Get_an_Int_num

CMP Ax,255

Ja EXIT

mov number_1,al

CALL CR_LF

MOV AH,09H;ask for the 2nd number

MOV DX,OFFSET MSG2

INT 21H

call Get_an_Int_num

CMP Ax,255

JA EXIT

mov number_2,al

CALL CR_LF

mov bl,number_1

mul bl PUSH ax

MOV AH,09H

MOV DX,OFFSET MSG3

INT 21H

pop ax

CALL WRITE_INT_NUMBER

EXIT: INT 20H

;-------------------------------------------------------------------------- ;This procedure get in an integer number between 0..255 ;Return it to calling prog. in AX ;-------------------------------------------------------------------------- Get_an_Int_num PROC; 0 <= X <= 255

jmp $+4

temp_var Dw 0

push bx push cx push dx

xor dx,dx

mov temp_var,0

mov cx,1;CX counts digits typed in loop_2: Call Get_a_dec_digit

cmp al,0Dh je exit_2 sub al,30h

xor ah,ah mov dx,ax

mov ax,temp_var

cmp cx,1

je sum_up

mov bl,10

push dx

mul bl pop dx sum_up: add ax,dx ; cmp ax,255 ; ja exit_2

mov temp_var,ax

inc cx

CMP CX,3

JA EXIT_2 jmp loop_2 exit_2: mov ax,temp_var

pop dx pop cx pop bx

ret Get_an_Int_num ENDP ;-------------------------------------------------------------------------- ;This procedure gets in a decimal digit between 0..9 ;checks input for digit ;Return it to calling prog. in AL ;-------------------------------------------------------------------------- Get_a_dec_digit PROC loop_1:

push dx

mov ah,08

int 21h

cmp al,0Dh je exit_1 cmp al,30h jb loop_1 cmp al,39h ja loop_1

mov dl,al mov ah,02

int 21h exit_1: pop dx

ret Get_a_dec_digit ENDP

;-------------------------------------------------------------------------- ;This Prog. will Write out an Integer number in AX (Int number) ;let refer to example in 'Nhap mon Assembler', Peter norton, Pg 83. WRITE_INT_NUMBER PROC NEAR

MOV BX,10 XOR CX,CX NONE_ZERO: XOR DX,DX

DIV BX PUSH DX INC CX

OR AX,AX

JNZ NONE_ZERO WRITE_DIGIT_LOOP:

POP DX

ADD DL,'0'

MOV AH,02

INT 21H

LOOP WRITE_DIGIT_LOOP

RET WRITE_INT_NUMBER ENDP

;-------------------------------------------------------------------------- CR_LF PROC NEAR

PUSH AX PUSH DX

MOV AH,02 MOV DL,13

INT 21H

MOV DL,10

INT 21H

POP DX POP AX

RET CR_LF ENDP

;-------------------------------------------------------------------------- CODE_SEG ENDS END START

Bµi gi¶ng m«n Assembly Language, Bµi 3 - $ - NguyÔn §×nh ViÖt, Khoa CNTT, §HQGVN,HN 1995 ---------------------------------------------------------------------------

Bµi 5 C¸c thao víi File

TLTK: 1. Assembly Language for Pascal Programmers; Steven Holzner, Brady

Page 71

2. PC Intern System Programming, Michael Tischer, Chapter 19

Môc ®Ých cña tÝnh to¸n lµ t¹o ra c¸c OUTPUT cã thÓ sö dông ®­îc bªn ngoµi ch­¬ng tr×nh. Output lªn mµn h×nh lµ mét trong c¸c ph­¬ng ph¸p nh­ vËy, nh­ng sö dông File rÊt quan träng v× nã lµ bé nhí ngoµi, cã thÓ l­u tr÷ th«ng tin ngay c¶ khi t¾t m¸y.

Ta cã thÓ in ra mét File, cã thÓ tæ chøc mét file ®Ó l­u gi÷ d÷ liÖu vµ c¸c ký tù cho 1 Editor, file cã thÓ lµ chÝnh ch­¬ng tr×nh.

DOS cã mét bé dÞch vô vÒ File rÊt phong phó, phÇn lín lµ c¸c dÞch vô trong INT 21h.

C¸c Service cña INT 21h represent most of the resources mµ nh÷ng ng­êi lËp tr×nh sö dông trong DOS. Bªn c¹nh INT 20h (kÕt thóc ch­¬ng tr×nh) vµ c¸c ng¾t cho phÐp ®Æt mét ch­¬ng tr×nh th­êng tró, nh÷ng ng¾t kh¸c thùc sù cÇn thiÕt lµ c¸c ng¾t cho phÐp ®äc/ghi ®Üa, INT 25h vµ INT 26h. Trong khi ®ã sè l­îng c¸c Service cña INT 21h kh«ng ngõng t¨ng lªn, ë DOS version 4.0 con sè ®· lªn tíi 6Ch (=108d).

I. File Control Blocks (FCB)

Tr­íc DOS 2.0, DOS th­êng lµm viÖc víi File th«ng qua FCBs. FCBs gi÷ c¸c th«ng tin vÒ file: Filename, tªn æ ®Üa chøa file, kÝch th­íc file. Tuy nhiªn FCBs h¹n chÕ ®é dµi tèi ®a cña File lµ 11 character. Tõ DOS 2.0 trë ®i, IBM ®­a ra Directory vµ v× vËy cÇn ph¶i chØ ra ®­êng dÉn tíi file, tÊt nhiªn 11 ký tù nãi chung lµ kh«ng ®ñ, ®ã lµ lý do mµ File handles ®· ®­îc IBM (vµ Microsoft) ®­a ra.

II. File handles

Mét File handle lµ mét tõ 16 bit lµm ®¹i diÖn cho 1 file tr­íc DOS (A file handle is a 16-bit word that stands, to DOS, for a file.) Khi chóng ta muèn sö dông mét file, ta trao cho DOS filename cßn DOS th× tr¶ l¹i mét File handle trong mét thanh ghi (th­êng lµ AX). Khi chóng ta muèn lµm mét viÖc g× ®ã víi file - rename file, open file, read from file ... th× dÞch vô cña INT 21h sÏ cÇn file handle 16 bit ®ã trong mét thanh ghi nµo ®ã (th­êng lµ BX).

Tr×nh tù ®iÓn h×nh ®Ó Copy mét file rÊt gièng víi trong ng«n ng÷ lËp tr×nh Pascal - ta sÏ më, ®äc, ghi vµ ®ãng file l¹i - ng­ng ta sÏ sö dông DOS chø kh«ng ph¶i lµ PASCAL ë ®©y.

Ta thùc hiÖn c«ng viÖc ®ã nh­ sau: - t¹o mét x©u ký tù tªn file (ASCIIZ string) trong bé nhí, vÝ dô:

FILE_36 DB "C:\Novel\Chapter.89",0 - më file vµ lÊy file handle cho nã (INT 21h service 3Dh). - t¹o mét file míi (INT 21h service 3Ch). - ®äc tõ file nguån (file thø nhÊt) (INT 21h service 3Fh). - viÕt vµo file míi (file ®Ých hay file thø hai) (INT 21h service 40h). - sau ®ã ®ãng c¶ hai file l¹i (INT 21h service 3Eh). service 3Fh gièng nh­ Read() service 40h gièng nh­ Write() Còng gièng nh­ trong Pascal, chóng ta cã thÓ coi c¸c thiÕt bÞ (devices) nh­ c¸c file logic. §Æc biÖt chóng ta cã thÓ sö dông Predefined handle ®Ó truy cËp tíi c¸c thiÕt bÞ vËt lý kh¸c nhau.

Sau ®©y lµ mét sè Predefined handles:

handle Device

0 Standard Input (STDIN), usually keyboard 1 Standard Output (STDOUT), usually screen

2 Standard Erro device (STDERR)

3 Standard Auxiliary device (STDAUX)

4 Standard Printer

ThÝ dô, nÕu chóng ta chän service 40h vµ trao gi¸ trÞ 04h cho file handle th× Output sÏ ®i ra m¸y in.

II. C¸c dÞch vô file handle cña DOS vµ c¸c m· lçi (error codes)

1. C¸c dÞch vô File Handle

Cã rÊt nhiÒu dÞch vô file handle cña DOS, sau ®©y lµ mét sè service:

File Handle Service Number You set It Returns --------------------------------------------------------------------- Create Subdirectory 39h DS:DX to ASCIIZ if CY=1, AX chøa m· lçi

string Delete Subdirectory 3Ah DS:DX to ASCIIZ if CY=1, AX chøa m· lçi

string Change Directory 3Bh DS:DX to ASCIIZ if CY=1, AX chøa m· lçi

string Create File 3Ch DS:DX to ASCIIZ if CY=1, AX chøa m· lçi

string if CY=0

CX= Attribute Open File 3Dh DS:DX to ASCIIZ if CY=1, AX chøa m· lçi string if CY=0, AX=File handle

AL=mode Close File 3Eh BX=File handle if CY=1, AX chøa m· lçi Read from File 3Fh BX=Handle if CY=1, AX chøa m· lçi CX=#Byte wanted if CY=0, AX=#Byte read

DS:DX=Buffer Write to File 40h BX=Handle if CY=1, AX chøa m· lçi CX=#Byte wanted

DS:DX=Buffer Delete a File 41h DS:DX to ASCIIZ if CY=1, AX chøa m· lçi string Move Read/Write pointer 42h CX:DX=#Bytes to if CY=1, AX chøa m· lçi

move if CY=0, DX:AX=new

BX=File Handle location in file.

AL="Methode" Find 1st Matching file 4Eh DS:DX to ASCIIZ if CY=1, AX chøa m· lçi

CX=Attribute if CY=0 then DTA has

21 bytes reserved

1 byte: file's attrib.

1 word: file's time 1 word: file's date

1 Dword: file's size 13 byte: ASCIIZ name Find next Matching file 4Fh DTA as set same as for 4Eh

by service 4Eh Rename File 56h DS:DX to ASCIIZ if CY=1, AX chøa m· lçi

ES:DI to new

name (also ASCIIZ) ---------------------------------------------------------------------

Cßn cã rÊt nhiÒu Serice kh¸c n÷a, trong ®ã cã c¸c Service t¹o c¸c file t¹m (temporary file), lÊy hoÆc ®Æt l¹i c¸c thuéc tÝnh Date, Time cña file ...

1.1. C¸c m· lçi tr¶ vÒ trong AX (Error Codes)

Trong DOS version 4.0 cã 91 m· lçi kh¸c nhau, ë c¸c version sau nµy con sè ®ã cßn lín h¬n. Sau ®©y lµ mét sè m· lçi th­êng gÆp:

Error codes Means

1 Invalid function number

2 File not found

3 Path was not found

4 Too many files open at once

5 Access denied for this operation

6 File handle used is invalid

7 Memory Control Blocks destroyed

8 Insufficient memory

15 Invalid drive was specified

16 Cannot delete current directory

19 Cannot write on a write-protected diskette

21 Drive not ready 23 Disk data error 25 Disk seek error

27 Sector not found

28 Printer needs paper

29 Write fault

30 Read fault

61 Print queue is full 1.2. File Access Modes

Mode truy cËp file ®­îc truyÒn qua AL, cã c¸c Mode sau:

Access Mode for Opening Files Means

0 Open file for Read only 1 Open file for Write only

2 Open file for both Read and Write

1.3. C¸c thuéc tÝnh cña File (kh«ng ®­îc lµ tªn nh·n ®Üa) truyÒn qua CX

File Attribute Means

0 Plain old file

1 Read-Only

2 Hidden File (Hidden from directory searches)

4 A System file

8 Used for the Volume label of a Disk

10 This file name is the name of a subdirectory

1.4. C¸ch dÞch chuyÓn Read/Write Pointer khi dïng service 42h

( Methods for INT 21h Service 42h)

Method (in AL) Means

0 Set R/W pointer to CX:DX bytes from the beginng of the file

1 Move R/W pointer CX:DX bytes from where it is now

2 Set R/W pointer to CX:DX bytes from end of file

Note: VÞ trÝ míi cña R/W pointer ®­îc tr¶ vÒ trong DX:AX

if CF=CY=1, m· lçi tr¶ vÒ trong AX

2. Ch­¬ng tr×nh thÝ dô Program RUBOUT

§©y lµ mét ch­¬ng tr×nh ®¬n gi¶n nhÊt - xo¸ mét file, sö dông Service 41h. Service nµy kh«ng ®ßi hái 1 file handle ®Ó xo¸ file, nã chØ cÇn mét ASCIIZ string cho tªn file (cã c¶ ®­êng dÉn).

;------------------------------------------------------------------------- ;Program Rubout.asm it will delete a file by specifying file name ;-------------------------------------------------------------------------

Code Segment

Assume CS:Code, DS: Code org 100h start: jmp rubout

the_buffer db 50

byte_typed db 0

characters db 50 dup(0)

prompt db "File to delete ? $"

ok_message db "File deleted $"

not_ok_message db "File NOT deleted $" rubout proc near

mov dx, offset prompt

mov ah,9

int 21h

mov AH,0AH

mov dx, offset the_buffer

int 21h

mov bh,0

mov bl, byte_typed

add bx, offset characters

mov byte ptr[bx],0

mov dx, offset characters

mov ah,41h

int 21h

jnc all_ok

mov dx, offset not_ok_message

jmp print all_ok: mov dx, offset ok_message print: mov ah,09

int 21h exit: int 20h rubout endp

end start

3. Ch­¬ng tr×nh minh ho¹: Program BACK.ASM

§©y lµ ch­¬ng tr×nh minh ho¹ c¸ch thøc mµ Assembly language cã thÓ lµm viÖc víi data cña file. Ch­¬ng trinh nµy sÏ t¹o mét file l­u kiÓu .BAK cña mét file ®· cã trªn ®Üa do ta chØ ®Þnh tªn cña file ®ã ra. ThÝ dô, nÕu ta ch¹y BACK.COM råi chØ ra tªn 1 file NOVEL.ONE th× BACK.COM sÏ t¹o ra mét file míi NOVEL.BAK lµ b¶n sao cña file trªn.

BACK.COM chØ lµ mét ch­¬ng tr×nh minh ho¹, trong ®ã tÊt c¶ m· lÖnh cña ch­¬ng tr×nh vµ d÷ liÖu mµ nã ®äc tõ file nguån (chØ ®äc mét lÇn) ®Òu ®Æt trong mét ®o¹n, chÝnh v× vËy mµ file nguån lµm vÝ dô ph¶i cã kÝch th­íc h¹n chÕ <= 60 KB. TÊt nhiªn ta cã thÓ c¶i tiÕn thªm mét chót ®Ó BACK.COM cã thÓ COPY c¸c file kÝch th­íc tuú ý. Ngoµi ra ®Ó ®¬n gi¶n ho¸ ch­¬ng tr×nh, tªn file ®­a vµo sÏ kh«ng cã ®­êng dÉn.

ViÖc sö dông file handle ®Ó lµm viÖc víi file gióp ta cã thÓ lµm viÖc trùc tiÕp víi data cña file, kh«ng cßn líp ®Öm (buffer) trung gian n÷a, ta cã thÓ ®äc bao nhiªu byte tuú ý, ch¼ng h¹n 12 bytes, 279 bytes ...

3.1 Stack cña file .COM (The .COM file stack)

§©y lµ mét ®iÓm quan träng khi ta thao t¸c víi mét l­îng sè liÖu lín, thÝ dô nh­ khi copy file. DOS sö dông stack ®Ó chøa ®Þa chØ trë vÒ khi nã gÆp mét lÖnh CALL; chóng ta dïng stack cïng víi c¸c lÖnh PUSH, POP ®Ó l­u gi÷ c¸c th«ng tin tr¹ng th¸i, stack cña .COM file cïng n»m trong mét segment víi m· lÖnh vµ data. - Trong segment cña ch­¬ng tr×nh .COM, stack n»m ë trªn cïng (phÝa ®Þa chØ

cao nhÊt). ®Þa chØ hiÖn thêi cña stack lu«n ®­îc trá bëi SS:SP

Khi b¾t ®Çu ch­¬ng tr×nh SP lu«n trá tíi FFFE nghÜa lµ c¸ch ®Ønh cña segment 1 word. Stack cã kÝch th­íc thay ®æi tuú theo ho¹t ®éng cña ch­¬ng tr×nh, khi stack lín lªn (sau mét lÖnh PUSH ch¼ng h¹n) nã ph¸t

triÓn xuèng phÝa d­íi (nghÜa lµ SP gi¶m ®i) tõng word mét. - con trá stack bæ sung lµ BP (Auxilary stack pointer) - ®iÒu cùc kú quan träng lµ ch­¬ng tr×nh kh«ng ®­îc viÕt vµo stack, nÕu kh«ng ch­¬ng tr×nh sÏ bÞ ph¸ huû (crash). Nãi chung ta sÏ kh«ng ®­îc viÕt g× vµo miÒn 256 byte cao nhÊt (Top) cña segment ®Ó tr¸nh viÕt ®Ì

vµo stack.

3.2 Ch­¬ng tr×nh BACK.ASM (sè dßng ®­îc ghi chØ ®Ó tiÖn ph©n tÝch)

CODE SEGMENT 1 ASSUME CS: CODE, DS: CODE 2 ORG 100H 3 START: JMP BACK 4 THE_BUFFER DB 13;t¹o buffer 13 byte cho INT 21h, 5 BYTE_TYPED DB 0;service 0AH 6 FILE_ONE DB 12 DUP(0) 7 MAKE_ME_ZERO DB 0;byte cuèi cña ASCIIZ string 8 FILE_TWO DB 8 DUP(0), ".BAK",0 9 HANDLE_1 DW 0 10 HANDLE_2 DW 0 11 PROMPT DB "Filename to back up: $" 12 BACK PROC NEAR 13 MOV DX, OFFSET PROMPT 14 MOV AH, 9;write out a string ended with '$' 15 INT 21H;pointed to by DS:DX 16 MOV AH, 0AH 17 MOV DX, OFFSET THE_BUFFER;read in a string 18 INT 21H;and store at [DS]:[DX] 19 MOV MAKE_ME_ZERO, 0;overwrite CR character (0Dh) 20 MOV CX, 8 21 MOV SI, OFFSET FILE_ONE 22 MOV DI, OFFSET FILE_TWO 23 REP MOVSB 24 MOV DX, OFFSET FILE_ONE;OPEN 1ST FILE 25

MOV AX, 3D00H;AL=0 means open file for read only 26

INT 21H 27 MOV HANDLE_1, AX 28 MOV DX, OFFSET FILE_TWO 29 MOV AH, 3CH;CREATE BACKUP FILE 30

MOV CX, 0;CX=0 (attrib) means Plain old file 31

INT 21H 32 MOV HANDLE_2, AX 33 MOV AH, 3FH 34 MOV CX, 60*1024 35 MOV DX, OFFSET DATA 36 MOV BX, HANDLE_1 37 INT 21H 38

MOV CX, AX;set number of bytes to write to number 39

MOV AH, 40H;actually read. 40 MOV BX, HANDLE_2 41 INT 21H 42 MOV AH, 3EH 43 MOV BX, HANDLE_1 44 INT 21H 45 MOV BX, HANDLE_2 46 INT 21H 47 EXIT: INT 20H 48 BACK ENDP 49 DATA: 50 CODE ENDS 51 END START 52

- c¸c dßng tõ 5..12

dµnh mét sè byte ®Ó chøa tªn file mµ ch­¬ng tr×nh nhËn vµo, tªn file míi sÏ t¹o ra, dßng ký tù nh¾c (prompt), 2 words ®Ó chøa File handle cña 2

file nguån vµ ®Ých.

3.3 Më file nguån ®Ó ®äc, t¹o file míi ®Ó chÐp file nguån sang

- c¸c dßng 25..28

më file nguån ë MODE Read Only (sau khi ®· nhËn vµo tªn file tõ bµn phÝm), l­u File handle cña nã vµo word cã tªn Handle_1 ®Ó sö dông khi

®ãng file l¹i. - c¸c dßng 29..33

t¹o mét file míi b»ng service 3Ch, víi thuéc tÝnh CX=0 (plain old file), nghÜa lµ më ®Ó ®äc, ghi, l­u File handle cña nã vµo word cã tªn Handle_1 ®Ó sö dông khi ®ãng file l¹i. nÕu ®· tån t¹i mét file trïng tªn th× file ®· tån t¹i bÞ c¾t gi¶m kÝch th­íc = 0 , nÕu file ®ã cã thuéc tÝnh read

only th× t¸c vô 3Ch nµy thÊt b¹i.

Tham kh¶o thªm: nÕu muèn lÊy/®Æt thuéc tÝnh cña file th× sö dông service

43h, INT 21h (CHMOD), nh­ sau:

input

AH:= 43H

AL:= SubFunction = 0: lÊy thuéc tÝnh file hiÖn hµnh

:= SubFunction = 1: ®Æt thuéc tÝnh file

DS:DX:= ASCIIZ filename nÕu AL:= 0

Attribute nÕu AL:= 1

nÕu kh«ng cã tªn æ ®Üa vµ ®­êng dÉn th×

ngÇm ®Þnh lµ æ ®Üa vµ ®­êng dÉn hiÖn thêi.

return

AX = m· lçi nÕu CF=CY

CX = attrib. cña file hiÖn thêi, nÕu AL khi gäi = 0 - dßng 50

chØ lµ mét nh·n, ta dïng nã ®Ó chuÈn bÞ miÒn chøa data tõ file nguån sÏ ®­îc ®äc vµo. Nh·n DATA: nµy cÇn ®Æt ë cuèi cïng cña ch­¬ng tr×nh, nh­ng vÉn ph¶i n»m bªn trong cïng segment víi ch­¬ng tr×nh, do ®ã ph¶i ®øng

tr­íc Pseudo-Op

CODE ENDS

ViÖc dïng mét nh·n bªn ngoµi thñ tôc (DATA: ®øng sau BACK ENDP) cã nghÜa lµ tÊt c¶ d÷ liÖu cña ta sÏ ghi vµo ngay sau ch­¬ng tr×nh trong bé nhí,

trªn cïng mét segment.

Chóng ta kh«ng cÇn dµnh chç cho DATA b»ng Directive DATA DB bëi v× sau ch­¬ng tr×nh chóng ta cã thÓ sö dông toµn bé phÇn cßn l¹i cña segment, miÔn lµ kh«ng dông ch¹m ®Õn Stack. NÕu chóng ta lµm ng­îc l¹i, sö dông DATA DB vµ sau ®ã lµ c¸c byte ®Ó dµnh cho d÷ liÖu th× ch­¬ng tr×nh cña chóng ta bao gåm c¶ c¸c byte ®Ó dµnh ®ã, tÊt nhiªn lµ lín h¬n vµ hoµn

toµn kh«ng cÇn thiÕt nh­ vËy.

3.4 ViÖc ®äc tõ File

Trong ng«n ng÷ lËp tr×nh PASCAL cã 3 lo¹i file: TEXT, TYPED, UNTYPED. Trong TEXT FILE chóng ta sÏ t×m thÊy <CR><LF> (0Dh 0Ah) øng víi vÞ trÝ cuèi mçi dßng. C¸c file cã ®Þnh kiÓu chØ chøa d÷ liÖu cña mét kiÓu cô thÓ, kiÓu ®ã ta ph¶i khai b¸o tr­íc.

C¸c file kh«ng ®Þnh kiÓu lµ c¸c file kh«ng cã cÊu tróc vµ cã thÓ xem chóng nh­ lµ bao gåm c¸c byte kh«ng cã liªn hÖ g× ®Õn nhau c¶.

Trong assembly language viÖc sö dông tÊt c¶ c¸c lo¹i file ®Òu gièng nh­ viÖc sö dông file kh«ng ®Þnh kiÓu trong PASCAL. - c¸c dßng lÖnh 34..38 (®äc tõ file nguån)

MOV AH, 3FH 34 MOV CX, 60*1024 35 MOV DX, OFFSET DATA 36 MOV BX, HANDLE_1 37 INT 21H 38 chóng ta kh«ng biÕt file nguån dµi bao nhiªu v× vËy ta yªu cÇu ®äc sè l­îng byte lín nhÊt cã thÓ ®­îc (60 KB), service 3Fh sÏ ®äc sè byte lín nhÊt cã thÓ ®äc ®­îc (cho ®Õn khi gÆp dÊu END OF FILE), sau khi ®äc xong nã sÏ tr¶ vÒ AX sè byte thùc sù ®äc. Con sè nµy ta sÏ sö dông ®Ó b¸o cho service 40h (Write to file) sè byte cÇn ghi.

§©y lµ c¸ch chóng ta sÏ th­êng lµm khi lµm viÖc víi File trong Assembly language. TÊt nhiªn ta cã thÓ tÝnh to¸n ra kÝch th­íc file nh­ng kh«ng nhÊt thiÕt ph¶i lµm nh­ vËy.

3.5 ViÖc ghi vµo File ®Ých

Ta sÏ sö dông Service 40h, INT 21h ®Ó ghi vµo file ®Ých. V× d÷ liÖu cña c¶ 2 file nguån vµ ®Ých ®Òu kh«ng ®Þnh kiÓu, ta chØ cÇn quan t©m tíi sè byte chø kh«ng cã vÊn ®Ò sè dßng hay sè phÇn tö cña mét kiÓu nµo ®ã nh­ c¸c file kiÓu text hay record ... trong PASCAL.

MOV CX, AX;set number of bytes to write to number 39

MOV AH, 40H;actually read. 40 MOV BX, HANDLE_2 41 INT 21H 42 3.6 §ãng file

sö dông service 3Eh, INT 21h

MOV AH, 3EH 43 MOV BX, HANDLE_1 44 INT 21H 45 MOV BX, HANDLE_2 46 INT 21H 47

4. File cã ®Þnh kiÓu trong ASSEMBLY LANGUAGE - File of Records

Trong c¸c version DOS tr­íc ®©y khi c¸c thao t¸c file sö dông FCBs, NSD quy ®Þnh kÝch th­íc Record vµ kÝch th­íc khèi byte (®äc/ghi). Khi sö dông file handle chóng ta chØ ph¶i chän sè byte cho thao t¸c ®äc/ghi ...

Nh­ vËy, thùc tÕ víi assembly language chØ cã 1 kiÓu file - file kh«ng ®Þnh kiÓu, trong ®ã mçi phÇn tö lµ mét byte. Tuy nhiªn víi ng­êi lËp tr×nh assembler cã thÓ tæ chøc file nh­ kiÓu File of Records trong PASCAL.

4.1 File of Records

Gi¶ sö chóng ta cÇn tæ chøc mét file d÷ liÖu chøa Tªn vµ sè Phone t­¬ng øng cña mét sè ng­êi. Ta cã thÓ coi ®ã lµ 2 field cña 1 record nh­ trong PASCAL.

Ta cã thÓ ®Þnh nghÜa mét Record nh­ vËy trong MEMORY nh­ sau:

NAME DB 16 DUP(0) NUMBER DB 16 DUP(0) nh­ vËy mçi record dµi 32 byte, b¾t ®Çu b»ng nh·n NAME. Ta cã thÓ t¹o nhiÒu Record nh­ thÕ trong bé nhí, ®iÒu cÇn chó ý lµ víi c¸c Record mµ sè liÖu cña c¸c Field ng¾n h¬n ta ®Þnh, chóng ta cÇn ®iÒn 0 vµo ®Ó ®¶m b¶o cho tÊt c¶ c¸c Record cã chiÒu dµi b»ng nhau. ChÝnh nhê kÝch th­íc c¸c Record b»ng nhau mµ ta cã thÓ truy cËp ®Õn mét record tuú ý mét c¸ch dÔ dµng (RANDOM ACCESS) th«ng qua STT cña nã.

NÕu chóng ta dïng Record cã chiÒu dµi thay ®æi th× chóng ta ph¶i ghi c¸c dÊu hiÖu End of Record vµo trong file lµm ranh giíi gi÷a c¸c record. Trong PASCAL ®ã lµ cÆp CR,LF. ChÝnh v× lý do nµy khi cÇn truy cËp mét record nµo ®ã ta ph¶i duyÖt tõ ®Çu ®Ó ®Õm sè record, c¸ch truy cËp ®ã ®­îc gäi lµ Truy cËp tuÇn tù (Sequential Access).

§Ó viÕt record trong bé nhí vµo file, tr­íc hÕt cÇn më (open) hoÆc t¹o (create) file, cho DS:DX trë tíi NAME, CX:= sè byte cÇn ghi (ë ®©y lµ 32 byte).

4.2 §äc sè liÖu tõ file - con trá ®äc/ghi (Read/Write Pointer)

T¹i mçi thêi ®iÓm ta cã thÓ ®äc/ghi t¹i mét vÞ trÝ nµo ®ã trong file, ta cã thÓ coi ®ã lµ 'Cöa sæ file' hay 'cöa sæ ®äc/ghi', vÞ trÝ ®ã ®­îc trá bëi Read/Write Pointer, DOS cã Service 42h cho phÐp ta ®Þnh vÞ con trá nµy tíi mét vÞ trÝ tuú ý trong file.

File Handle Service Number You set It Returns --------------------------------------------------------------------- Move Read/Write pointer 42h CX:DX=#Bytes to if CY=1, AX chøa m· lçi

move if CY=0, DX:AX=new

BX=File Handle location in file.

AL="Methode"

Method (in AL) Means ---------------------------------------------------------------------

0 Set R/W pointer to CX:DX bytes from the beginng of the file

1 Move R/W pointer CX:DX bytes from where it is now

2 Set R/W pointer to CX:DX bytes from end of file

Note: VÞ trÝ míi cña R/W pointer ®­îc tr¶ vÒ trong DX:AX

if CF=CY=1, m· lçi tr¶ vÒ trong AX

Khi ®· biÕt kÝch th­íc (bytes) cña Record ta cã thÓ ®Þnh vÞ nã nh­ sau:

vÞ trÝ (bytes) = sè thø tù Record x kÝch th­íc Record

(stt ®Õm tõ 0, kÝch th­íc tÝnh b»ng Byte)

5. Ch­¬ng tr×nh minh ho¹: PROGRAM PHONE.ASM

Chóng ta gi¶ sö ®· cã file NUMBER.DAT chøa c¸c record nh­ m« t¶ ë trªn, mçi record dµi 32 byte, gåm 2 field, mçi field dµi 16 byte. Field 1 chøa tªn, Field 2 chøa sè phone cña tªn t­¬ng øng.

NÕu trªn ®Üa thùc hµnh ch­a cã NUMBER.DAT, ta cã thÓ sö dông DEBUG t¹o ra mét c¸ch nhanh chãng nh­ h­íng dÉn sau ®©y, chØ cÇn t¹o ra 3 record ®Ó thö lµ ®­îc, ngoµi ra ta dïng mét 'mÑo vÆt' ®Ó sö dông INT 21h, service 09h ®Ó in ra tr­êng tªn mét c¸ch thuËn lîi, b»ng c¸ch ®iÒn ®Çy 3 x 32 byte cña miÒn nhí sÏ chøa 3 record c¸c ký tù '$', sau ®ã míi ®­a néi dung cña 3 record vµo.

H·y lµm theo c¸c b­íc sau:

- DEBUG

- F 100 15F "$" ;

- D 100 ;

- A100 ;

- XXXX:0100 DB "Bo Mon Tin hoc" ;

- XXXX:010E

- A110

- XXXX:0110 DB "581 530"

- XXXX:0117

- A120

- XXXX:0120 DB "Toan Co Tin hoc"

- XXXX:0117

- A130

- XXXX:0130 DB "581 135"

- XXXX:0137

- A140

- XXXX:0140 DB "TAXI PT"

- XXXX:0147

- A150

- XXXX:0150 DB "533 171"

- XXXX:0157

Sau ®ã ghi vµo file NUMBER.DAT b»ng c¸ch mµ chóng ta biÕt khi häc sö dông ch­¬ng tr×nh DEBUG.

CODE SEGMENT

ASSUME CS: CODE, DS: CODE

ORG 100H

START: JMP PHONE

FILENAME DB "NUMBER.DAT",0

FILEHANDLE DW 0

PERSON_NAME DB 16 DUP(0) NUMBER DB 16 DUP(0)

PROMPT DB "Get phone number (1..3) or Quit (Q): $"

PHONE PROC NEAR

MOV DX, OFFSET FILENAME

MOV AL, 0;Read Only MOV AH, 3DH;Open File

INT 21H

MOV FILEHANDLE, AX ASK: MOV DX, OFFSET PROMPT

MOV AH, 9;Write out a string pointed to by DS:DX

INT 21H

MOV AH, 1;Get into AL a typed in character

INT 21H

CMP AL, 'Q'

JE QUIT

SUB AL, "0"

MOV CL, 5

DEC AL

SHL AL, CL;Multiply AL by 2 to the power of 5 (32)

MOV CX, 0 MOV DH, 0

MOV DL, AL

MOV AH, 42H;Move Read/Write Pointer

MOV AL, 0;Set Methode to 0: set R/W Pointer to CX:DX bytes MOV BX, FILEHANDLE; from the beginning of the file

INT 21H

MOV DX, OFFSET PERSON_NAME

MOV BX, FILEHANDLE

MOV CX, 32;Bytes wanted

MOV AH, 3FH;Read from a file

INT 21H

MOV AH, 9;Write out a string pointed to by DS:DX

MOV DX, OFFSET PERSON_NAME

INT 21H

MOV DX, OFFSET NUMBER

INT 21H JMP ASK QUIT: MOV BX, FILEHANDLE

MOV AH, 3EH;Close a file

INT 21H EXIT: INT 20H PHONE ENDP CODE ENDS

END START

Ch­¬ng tr×nh nµy hoµn toµn nh»m môc ®Ých minh ho¹ c¸c thao t¸c víi File of Record, giao diÖn víi NSD hÕt søc 'th« s¬', c¸c x©u ký tù in ra mµn h×nh liªn tiÕp nhau, thiÕu c¶ dÊu xuèng dßng. Cã thÓ thªm dÊu xuèng dßng sau mçi lÇn in ra mµn h×nh mét x©u ký tù b»ng c¸c c¸ch sau:

1/ in ra x©u ký tù CR_LF nh­ sau: CR_LF DB ODh, 0Ah, "$"

sö dông INT 21h, Service 09. 2/ x©y dùng 1 thñ tôc CR_LF in dÊu xuèng dßng, b¶o vÖ c¸c thanh ghi tr­íc

khi thùc hiÖn vµ phôc håi l¹i chóng tr­íc khi trë vÒ (RET).

CODE SEGMENT BYTE PUBLIC

ASSUME CS:CODE

CR_LF PROC NEAR

PUSH AX PUSH DX

MOV AH,2;DOS ah=function 02h

MOV DL,0DH

INT 21H

MOV DL,0AH

INT 21H

POP DX POP AX

RET CR_LF ENDP

CODE ENDS

END

Bµi gi¶ng m«n Assembly Language, Bµi 5 - $ - NguyÔn §×nh ViÖt, §HQG HN, 1995 -------------------------------

Bµi 6 Qu¶n lý mµn h×nh vµ §å ho¹ nhanh

( SCREEN HANDLING AND FAST GRAPHICS )

Trong ng«n ng÷ lËp tr×nh PASCAL cã rÊt nhiÒu thñ tôc vµ hµm phôc vô cho c¸c thao t¸c trªn mµn h×nh, kÓ c¶ trong chÕ ®é ®å ho¹. Tuy nhiªn hÇu hÕt c¸c chøc n¨ng mµn h×nh ®Òu ch¹y kh¸ chËm.

Trong Assembly Language th× vÊn ®Ò l¹i ng­îc l¹i: cã qu¸ Ýt dÞch vô hç trî chÕ ®é ®å ho¹ (kh«ng kÓ trong OS/2 Presentation Manager), tuy nhiªn tèc ®é l¹i rÊt cao - nhÊt lµ khi ta viÕt trùc tiÕp vµo vïng nhí mµn h×nh. ViÖc hiÓn thÞ trªn mµn h×nh PC kh«ng ngõng ®­îc c¶i thiÖn, ®· cã mét sè tiªu chuÈn vÒ mµn h×nh ®å ho¹ nh­: MDA, CGA, EGA, VGA vµ HERCULES, ch­a cã mét tiªu chuÈn nµo ®­îc coi lµ duy nhÊt. Ngay c¶ c¸c CARD míi ra ®êi nh­ Super VGA, TIGA còng ch­a cã tiªu chuÈn duy nhÊt.

Sau ®©y tr×nh bµy vÒ c¸c lo¹i VIDEO GRAPHICS CARD

- Monochrome Display Adapter (MDA), cïng víi CGA lµ nh÷ng Graphics Adapter ®Çu tiªn mµ IBM ®­a ra nh­ lµ nh÷ng chuÈn trong c¸c m¸y PCs ®Çu tiªn

trong n¨m 1981.

+ chØ cã 1 Mode ho¹t ®éng lµ TEXT MODE 80x25

+ ®é ph©n gi¶i cao 720 x 350, kh«ng bÞ nhÊp nh¸y.

+ MDA sö dông bé nhí hiÓn thÞ 4 KB, chØ cã 1 trang.

+ Sö dông VIDEO CONTROLLER Motorola MC6485 gièng CGA CARD

- Color Graphics Adapter (CGA), ®­îc IBM ®­a ra thÞ tr­êng còng trong n¨m

1981, cã kh¶ n¨ng hiÓn thÞ ®å ho¹.

+ cã thÓ hiÓn thÞ 4 mµu 1 lóc, chän 4 mµu trong sè 16 mµu ë ®é ph©n gi¶i

lµ 320 x 200; c¶m gi¸c nhÊp nh¸y kh¸ râ.

+ §é ph©n gi¶i cao nhÊt lµ 640 x 200, nh­ng chØ cã 2 "mµu". + Cã TEXT MODE víi c¸c ký tù lµ c¸c ma trËn ®iÓm tèi thiÓu.

+ CGA sö dông bé nhí hiÓn thÞ 16 KB

+ Cã thÓ nèi mµn ¶nh m¸y thu h×nh víi ®Çu ra cña CGA CARD.

+ Sö dông VIDEO CONTROLLER Motorola MC6485 gièng MDA CARD

- Hercules Graphics Card (HGC)

N¨m 1982, mét n¨m sau khi IBM PC ra ®êi, h·ng Hercules ®­a ra CARD ®å ho¹ míi mang tªn h·ng m×nh vµ trë thµnh næi tiÕng. HGC ®­îc coi lµ 1

chuÈn trong c¸c CARD ®å ho¹ Monochrome.

+ ChÕ ®é Graphics cã ®é ph©n gi¶i 720x348, cã 2 trang mµn h×nh.

+ Dùa trªn VIDEO CONTROLLER Motorola MC6485, hoµn toµn t­¬ng thÝch víi

MDA.

- Enhanced Graphics Adapter (EGA)

Sau khi HGC ra ®êi, IBM cè g¾ng thiÕt kÕ 1 CARD míi thay cho CGA vµ v­ît c¸c tÝnh n¨ng cña HGC. N¨m 1985 IBM cho ra ®êi EGA. Cã c¸c tÝnh n¨ng bao

trïm CGA vµ MDA, ngoµi ra cßn cã c¸c MODE riªng.

+ §©y lµ lo¹i CARD ®å ho¹ ®Çu tiªn cã thÓ ®iÒu khiÓn hiÓn thÞ c¶ mµn

h×nh ®¬n s¾c lÉn mµn h×nh mµu.

+ Cã kh¶ n¨ng hiÓn thÞ ®¬n s¾c trªn mµn h×nh ®¬n s¾c, do ®ã nã gièng nh­ HGC. TÊt nhiªn EGA CARD khi nèi ghÐp víi mµn h×nh EGA th× hiÖu qu¶ lµ

cao nhÊt.

+ §é ph©n gi¶i 640x350 pixels , cã thÓ hiÓn thÞ cïng mét lóc 16 mµu trong

sè 64 mµu, mµn h×nh EGA kh«ng nhÊp nh¸y.

+ EGA sö dông bé nhí hiÓn thÞ cã thÓ lín tíi 256 KB ®Ó hiÓn thÞ c¸c

trang mµn h×nh ®å ho¹ kh¸c nhau.

+ Kh«ng sö dông VIDEO CONTROLLER Motorola MC6485 mµ sö dông VLSI Chips. Mäi th«ng tin mµn h×nh ®Òu chøa trong VIDEO RAM, ®©y lµ ®iÓm tiÕn bé

h¬n h¼n cña EGA so víi c¸c CARD ra ®êi tr­íc nã.

+ Mét ®iÓm kh¸c biÖt quan träng cña EGA so víi MDA, CGA lµ nã kh«ng ®­îc IBM ROM BIOS hç trî, v× vËy EGA CARD cã ROM BIOS riªng cña nã thay thÕ cho BIOS nguyªn thuû (original) cña IBM, cho phÐp truy cËp tíi tÊt c¶

c¸c tÝnh n¨ng (features) cña EGA CARD.

- VGA (VIDEO GRAPHICS ARRAY)

Th¸ng 4 n¨m 1987, IBM cho ra ®êi VGA cïng víi viÖc cho ra ®êi hä m¸y PS/2. VGA CARD cã tÊt c¶ c¸c ­u ®iÓm cña EGA, h¬n n÷a nã cã thÓ thÓ hiÖn ®­îc nhiÒu mµu s¾c h¬n, ®é ph©n gi¶i cao h¬n, hiÓn thÞ TEXT tèt

h¬n.

+ ¦u ®iÓm cña VGA so víi EGA lµ møc ®é tæ hîp (cña m¹ch ®iÖn tö) cao h¬n,

tÊt c¶ c¸c khèi logic ®iÒu khiÓn ®­îc tæ hîp trong 1 chip.

+ kh¸c víi EGA, VGA CARD göi tiÕn hiÖu analog tíi monitor chø kh«ng ph¶i tÝn hiÖu sè, VGA CARD cã thÓ sinh ra h¬n 260,000 mµu kh¸c nhau trong

tr­êng hîp c¸c MODE 2,4,16,256 cïng active.

+ §é ph©n gi¶i cao nhÊt: 640 x 480 ,sè mµu cã thÓ thÓ hiÖn lµ 2,4 hay 16. + ë ®é ph©n gi¶i thÊp (320 x 200) VGA cã thÓ hiÓn thÞ ®ång thêi 256 mµu

®­îc chän trong 256 x 1024 mµu cã thÓ.

+ RAM VIDEO: §é ph©n gi¶i cao, sè mµu hiÓn thÞ lín ®ßi hái RAM VIDEO còng

lín theo, minimum lµ 256 KB , MAX lµ 512 KB.

+ Gièng nh­ EGA, VGA kh«ng ®­îc IBM ROM BIOS hç trî, v× vËy VGA CARD cã ROM BIOS riªng cña nã thay thÕ cho BIOS nguyªn thuû (original) cña IBM,

cho phÐp truy cËp tíi tÊt c¶ c¸c tÝnh n¨ng (features) cña VGA CARD.

- Super VGA

Super VGA Card cã cÊu tróc phÇn cøng gièng nh­ VGA Card th«ng th­êng,

nh­ng nã hiÓn thÞ Pixel nhanh h¬n.

L­u ý:

C¸c CARD mµn h×nh cña IBM lu«n lu«n bÞ c¸c h·ng kh¸c, ®Æc biÖt lµ c¸c h·ng ë Ch©u ¸ Copy, hä ®­a ra c¸c CARD t­¬ng thÝch ®Ó c¹nh tranh, c¸c CARD nµy th­êng cã c¸c MODE bæ sung vµ rÊt cã thÓ c¸c MODE nµy kh«ng

®­îc nhiÒu phÇn mÒm hç trî.

Bµi nµy sÏ chñ yÕu kh¸m ph¸ BIOS INT 10H, xem xem Assembly Language cã thÓ lµm tèt nh÷ng viÖc g× trªn mµn h×nh.

BIOS INT 10H chøa c¸c dÞch vô mµn h×nh mµ c¸c ch­¬ng tr×nh Assembly Language ph¶i dïng ®Õn. TÊt nhiªn cã mét sè Function cña INT 21h còng in ®­îc ký tù ra mµn h×nh nh­ng nã còng gäi INT 10H ra thùc hiÖn mµ th«i. BIOS nãi chung lµ phÇn mÒm trong ROM nh­ng ngµy nay th­êng ®­îc t¨ng c­êng b»ng c¸c phÇn mÒm bæ sung n¹p vµo tõ c¸c file ®Üa.

§iÒu rÊt cÇn nhí lµ sau khi gäi INT 10H c¸c thanh ghi sau nãi chung sÏ bÞ ph¸ huû (gi¸ trÞ trong ®ã): AX, SI, DI I. C¸c dÞch vô mµn h×nh cña BIOS trong chÕ ®é TEXT

(The BIOS Screen Handling Services)

ChÕ ®é nµy cßn cã tªn gäi Alphanumeric-Mode

BIOS vµ DOS ®Òu cã c¸c dÞch vô in ký tù lªn mµn h×nh, nh­ng BIOS cã thÓ lµm ®­îc nhiÒu viÖc mµ DOS kh«ng lµm ®­îc, thÝ dô: - in c¸c ký tù cã mµu - viÕt vµo Screen Buffer - thay ®æi thuéc tÝnh cña ký tù - di chuyÓn con trá trªn mµn h×nh, cuén mµn h×nh ...

Trang mµn h×nh (Video Memory Page)

Vïng nhí giµnh cho mµn h×nh trong mét sè Video Mode cã thÓ ®­îc chia thµnh c¸c trang. Mét Video Adapter th­êng kÌm theo mét l­îng bé nhí nhÊt ®Þnh, h¬n n÷a Adapter nµy cã thÓ lµm viÖc ë mét sè Mode kh¸c nhau, c¸c Mode kh¸c nhau cÇn dung l­îng nhí t­¬ng øng kh¸c nhau, do vËy trong mét sè Mode cßn mét sè l­îng nµo ®ã cña bé nhí Video ch­a ®­îc sö dông, IBM cho phÐp ta sö dông bé nhí ®ã nh­ c¸c trang thªm vµo (Extra Pages) cña bé nhí hiÓn thÞ.

ThÝ dô CGA Adapter trong chÕ ®é ®å ho¹ cÇn 16 KB cßn trong chÕ ®é TEXT chØ cÇn cã 4 KB, do vËy vïng nhí Video cña CGA cã thÓ chia thµnh 4 trang trong chÕ ®é TEXT. B×nh th­êng th× c¶ 4 trang nµy lµ c¸c b¶n copy cña nhau vµ Page 0 ®­îc hiÓn thÞ.

Víi BIOS ta cã thÓ lùa chän ®Ó viÕt vµo trang nµo lµ tuú ý, trang ®­îc ngÇm ®Þnh sö dông lµ trang sè 0.

1. Service 2,3: ®Æt vµ lÊy vÞ trÝ cña con trá trªn mµn h×nh

l­u ý r»ng gãc trªn bªn tr¸i cña mµn h×nh cã to¹ ®é Row,Column = 0,0

1.1 §Æt vÞ trÝ con trá trªn mµn h×nh (Set cursor position)

AH:= 2;SERVICE NUMBER

DH,DL:= Row, Column of new position

BH:= Page Number (usually = 0)

service nµy gièng nh­ Gotoxy(x,y) trong PASCAL

1.2 LÊy vÞ trÝ con trá trªn mµn h×nh (Get cursor position)

AH:= 3;SERVICE NUMBER

BH:= Page Number (usually = 0) Return:

DH,DL:= Row, Column of current cursor position

service nµy gièng nh­ WhereX,WhereY trong PASCAL

Service nµy rÊt h÷u Ých khi ta viÕt Popup Program, nã cÇn x¸c ®Þnh vÞ trÝ Cursor tr­íc vµ sau khi nã thùc hiÖn.

2. Service 6,7: Cuén mµn h×nh Active lªn, xuèng

(Scroll Active Page Up or Down)

AH:= 6: Scroll Up

:= 7: Scroll Down AL:= Number of lines to scroll (blank line will be inserted)

(AL:= 0 means blank the whole active Window.) (CH,CL):= Row,Column of upper left corner of scroll window (DH,DL):= Row,Column of lower right corner of scroll window BH:= Attribute to be used on blank line

l­u ý - Ta cã thÓ cuén mét phÇn tuú ý cña mµn h×nh ®éc lËp so víi phÇn cßn l¹i - Dßng Blank sÏ ®­îc chÌn vµo Window vµ ®ã lµ n¬i sÏ tiÕp nhËn input - B»ng c¸ch ®Æt thuéc tÝnh cho dßng Blank, ta chän ®­îc mµu cho nã.

Thuéc tÝnh cña ký tù hiÓn thÞ trªn mµn h×nh

Mçi ký tù hiÓn thÞ trªn mµn h×nh cã 1 byte m« t¶ thuéc tÝnh cña nã, nghÜa lµ m« t¶ nã sÏ ®­îc hiÓn thÞ trªn mµn h×nh nh­ thÕ nµo. ý nghÜa nh­ sau:

7 6 5 4 3 2 1 0

Blink Red Green Blue Intens. Red Green Blue

Background Color Foreground Color

( mµu nÒn ) ( mµu ch÷ )

Bit nµo ®­îc SET = 1 th× thuéc tÝnh t­¬ng øng víi bit ®ã lµ ON, chóng ta cã thÓ trén c¸c mµu víi nhau b»ng c¸ch céng gi¸ trÞ c¸c bit l¹i.

- khi ®Æt thuéc tÝnh cho mét dßng míi, mçi vÞ trÝ (ký tù) trªn dßng ®ã ®­îc ®Æt cïng mét thuéc tÝnh dï cßn ch­a cã ký tù nµo trªn dßng ®ã. C¸c ký tù ®­îc ®­a vµo dßng nµy sÏ nhËn thuéc tÝnh ®· ®­îc ®Æt s½n cña dßng, tÊt nhiªn ta cã thÓ ®Æt thuéc tÝnh (tuú ý) cho tõng ký tù khi in chóng

ra nÕu ta muèn. - ThÝ dô ký tù mµu ®á (Foreground) trªn nÒn Xanh l¸ c©y (Background) cã

byte thuéc tÝnh nh­ sau:

0 0 1 0 0 1 0 0 B = 24H - ë mµn h×nh Monochrome ta kh«ng thÓ sö dông tõng mµu riªng rÏ ®­îc, nh­ng

chóng ta cã thÓ sö dông c¸c thuéc tÝnh sau:

+ 7: normal attrib. + 0FH: high intensity

+ 87H: blinking normal

+ F0H: blinking reverse video

+ 01: underline, thuéc tÝnh nµy c¸c mµn h×nh ®å ho¹ kh«ng cã

+ 09: intense underline, thuéc tÝnh nµy c¸c mµn h×nh ®å ho¹ kh«ng cã

Bé ®Öm mµn h×nh vµ c¸c byte thuéc tÝnh

Trong TEXT MODE

Mçi ký tù hiÓn thÞ trªn mµn h×nh øng víi 2 byte trong bé ®Öm mµn h×nh, mét byte lµ m· ASCII vµ mét lµ byte thuéc tÝnh. Byte m· ASCII ®øng tr­íc byte thuéc tÝnh vµ chóng xÕp xen kÏ nh­ vËy trong bé nhí ®Öm mµn h×nh. Ký tù ®Çu tiªn trong bé ®Öm øng víi gãc trªn bªn tr¸i mµn h×nh. - Trong mµn h×nh MDA, bé ®Öm mµn h×nh b¾t ®Çu ë B000:0000 - Trong mµn h×nh ®å ho¹, ë CGA Mode, bé ®Öm mµn h×nh b¾t ®Çu ë B800:0000 - Trong mµn h×nh EGA, VGA bé ®Öm mµn h×nh b¾t ®Çu ë A000:0000 l­u ý: Trõ khi chóng ta ®Æt l¹i Video Mode, c¶ EGA lÉn VGA ®Òu ch¹y ë Mode CGA, v× vËy bé ®Öm mµn h×nh b¾t ®Çu ë B800:0000 ChØ trong c¸c Mode EGA hoÆc VGA, bé ®Öm mµn h×nh b¾t ®Çu ë A000:0000

Trong GRAPHICS MODE

Mäi ®iÒu còng t­¬ng tù nh­ trong TEXT MODE, nh­ng kh«ng ph¶i lµ ký tù mµ lµ víi c¸c PIXEL (Picture Elements).

ThÝ dô trong MODE CGA 320 x 200 cã 320x200 = 64000 Pixels, trong MODE nµy CGA cho phÐp hiÓn thÞ 4 mµu, v× thÕ mçi Pixel cÇn 2 bit trong bé nhí, nh­ vËy bé nhí mµ CGA cÇn lµ:

64000 Pixels x 2 bit/Pixel / 8 bits/Byte = 16000 bytes, xÊp xØ 16 KB Ta cã thÓ dïng DEBUG, lÖnh E ®Ó thö viÕt vµo bé nhí ®Öm mµn h×nh, ®ång thêi còng thÊy ®­îc thuéc tÝnh ngÇm ®Þnh cña c¸c byte trong bé nhí ®ã (7).

3. Service 9: ViÕt ký tù víi thuéc tÝnh cña nã t¹i vÞ trÝ CURSOR

(Write Attribute/Character at Cursor Position)

- kh«ng di chuyÓn con trá sang ph¶i trªn mµn h×nh sau khi viÕt ký tù ra. - Coi c¸c ký tù ®iÒu khiÓn CR (Carriage Return: 0DH) vµ LF (Line Feed:

0AH) nh­ c¸c ký tù ®Ó in ra.

AH:= 9

AL:= ASCII CODE of character to write

BH:= Page Number (Usully = 0)

BL:= Character's attribute

CX:= Number of times to write character (restricted to 1 line on

screen)

Ch­¬ng tr×nh minh ho¹: CHECKER.ASM

CODE SEGMENT

ASSUME CS: CODE, DS:CODE

ORG 100h

entry: mov cx,255;Loop over all 255 combinations

mov al,0;Start printing with character 0

mov bl,0;and with initial attrib. = 0

mov dl,0;DL:= COLUMN, start at column 0

mov dh,4;DH:= ROW, start at row 4

color_loop: push ax

mov ah,2;Service 2 Set cursor position

int 10h

pop ax

mov ah,9;Print character in AL with

;it's attrib. in BL

push ax

push cx

mov cx,1;write 1 character

int 10h

pop cx pop ax

inc al;Select next character

inc bl;and next attrib.

inc dl;Set next cursor Column

cmp dl,79;Check if cursor is at the end

jb ok_cursor;of line

mov dl,0;Then move to beginning of

inc dh;next line

ok_cursor: loop color_loop

int 20h

CODE ENDS

END ENTRY

4. Service 0ah: ViÕt ký tù kh«ng kÌm theo thuéc tÝnh cña nã t¹i vÞ trÝ

CURSOR

(Write Character alone at Current Cursor Position)

- kh«ng di chuyÓn con trá sang ph¶i trªn mµn h×nh sau khi viÕt ký tù ra. - Coi c¸c ký tù ®iÒu khiÓn CR (Carriage Return: 0DH) vµ LF (Line Feed:

0AH) nh­ c¸c ký tù ®Ó in ra.

§Æt: AH:= 0AH

AL:= ASCII CODE of character to write

BH:= Page Number (Usually 0)

CX:= Number of times to write character

(restricted to 1 line on screen)

Service nµy còng gièng nh­ Service 9, chØ kh¸c cã mét ®iÒu lµ nã kh«ng

lµm thay ®æi thuéc tÝnh cña ký tù. Nãi c¸ch kh¸c lµ: nÕu ký tù viÕt ra ®Ì lªn 1 ký tù t¹i vÞ trÝ ®ã th× thuéc tÝnh cña ký tù míi lÊy lu«n thuéc

tÝnh cña ký tù bÞ viÕt ®Ì.

5. service 0eh - Teletype Write

§Æt: AH:= 0EH

AL:= ASCII CODE of character to write

Sau ®©y lµ 2 ®iÓm kh¸c víi Service 09 vµ 0Ah

- In ra mét ký tù t¹i vÞ trÝ hiÖn thêi cña con trá, sau ®ã dÞch chuyÓn

con trá sang ph¶i

- Coi c¸c ký tù CR (Carriage Return) vµ LF (Line Feed) nh­ c¸c lÖnh chø

kh«ng ph¶i ký tù ®Ó in ra.

II. C¸c dÞch vô mµn h×nh cña BIOS trong chÕ ®é graphics

ChÕ ®é nµy cßn cã tªn gäi All-Points-Addressable.

C¸c hç trî cña BIOS IBM PC cho viÖc lËp tr×nh vÏ ®å ho¹ thËt lµ nghÌo nµn, chØ cã mét dÞch vô vÏ 1 ®iÓm (Pixel). NÕu so víi m¸y Macintosh, cã Toolbox Routines (like QuickDraw) hay System Routine trong OS/2 Presentation Manager, trong ®ã cã c¸c ch­¬ng tr×nh con vÏ Circle, Line,

Box ... th× thÊy râ hç trî cña BIOS IBM PC lµ cùc tiÓu. 1 INT 10H, SERVICE 0 - SET VIDEO MODE

Set: AH:= 0

AL:= New Video Mode

Khi chóng ta muèn lµm viÖc trong chÕ ®é Graphics, tr­íc hÕt chóng ta ph¶i ®Æt (Set) Mode ë ®é ph©n gi¶i mong muèn. Sau khi ®· Set Graphics Mode, chóng ta sÏ ë trong Mode nµy cho tíi khi chóng ta Set Mode kh¸c.

Nh­ vËy viÖc Set Mode th­êng lµm ®Çu tiªn trong c«ng viÖc ®å ho¹.

Sau ®©y lµ c¸c Mode cña mµn h×nh:

SCREEN MODE

------------------------------------------------------------------------ Mode Display lines Number Adapters Maximum Pages

(in AL) of Colors

------------------------------------------------------------------------

0 40X25 B&W text CGA, EGA, VGA 8 1 40X25 Color text CGA, EGA, VGA 8

2 80X25 B&W text CGA, EGA, VGA 4(CGA),8(EGA,VGA)

3 80X25 Color text CGA, EGA, VGA 4(CGA),8(EGA,VGA)

4 320X200 4 CGA, EGA, VGA 1 5 320X200 B&W CGA, EGA, VGA 1 6 640X200 2 (on or off) CGA, EGA, VGA 1

7 80X25 Monochrome MDA, EGA, VGA 1(MDA),8(EGA,VGA)

8 160X200 16 PCjr 1 9 320X200 16 PCjr 1 A 640X200 1 PCjr 1

B Reserved for future use

C Reserved for future use

D 320X200 16 EGA, VGA 8 E 640X200 16 EGA, VGA 4 F 640X350 Monochrome EGA, VGA 2 10H 640X350 16 EGA, VGA 2 11H 640X480 2 VGA 1 12H 640X480 16 VGA 1 13H 320X200 256 VGA 1

------------------------------------------------------------------------

- Ta thÊy c¸c Mode 0,1,2,3,7 lµ c¸c Mode Text - chØ hiÓn thÞ ký tù.

- Ta cã thÓ vÉn cø sö dông Text nh­ b×nh th­êng ngay trong Graphics

Mode, nh­ng sÏ kh«ng cã con trá.

- C¸c mode 0..6 ®­îc sö dông trªn CGA (tÊt nhiªn c¶ trªn EGA, VGA v× chóng cã c¸c kh¶ n¨ng hiÓn thÞ bao trïm c¸c kh¶ n¨ng cña CGA -tÝnh

t­¬ng thÝch).

- C¸c mode 8..0A: cña PCjr

- C¸c mode 0DH..10H lµ cña EGA, VGA (ë ®©y VGA ch¹y trong mode cña EGA)

- C¸c mode 11H..13H lµ cña chØ cã ë VGA (mode 13H lµ Mode 256 mµu) 2 INT 10H, SERVICE 0BH - SET CGA Color Palette (Colors in CGA 320x200 mode)

Set:

AH:= OBH

BH:= Palette Color ID (0 or 1, see below)

BL:= Color(s) to set with that Palette Color ID (see below)

BH:= 0

BL:= Background color (0..31), from now on, this will be color value 0 to be used in Write and Read dot. What colors 0..15 actually mean (blue,red,etc.) is

discussed below.

In Text mode, this background color will determine the screen border color (0..31; 16..31 means high

intensity.)

BH:= 1

BL: = 0: Selects Green/Red/Yellow Palette. Color value 1 in Write and Read Dot will be Green, color value 2

will be Red, color value 3 will be Yellow.

BL: = 1: Select this Palette and Color values: Cyan

(color value will be 1)/Magenta(2)/White(3).

- Khi EGA, VGA ®­îc SET trong MODE nµy (320x200), chóng cã thÓ thÓ hiÖn

nhiÒu mµu h¬n.

2.1 palette ??????????

Trong Mode ®é ph©n gi¶i trung b×nh cña CGA (320x200), ta cã thÓ hiÓn

thÞ cïng mét lóc 4 mµu trªn mµn h×nh, t¹i bÊt kú Pixel nµo.

Ta cã thÓ chän tuú ý 1 trong 4 mµu, víi 3 mµu cßn l¹i (mµu 1,2,3) ta

chØ cã thÓ chän ®­îc tõ 1 trong 2 b¶ng mµu (Palette).

Palette 1: Green, Red, Yellow

Palette 2: Cyan , Magenta, White

2.2 Mµu nÒn cña CGA (The CGA Background Color)

C¸c mµu 1..3 cã thÓ chän tõ b¶ng mµu (Palette), cßn mµu 0 lµ mµu nÒn

th× chóng ta cã thÓ chän trong sè 16 mµu.

§Ó chän mµu nÒn, ta sö dông service 0BH m« t¶ nh­ trªn, víi c¸c tham sè

cô thÓ nh­ sau:

AH:= 0BH

BH:= 0 To inform this service that you want to select the CGA

background color

BL:= (0..31), ®ã lµ 16 mµu vµ 16 mµu t­¬ng øng víi ®é s¸ng t¨ng c­êng

0: Black (off) 8: Black 1: Blue 9: Light Blue 2: Green 10: Light Green 3: Cyan 11: Light Cyan 4: Red 12: Light Red 5: Magenta 13: Light Magenta 6: Brown 14: Yellow 7: White 15: Light White

§©y còng lµ 16 mµu ngÇm ®Þnh ®Çu tiªn cña EGA vµ VGA

2.3 Mode ®é ph©n gi¶i cao cña CGA (Mode 6: 640x200)

Do h¹n chÕ vÒ dung l­îng bé nhí, CGA chØ cã thÓ dµnh 1 bit cho 1 Pixel, nh­ vËy mçi Pixel chØ cã 2 'mµu' lµ mµu 0 vµ 1 øng víi 2 gi¸ trÞ cña 1 bÝt. §é ph©n gi¶i 640x200 t­¬ng øng víi 128 000 Pixel trªn mµn h×nh vµ

t­¬ng øng víi 128000/8 = 16000 byte trong bé nhí hiÓn thÞ.

3 INT 10H, SERVICE 0CH - VÏ 1 ®iÓm ¶nh (Write pixel)

Set:

AH:= 0CH

DX:= Row Number (0..199, 0..349, 0..479)

CX:= Column Number (0..319, 0..639)

AL:= Color Value

BH:= Page Number (0 based) for multi-paged graphics modes

ë ®©y AX ®­îc hiÓu kh¸c nhau trong c¸c tiªu chuÈn kh¸c nhau CGA, EGA,

VGA.

- CGA: ë ®é ph©n gi¶i 320x200, mµu:= 0..3 ë ®é ph©n gi¶i 640x200, mµu:= 0, 1

- EGA: mµu:= 0..15

- VGA: riªng ë mode 13H, mµu:= 0..255

ë c¸c mode kh¸c mµu:= 0..15

4. Ch­¬ng tr×nh minh ho¹ BOX.ASM

4.1 Ch­¬ng tr×nh vÏ mét h×nh ch÷ nhËt lªn mµn h×nh trong mode graphics CGA,

sau ®ã kh«ng tr¶ l¹i Mode mµn h×nh ngÇm ®Þnh.

Code segment

Assume cs:code, ds:code

org 100h

start: jmp box

toprow dw 50

topcol dw 100 botrow dw 100 botcol dw 200

color db 15

box proc

mov ah,0

mov al,6; choose CGA Mode

int 10h

mov cx,botcol sub cx,topcol mov si,toprow mov di,topcol

toploop:

call writedot

inc di

loop toploop

mov cx,botrow sub cx,toprow mov si,toprow

sideloop:

mov di,topcol

call writedot

mov di,botcol

call writedot

inc si

loop sideloop

mov cx,botcol sub cx,topcol mov si,botrow mov di,topcol

botloop:

call writedot

inc di

loop botloop

int 20h box endp

writedot proc

push ax push cx push dx

mov dx,si mov cx,di

mov al,color

mov ah,0ch

int 10h

pop dx pop cx pop ax

ret writedot endp Code Ends

end start

4.2 Ch­¬ng tr×nh vÏ mét h×nh ch÷ nhËt lªn mµn h×nh trong mode graphics VGA,

sau ®ã tr¶ l¹i (Reset) Mode mµn h×nh ngÇm ®Þnh.

Code Segment

Assume CS:Code, DS:Code

org 100h

Start: jmp box

toprow dw 0 topcol dw 0

botrow dw 479

botcol dw 639

color db 4

Box proc

mov ah,0

mov al,12h; choose VGA Mode

int 10h

mov cx,botcol sub cx,topcol mov si,toprow mov di,topcol

Toploop:

call writedot

inc di

loop toploop

mov cx,botrow sub cx,toprow mov si,toprow

Sideloop:

mov di,topcol

call writedot

mov di,botcol

call writedot

inc si

loop sideloop

mov cx,botcol sub cx,topcol mov si,botrow mov di,topcol

Botloop:

call writedot

inc di

loop botloop

mov ah, 1;wait for a strike then turn to

int 21h;text mode 2 = B&W text

mov ah, 0 mov al, 2

int 10h;reset video adapter to default text mode

int 20h Box endp

Writedot proc

push ax push cx push dx

mov dx,si mov cx,di

mov al,color

mov ah,0ch

int 10h

pop dx

pop cx pop ax

ret Writedot endp Code Ends

End start

5. EGA, Service 10H - Set Individual EGA Palette Register

(Set 1 of 16 colors for 16-color mode)

Set: AH:= 10H

AL:= 0

BL:= EGA Palette Register to set (0..15)

BH:= rgbRGB value to set it to (0..63)

Víi mçi pixel, EGA cã thÓ ®iÒu khiÓn 2 møc c­êng ®é s¸ng cña tõng mµu c¬ b¶n: Red, Green, Blue. Mçi mµu c¬ b¶n cã 1 bit biÓu diÔn møc c­êng ®é s¸ng thÊp lµ r, g, b vµ 1 bit biÓu diÔn møc c­êng ®é s¸ng trung b×nh lµ R, G, B, khi c¶ 2 bit cïng b»ng 1 th× øng víi møc s¸ng cao (High Intensity) (r+R). Nh­ vËy víi mçi mµu c¬ b¶n cã 4 møc ®é s¸ng lµ: 0=ff, r=low, R=medium vµ r+R= high.

EGA sö dông 6 bit ®Ó m« t¶ tr¹ng th¸i mµu cña 1 pixel rgbRGB, víi 6 bit cã thÓ tæ hîp ®­îc 0..63 mµu kh¸c nhau. Do cÊu t¹o phÇn cøng cña EGA, t¹i mçi thêi ®iÓm chØ cã thÓ chän ®Ó hiÓn thÞ 16 mµu trong sè 64 mµu cã thÓ, mçi tËp 16 mµu ®ã gäi lµ 1 b¶ng mµu (Palette), nh­ vËy cã 16 Palette hay cßn gäi 16 Mode cña EGA.

D­íi ®©y lµ Mode (Palette) ngÇm ®Þnh cña EGA

Color Value Color rgbRGB ---------------------------------------------------------------------------

0 Black 0 0 0 0 0 0

1 Blue 0 0 0 0 0 1 2 Green 0 0 0 0 1 0 3 Cyan 0 0 0 0 1 1

4 Red 0 0 0 1 0 0 5 Magenta 0 0 0 1 0 1 6 Brown 0 1 0 1 0 0 7 White 0 0 0 1 1 1 8 Dark Gray 1 1 1 0 0 0

9 Light Blue 1 1 1 0 0 1 10 Light Green 1 1 1 0 1 0 11 Light Cyan 1 1 1 0 1 1

12 Light Red 1 1 1 1 0 0 13 Light Magenta 1 1 1 1 0 1 14 Yellow 1 1 1 1 1 0 15 Intense White 1 1 1 1 1 1 --------------------------------------------------------------------------- 6. VGA, Service 10H, function 10H (subfunction or subservice)

set DAC Register (set 1 of 256 VGA colors)

Set: AH:= 10H AL:= 10H

BX:= Register to set (0..255)

CH:= Green Intensity CL:= Blue Intensity DH:= Red Intensity

Mµn h×nh VGA kh¸c c¸c lo¹i mµn h×nh mµ chóng ta xÐt ®Õn tr­íc ®©y ë chç nã lµ mµn h×nh Analog, nghÜa lµ xÐt bªn trong cña VGA nã lµ bé biÕn ®æi DAC (Digital to Analog Converter).

DAC nµy cã 256 thanh ghi, chóng cã thÓ lµm viÖc nh­ lµ c¸c thanh ghi Palette nh­ ë EGA ... (ë EGA c¸c thanh ghi nµy lµ 16 bit), nh­ng ë VGA c¸c thanh ghi nµy lµ 18 bit, v× vËy gi¸ trÞ cña nã lµ miÒn 0..256K, nãi c¸ch kh¸c nÕu ta dïng thanh ghi cña DAC ®Ó ®Æt mµu th× ta cã thÓ chän ®­îc tíi 256K mµu ®Ó hiÓn thÞ.

18 bits DAC register:

III. viÕt ¶nh ®å ho¹ trùc tiÕp vµo bé nhí

(Writing Graphics Images Directly in Memory)

HÇu hÕt c¸c ch­¬ng tr×nh chuyªn xö lý ®å ho¹ kh«ng sö dông thñ tôc Write Dot cña BIOS bëi v× tèc ®é thùc hiÖn chËm mµ viÕt trùc tiÕp vµo bé nhí b»ng viÖc sö dông c¸c lÖnh MOV ®Ó vËn chuyÓn nhanh sè liÖu gi÷a Conventional Memory vµ Display hoÆc gi÷ Display Memory vµ Display Memory, th­êng viÖc nµy n©ng cao tèc ®é vÏ lªn nhiÒu lÇn.

B×nh th­êng th× bé nhí hiÓn thÞ liªn hÖ víi MPU qua BUS d÷ liÖu 8 bit (ë c¸c CARD mµn h×nh c¾m vµo khe c¾m më réng), ë c¸c m¸y mµ VGA CARD lµ ON_BOARD th× BUS d÷ liÖu lµ 16 bit. C¸c CARD EGA/VGA CPU cã thÓ thùc hiÖn 1 lÖnh ®Ó khëi t¹o DATA BUS 32 bit bªn trong nã.

Tuy nhiªn thñ tôc viÕt vµo bé nhí (hiÓn thÞ) phô thuéc vµo lo¹i CARD ®iÒu khiÓn mµn h×nh. ChÝnh v× vËy mµ ng­êi ta vÉn khuyªn sö dông BIOS Write Dot v× nã lµm cho ng­êi lËp tr×nh kh«ng bÞ phô thuéc vµo lo¹i CARD mµn h×nh cô thÓ, chÝnh thñ tôc ®ã ®· ®­îc thiÕt kÕ ®Ó giao tiÕp víi phÇn cøng.

Bé nhí hiÓn thÞ ®­îc tæ chøc b»ng hai c¸ch:

- sö dông Packed Format

- hoÆc Bit-Plane Format - Bit-Plane:

§©y lµ mét kü thuËt ph©n ®o¹n bé nhí thµnh c¸c Bit-Plane. Mét Bit-plane chøa 1 bit cho mçi Pixel. Sè l­îng Bit-Plane b»ng sè bit cùc ®¹i dµnh cho mçi Pixel bëi v× mçi Pixel cÇn mét sè bit m« t¶ vµ mçi mét trong

sè c¸c bit ®ã l¹i n»m trong 1 plane kh¸c nhau. - Packed Display Format

Trong Mode nµy chØ cã 1 Plane trong bé nhí vµ plane nµy ®­îc chia lµm

c¸c phÇn tö (element), mçi phÇn tö chøa sè bit øng víi 1 pixel. NÕu mçi pixel chØ dïng 1 bit th× c¶ 2 kü thuËt nªu trªn lµ gièng hÖt

nhau (identical).

pixel pixel pixel pixel n n+1 n n+1

Bit plane 0

Height Bit plane 1 Height

Bit plane 2

Bit plane 3

Width Width

#bits/pixels

a) Bit-Plane b) Packed Display Format

1. Bé ®Öm mµn h×nh CGA trong Graphics Mode

(The CGA screen buffer in Graphics Mode)

1.1 Trong High Resolution Mode (640x200 pixel)

Víi mçi Pixel chóng ta chØ cã thÓ chän on hoÆc off, trong tr­êng hîp nµy PC chØ cÇn sö dông 1 bit trong bé nhí (VIDEO RAM) cho 1 pixel trªn mµn h×nh, nh­ vËy cÇn 640x200=128000 bit = 16000 byte, xÊp xØ 16KB.

Ta cã thÓ suy luËn mét c¸ch rÊt tù nhiªn lµ ®Ó bËt (turn on) 1 pixel t¹i vÞ trÝ (0,0) trªn mµn h×nh th× cÇn ®Æt (set) bit ®Çu tiªn cña bé nhí ®Öm mµn h×nh =1. Trong thùc tÕ ®óng lµ nh­ vËy.

§Ó 'bËt' pixel bªn c¹nh (cïng hµng), ta ®Æt bit tiÕp theo =1 .v.v... cho ®Õn bit thø 640 øng víi cuèi dßng 1.

Cßn nÕu ta muèn 'bËt' tiÕp c¸c pixel cña hµng d­íi th× vÊn ®Ò l¹i kh«ng hoµn toµn "tù nhiªn" nh­ vËy n÷a, lý do lµ nh­ sau:

CGA Buffer Memory Block IBM chia graphics video buffer thµnh 2 khèi, mçi khèi 8KB: - khèi thø nhÊt b¾t ®Çu ë B800:0000 chøa th«ng tin øng víi c¸c dßng ch½n

cña mµn h×nh - khèi thø hai b¾t ®Çu ë B800:2000 chøa th«ng tin øng víi c¸c dßng lÎ cña

mµn h×nh IBM lµm nh­ vËy v× ë CGA, CRTC thùc hiÖn quÐt xen kÏ, tæ chøc nh­ vËy CRTC ho¹t ®éng thuËn lîi h¬n, cßn víi ng­êi lËp tr×nh th× qu¶ thËt lµ "phiÒn to¸i" h¬n. H×nh ¶nh ®å ho¹ sÏ bÞ chia c¾t lµm 2 nöa ®Æt trong 2 block trong bé nhí.

1.2 Trong Medium Resolution Mode (320x200 pixel)

VÊn ®Ò còng kh¸ gièng trong Hires (640x200), nh­ng kh¸c ë chç mçi ®iÓm ¶nh cã thÓ nhËn 1 trong 4 mµu - cÇn 2 bit. Nh­ vËy trong bé nhí mçi nhãm 2 bit m« t¶ tr¹ng th¸i 1 pixel vµ sè ®iÓm ¶nh chØ b»ng 1/2, tãm l¹i l­îng bé nhí cÇn thiÕt kh«ng thay ®æi. 1.3 Ch­¬ng tr×nh PUT_PIXEL.ASM

minh ho¹ viÖc vÏ 1 ®iÓm b»ng c¸ch viÕt trùc tiÕp vµo bé nhí hiÓn thÞ t¹i vÞ trÝ (®Þa chØ) t­¬ng øng cña ®iÓm ®ã trong bé nhí.

PUTPIXEL PROC NEAR

;SUPPLY DX=ROW, CX=COLUMN, ASSUMES ES=B800H AND SCREEN IN HIRES MODE

;(USE BIOS INT 10H, SERVICE 0 - SET VIDEO MODE)

;(FOR AH:=0, AL:=6 (CGA HIRES 640X200)

XOR BX,BX 1

SHR DX,1;check if pixel to be write is 2 JNC CALC;in ODD or EVEN line 3 ADD BX,8*1024;here, pixel is in ODD line 4

CALC: MOV AX,DX;DX=row (of 640 bits) number of pixel 5 SHL DX,1;DX:= DX*2 6 SHL DX,1;DX:= DX*2 7 ADD DX,AX;now DX=5*DX in line ?? 8 MOV AX,CX;Hold CX here for some time 9 MOV CL,4 10

SHL DX,CL;DX:= DX*16 11

ADD BX,DX;BX=offset of 1st byte on the line con_ 12

;tains pixel

MOV DX,AX;DX:=AX (AX=COLUMN) 13 AND DX,7;DX:=DX MOD 7 (position of bit in byte 14 MOV CL,3;which contain pixel's bit 15 SHR AX,CL;AX:=AX DIV 8 = position of byte on line 16 ADD BX,AX;[BX] points to byte containing pixel's bit 17

NEG DL 18 ADD DL,7 19

MOV CL,DL 20 MOV AL,1 21 SHL AL,CL 22 OR ES:[BX],AL 23 RET 24 PUTPIXEL ENDP 25

Gi¶i thÝch: - C¸c dßng 2..4: kiÓm tra sè dßng cña pixel (trong DX) b»ng c¸ch ®Èy bit thÊp nhÊt cña DX vµo cê nhí. NÕu DX lÎ nghÜa lµ byte t­¬ng øng cña pixel n»m ë BLOCK 2 th× ph¶i t¨ng con trá BX lªn 8x1024 byte ®Ó BX trá tíi ®Çu

cña BLOCK 2 - C¸c dßng 5..12:

Mçi dßng quÐt (640 pixel) øng víi 640 bit hay 80 byte, DX: =DX*80 (thùc hiÖn b»ng n¨m b­íc ë c¸c dßng lÖnh 6,7,8,11) , nh­ vËy DX chøa offset cña byte øng víi pixel ë ®Çu dßng chøa pixel cÇn vÏ. Sau ®ã sÏ céng gi¸

trÞ nµy vµo 'con trá' BX (dßng 12) - C¸c dßng 13..17:

TÝnh xem bit t­¬ng øng víi pixel cÇn vÏ ë byte thø bao nhiªu trªn dßng (80 byte) ®· tÝnh ra ®­îc (dùa vµo DX). Sau ®ã céng con sè tÝnh ®­îc vµo

gi¸ trÞ ®ang cã cña BX (offset cña byte ®Çu dßng).

Dßng 14 AND dx 7 thùc hiÖn viÖc MOD DX, gi¸ trÞ trong DX sÏ lµ con sè

chØ bit thø bao nhiªu trong byte chøa bit øng víi pixel. - C¸c dßng 18..19:

§Ó tÝnh ra bit cÇn ®Æt = 1 (turn on) cÇn l­u ý: gèc to¹ ®é (0,0) øng víi bit tr¸i nhÊt cña byte ®Çu tiªn cña BLOCK 2 (B800: 2000), tøc lµ bit thø 7 cña byte ®ã, nh­ vËy trong tr­êng hîp tæng qu¸t, bit cÇn 'bËt' (turn

on) trong byte sÏ lµ bit thø (träng sè): 7 - (CX MOD 8)

+ ë dßng 14 DX ®· nhËn gi¸ trÞ (CX MOD 7), v× ®· AND DX víi 7 nªn DH:=0

+ dßng 18: DL:= -(CX MOD 7)

+ dßng 19: DL:= DL + 7 t­¬ng ®­¬ng víi DL:= 7 - (CX MOD 7) - C¸c dßng 20..23: chuÈn bÞ byte lµm mÆt n¹ (MASK) ®Ó OR víi byte chøa bit

øng víi pixel cÇn 'bËt', sau ®ã thùc hiÖn 'turn on' bit cÇn thiÕt.

2. Bé ®Öm mµn h×nh EGA/VGA trong Graphics Mode

Bé nhí hiÓn thÞ cña EGA/VGA tæ chøc kiÓu Bit-Plane kÓ c¶ ë c¸c Mode m« pháng CGA, sè Bit-Plane tèi ®a lµ 4 (0,1,2,3), sè Bit-Plane ®­îc sö dông

tuú theo Mode ®­îc chän.

C¸c Mode 0DH, 0EH, 10H vµ 12H (Mode 16 color) sö dông c¶ 4 Bit-Plane ®Ó chøa c¸c th«ng tin hiÓn thÞ. Mçi Pixel ®­îc biÓu diÔn bëi 4 bit, mçi bit n»m trªn 1 Bit-Plane. Nh­ vËy mçi byte trong bé nhí chøa mét trong

4 bit cña 8 pixel l©n cËn trªn mµn h×nh.

Mode 12H (VGA Only) øng víi ®é ph©n gi¶i 640x480 = 307,200 Pixels trªn

mét trang mµn h×nh. Ta cã thÓ tÝnh ra ®­îc víi 1 trang mµn h×nh nh­ vËy, trªn mçi Bit-Plane cÇn 307,200/8 = 38,400 byte; 4 Bit-Plane sÏ cÇn 4x38, 400 byte = 153 600 byte = 150KB. ChØ cã trang 0 lµ n»m trong kh«ng gian

®Þa chØ nhí A0000 ..A95FF.

----- hÕt bµi 6 ---

Bµi gi¶ng m«n Assembly Language, Bµi 5 - $ - NguyÔn §×nh ViÖt, §HQG HN, 1995 ---------------------------------------------------------------------------

Bµi 7 ch­¬ng tr×nh th­êng tró

TSR - Terminate and Stay Resident Program

i. giíi thiÖu vÒ tsr Program

Mét trong c¸c nguyªn nh©n quan träng lµm cho Hîp ng÷ ®­îc sö dông phæ biÕn lµ v× cã thÓ viÕt c¸c ch­¬ng tr×nh b»ng Hîp ng÷ ®Ó cho nã ch¹y "®»ng sau" c¸c ch­¬ng tr×nh kh¸c, hç trî kh¶ n¨ng POP-UP, kh¶ n¨ng n»m l¹i trong bé nhí (TSR) sau khi ch¹y, ngay c¶ khi ta ch¹y mét ch­¬ng tr×nh kh¸c ®Ó víi mét ®iÒu kiÖn nµo ®ã l¹i ®­îc "kÝch ho¹t" - trë l¹i ho¹t ®éng.

B×nh th­êng th× Program Loader trong Command.com n¹p ch­¬ng tr×nh cÇn thùc hiÖn vµo bé nhí ngay sau miÒn nhí dµnh cho DOS råi cho ch­¬ng tr×nh ®ã ch¹y, sau khi ch­¬ng tr×nh kÕt thóc th× gi¶i phãng vïng nhí võa cÊp ph¸t cho ch­¬ng tr×nh b»ng c¸ch ®¸nh dÊu ®Ó råi l¹i cÊp ph¸t cho ch­¬ng tr×nh tiÕp theo. Víi TSR th× b­íc cuèi cïng võa nªu kh«ng x¶y ra, TSR lµm cho DOS ®¸nh dÊu l¹i miÒn dµnh cho DOS bao trïm c¶ phÇn nhí mµ nã chiÕm, do vËy sau nµy DOS kh«ng cÊp ph¸t cho c¸c ch­¬ng tr×nh kh¸c- nã ®­îc b¶o vÖ chèng bÞ viÕt ®Ì bëi c¸c ch­¬ng tr×nh kh¸c. B»ng c¸ch nµy TSR program trë thµnh mét bé phËn cña DOS.

ChØ cã .COM file víi cÊu tróc gän trong mét segment cña nã míi cã thÓ dÔ dµng trë thµnh TSR Program.

TÊt nhiªn còng cã thÓ viÕt ch­¬ng tr×nh TSR b»ng c¸c ng«n ng÷ lËp tr×nh bËc cao nh­ ng«n ng÷ C, Pascal ...

Cã thÓ nªu ra rÊt nhiÒu vÝ dô vÒ c¸c ch­¬ng tr×nh th­êng tró nh­: Calculator, nã cã thÓ POP-UP ra mµn h×nh ngay khi ta ®ang ch¹y mét ch­¬ng tr×nh kh¸c, Screen Clock - lu«n hiÖn mét c¸i ®ång hå trªn mµn h×nh ...

1.WRITING MEMORY-RESIDENT CODE

ViÖc nµy nghe cã vÎ khã kh¨n nh­ng thùc ra kh¸ ®¬n gi¶n. Thùc chÊt cña c«ng viÖc lµ chóng ta thªm ®o¹n m· cña ch­¬ng tr×nh TSR tiÕp vµo vïng nhí dµnh cho DOS, tÊt nhiªn ®o¹n m· ®ã sÏ kh«ng "lµm g×" nÕu nã kh«ng ®­îc trao ®iÒu khiÓn.

ViÖc thªm mét ®o¹n m· tiÕp sau vïng dµnh cho DOS cã thÓ thùc hiÖn rÊt dÔ dµng b»ng chÝnh c¸c tr×nh phôc vô (INT) cña DOS, ®ã lµ INT 27H hoÆc lµ INT 31H, chóng ®­îc thiÕt kÕ ra lµ ®Ó lµm chÝnh c«ng viÖc nµy.

Cã hai c¸ch ®Ó cho ch¹y ch­¬ng tr×nh lo¹i nµy: dïng ng¾t cøng hay ng¾t mÒm, víi c¸c ng¾t cøng, lÖnh CLI cã thÓ lµm cho mét sè trong chóng bÞ che ®i, tøc lµ MPU sÏ kh«ng nhËn ra lêi gäi t­¬ng øng. Th­êng th× TSR program sÏ ®­îc POP-UP khi cã mét phÝm nµo ®ã (®­îc gäi lµ HOT KEY) ®­îc Ên xuèng, lo¹i ch­¬ng tr×nh ®­îc kÝch ho¹t nh­ vËy ®­îc gäi lµ POP-UP Program; Ngoµi ra TSR Program còng cã thÓ ®­îc kÝch ho¹t bëi ng¾t mÒm.

2. nh¾c l¹i vÒ ng¾t, b¶ng vector ng¾t; lÖnh IRET

- Ng¾t - B¶ng Vector ng¾t - LÖnh IRET

Mçi khi nhËn ®­îc mét lêi gäi ng¾t MPU PUSH 3 word vµo Stack: Flag, CS, IP sau ®ã thùc hiÖn nhiÖm vô (ch­¬ng tr×nh con xö lý ng¾t), sau khi thùc hiÖn xong nhiÖm vô MPU ph¶i POP UP 3 word nµy ®Ó cã thÓ tiÕp tôc qu¸ tr×nh cña m×nh. Cuèi cña ch­¬ng tr×nh con xö lý ng¾t ph¶i cã lÖnh IRET,

chÝnh lÖnh nµy lµm cho MPU thùc hiÖn POP 3 word tõ Stack.

3. viÖc chÆn ng¾t (Intercepting Interrupt Vector)

C¸c ch­¬ng tr×nh TSR th­êng söa néi dung cña Vector ng¾t trong b¶ng Vector ng¾t lµm cho nã trá ®Õn ®Þa chØ cña m×nh trong bé nhí, nhê thÕ mçi khi ng¾t t­¬ng øng ®­îc gäi ®Õn th× ch­¬ng tr×nh TSR l¹i ®­îc trao ®iÒu khiÓn.

ThÝ dô nhiÒu ch­¬ng tr×nh POP-UP th­êng söa ng¾t bµn phÝm INT 9, t¹i ®Þa chØ 0:0024H lµm cho nã trá ®Õn m×nh vµ cÊt ®Þa chØ cò cña INT 9 ®Ó cho nã lµm nhiÖm vô vèn cã khi cÇn.

ii. c¸c b­íc thùc hiÖn lµm mét ch­¬ng tr×nh trë thµnh tsr

1. ViÖc lÊy vµ ®Æt l¹i vector ng¾t b»ng c¸c Service cña DOS

(The Get and Set Vector Services of INT 21h)

Chóng ta th­êng lu«n cÇn ®Õn c¸c ch­¬ng tr×nh con xö lý ng¾t vèn cã cña hÖ thèng ®Ó khái ph¶i viÕt l¹i trong ch­¬ng tr×nh cña m×nh ®o¹n ch­¬ng tr×nh ®· cã, v× vËy cÇn lÊy néi dung cña vector ng¾t cò (®Þa chØ -DD) cÊt vµo miÒn data cña ch­¬ng tr×nh TSR, khi nµo cÇn sÏ tr¶ l¹i gi¸ trÞ nµy cho Vector mµ TSR Program ®· thay ®æi.

Ngay c¶ khi ch­¬ng tr×nh TSR cña chóng ta kh«ng cÇn ®Õn ch­¬ng tr×nh con xö lý ng¾t cò, TSR cña chóng ta còng cÇn tr¶ l¹i gi¸ trÞ cò mµ ch­¬ng tr×nh cña chóng ta ®· ®æi tr­íc khi kÕt thóc, nÕu kh«ng trong tr­êng hîp cã mét ch­¬ng tr×nh th­êng tró kh¸c ®· th­êng tró tr­íc ch­¬ng tr×nh cña chóng ta vµ còng chiÕm chÝnh ng¾t nµy th× nã sÏ kh«ng bao giê ch¹y ®­îc n÷a (v× nã sÏ kh«ng bao giê ®­îc trao ®iÒu khiÓn mÆc dï vÉn th­êng tró)

1.1 Get Interrupt Vector

input: AH:= 35h output: ES:BX = Interrupt Vector

AL:= Interrupt Number

ThÝ dô: lÊy ng¾t bµn phÝm (INT 9)

CODE Segmment

ASSUME CS:CODE, DS:CODE

ORG 100h

Interrupt_Number EQU 9;sè hiÖu cña INT mµ ta muèn lÊy ®Ó cÊt

Start: jmp LOAD_PROG

... ... old_interrupt DW 2 DUP(0);sÏ gi÷ néi dung cò cña Interrupt_Number

... ... PROG PROC;Ch­¬ng tr×nh TSR cña ta

MOV AH, 35H

MOV AL, Interrupt_Number

INT 21H

MOV old_interrupt, BX;store low word of double word

MOV old_interrupt[2], ES;store high word of double word

...

1.2 Set Interrupt Vector

input: AH:= 25h output: none

AL:= Interrupt Number

DS:DX:= New Interrupt Handler Address

ThÝ dô:

PROG PROC;Ch­¬ng tr×nh TSR cña ta

...

MOV AH, 35H

MOV AL, Interrupt_Number

INT 21H

MOV old_interrupt, BX;store low word of double word

MOV old_interrupt[2], ES;store high word of double word

MOV AH, 25H

LEA DX, PROG;Set new Interrupt Vector

INT 21H

...

* Gi¶i thÝch vÒ lÖnh LEA (Load Effective Address):

LEA DX, PROG gièng nh­ MOV DX, offset PROG

chØ kh¸c lµ to¸n h¹ng ®Ých (Dest) ph¶i lµ Reg chø kh«ng ®­îc lµ Mem

2. Lµm cho ch­¬ng tr×nh ë l¹i th­êng tró -INT 27h, INT 21h function 31h

(Making Code Memory-Resident)

- NÕu sö dông INT 21H, service 31H nã sÏ tr¶ l¹i Return Code mµ ta cã thÓ

kiÓm tra b»ng Errorlevel trong lÖnh .BAT hoÆc INT 21h, Function 4DH. - NÕu sö dông INT 27H ta chØ cÇn cho DS:DX trá tíi ®Þa chØ cuèi cïng mµ ta

muèn gi÷ l¹i th­êng tró.

Trong bµi nµy chóng ta chØ xem xÐt viÖc sö dông INT 27H.

Nãi chung tÊt c¶ c¸c ch­¬ng tr×nh TSR ®Òu tù n¹p nã vµo bé nhí sau ®ã tù lo¹i bá 'c¸i ®u«i' cña m×nh -®ã lµ ®o¹n m· thùc hiÖn n¹p ch­¬ng tr×nh vµo bé nhí- cßn ®­îc gäi lµ phÇn t¹m tró (transient part).

;-------------------------------------------------------------------------- CODE Segmment

ASSUME CS:CODE, DS:CODE

ORG 100h Start: jmp LOAD_PROG

;Data Area

PROG PROC;Ch­¬ng tr×nh TSR cña ta

program Area

PROG Endp ;-------------------------------------------------------------------------- LOAD_PROG PROC

Interrupt Vectors Reset to PROG here.

MOV DX, offset LOAD_PROG

INT 27H LOAD_PROG Endp;phÇn l­u tró cña ch­¬ng tr×nh TSR end CODE;sÏ bÞ c¾t bá sau khi thùc hiÖn end Start ;--------------------------------------------------------------------------

iii. viÕt ch­¬ng tr×nh xö lý ng¾t ???

PhÇn trªn ®· tr×nh bµy vÒ c¸ch thiÕt kÕ ®o¹n ch­¬ng tr×nh l­u tró, phÇn III nµy sÏ tr×nh bµy vÒ viÖc viÕt chÝnh phÇn ch­¬ng tr×nh sÏ ë l¹i l­u tró trong bé nhí - nã sÏ thùc hiÖn nhiÖm vô mµ chóng ta muèn khi ng¾t mµ nã chÆn (chiÕm) ®­îc gäi.

VÒ c¬ b¶n nã gièng mäi ch­¬ng tr×nh .COM mµ chóng ta vÉn viÕt, chØ cã méi sè thay ®æi nhá nªu sau ®©y:

1. sö dông c¸c lÖnh PUSH, POP, IRET

- ta ph¶i b¶o vÖ c¸c th«ng tin tr¹ng th¸i tr­íc khi thùc hiÖn ch­¬ng tr×nh TSR cña m×nh vµ kh«i phôc l¹i tr­íc khi kÕt thóc - trë vÒ ch­¬ng tr×nh

gäi ng¾t. - Ta cã thÓ dïng PUSHA, POPA, PUSHF, POPF (Push/Pop All Registers, Push/Pop Flag register) nÕu ta cã chØ dÉn Assembler .286 (tr­íc ORG 100H ch¼ng

h¹n) - IRET - khi gÆp IRET MPU thùc hiÖn POP IP, POP CS vµ POPF; cÇn ®Æc biÖt l­u ý lµ lÖnh CALL gäi mét PROCEDURE hay gäi mét ch­¬ng tr×nh con xö lý ng¾t (kÕt thóc bëi IRET) lµ nh­ nhau, tr­íc khi thùc hiÖn lêi gäi CALL MPU thùc hiÖn PUSH IP, PUSH CS , kh«ng thùc hiÖn PUSHF , chÝnh v× vËy mµ tr­íc lêi gäi CALL tíi 1 ch­¬ng tr×nh con xö lý ng¾t cÇn thùc hiÖn lÖnh

PUSHF, nÕu kh«ng lÖnh IRET sÏ lµm 'thñng ®¸y' STACK!

CODE SEGMENT

ASSUME CS:CODE, DS: CODE

ORG 100H

Start: JMP Load_Prog

...

;Data Area

...

Prog PROC

PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI PUSH DS PUSH ES

; th©n ch­¬ng tr×nh TSR

Exit: POP ES

POP DS POP SI POP DI

POP DX POP CX POP BX

POP AX

IRET Prog ENDP

2. Calls gi¸n tiÕp, chØ thÞ assembler DD, label

ThÝ dô

...

ORG 100h

Start: JMP PROG_A

PROG_B_ADDRESS DW 0

PROG_A PROC

...

MOV PROG_B_ADDRESS, OFFSET PROG_B

CALL PROG_B_ADDRESS

...

PROG_A ENDP

PROG_B PROC

RET

PROG_B ENDP

- Ta l­u ®Þa chØ offset cña nh·n PROG_B ë mét word trong bé nhí

PROG_B_ADDRESS, MPU X86 cho phÐp ta thùc hiÖn lÖnh gäi nh­ sau:

CALL PROG_B_ADDRESS ®iÒu nµy hÕt søc tiÖn lîi bëi v× nãi chung chóng ta kh«ng biÕt tr­íc ch­¬ng tr×nh con xö lý ng¾t cò n»m ë ®©u trong bé nhí, v× thÕ còng kh«ng thÓ g¸n cho nã mét c¸i tªn nh­ lµ PROG_B. Tuy nhiªn ®Ó gäi ch­¬ng tr×nh con xö lý ng¾t cò ta ph¶i dïng ®Þa chØ ®Çy ®ñ chø kh«ng

thÓ chØ dïng ®Þa chØ offset. - Assembler x¸c ®Þnh ®­îc nh·n sau CALL lµ Word hay Double Word ®Ó g¸n

®Þa chØ cho CALL. Ch­¬ng tr×nh con xö lý ng¾t cò nãi chung kh«ng n»m trong cïng Segment víi ch­¬ng tr×nh TSR cña ta v× vËy lÖnh CALL cÇn cã mét ®Þa chØ ®Çy ®ñ (4 bytes = Double Word), nh­ng nÕu ta dïng DD (Define Double Word) ®Ó dµnh ra 4 byte lµm biÕn chøa vector ng¾t vµ g¸n cho nã

mét c¸i nh·n nh­ sau:

PROG_B_ADDRESS DD 0

th× c¸c lÖnh MOV víi to¸n h¹ng SRC lµ 1 byte hay 1 word sÏ kh«ng sö dông ®­îc PROG_B_ADDRESS nh­ lµ to¸n h¹ng Dest- v× nã lµ to¸n h¹ng 4 byte,

®iÒu nµy còng t­¬ng tù nh­ sù kh«ng t­¬ng thÝch vÒ kiÓu trong PASCAL. - Sö dông chØ dÉn Assembler LABEL cã thÓ gi¶i quyÕt vÊn ®Ò nµy rÊt tèt ®Ñp,

ta sÏ lµm nh­ sau:

CODE SEGMENT

ASSUME CS:CODE, DS: CODE

ORG 100H

Start: JMP Load_Prog

Old_Interrupt LABEL WORD

Old_Interrupt_Address DD ?

Prog PROC

...

LABEL sÏ g¸n cho vÞ trÝ hiÖn t¹i (n¬i x¶y ra khai b¸o) mét c¸i tªn, gièng nh­ khi ta dïng DB, DW hay DD; trong khi ®ã, chÝnh vÞ trÝ nµy còng

®­îc g¸n c¸i tªn Old_Interrupt_Address bëi chØ dÉn Assembler

Old_Interrupt_Address DD ?

Nãi c¸ch kh¸c, b©y giê chóng ta muèn truy cËp cïng mét vÞ trÝ nhí b»ng 2

c¸ch: nh­ lµ Word vµ còng nh­ lµ Double Word.

LABEL ®­îc ®­a vµo trong MACRO ASSEMBLER chÝnh lµ nh»m gi¶i quyÕt vÊn ®Ò

nµy!

3. D¹ng tæng qu¸t cña mét ch­¬ng tr×nh TSR CHÆn ng¾t

Interrupt_Number EQU 9;sè hiÖu cña INT mµ ta muèn lÊy ®Ó cÊt

CODE SEGMENT

ASSUME CS:CODE, DS: CODE

ORG 100H

Start: JMP Load_Prog;nh¶y tíi ®o¹n ch­¬ng tr×nh t¹m tró

Old_Interrupt LABEL WORD

Old_Interrupt_Address DD ?;SAVE vector ng¾t cò

;Data Area

Prog PROC

PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI PUSH DS

PUSH ES

PUSHF

CALL Old_Interrupt_Address

; th©n ch­¬ng tr×nh TSR

Exit: POP ES

POP DS POP SI POP DI

POP DX POP CX POP BX

POP AX

IRET Prog ENDP ;--------------------------------------------------------------------------

LOAD_PROG PROC;this procedure initializes everything

MOV AH, 35H;lÊy Vector ng¾t vµo ES:BX

MOV AL, Interrupt_Number;see EQU assembler directive

INT 21H

MOV old_interrupt, BX;store low word of double word

MOV old_interrupt[2], ES;store high word of double word

MOV AH, 25H;set new interrupt vector

LEA DX, PROG

INT 21H

EXIT2: MOV DX, OFFSET Load_Prog;®¸nh dÊu phÇn gi÷ l¹i th­êng tró

INT 27H;tr­íc byte ®Çu tiªn cña LOAD_PROG

LOAD_PROG ENDP

END CODE

END Start

4. mét sè ®iÓm cÇn l­u ý

- tr¸nh sö dông c¸c ng¾t cña DOS, kÓ c¶ INT 21H bëi v× muèn sö dông ®­îc

cÇn ph¶i lµm rÊt nhiÒu viÖc, khã, dÔ sinh trôc trÆc! - cã mét sè ng¾t cøng rÊt cã Ých cho viÖc lËp tr×nh th­êng tró:

INT 8: Timer interrupt, mçi gi©y ph¸t ra 18.2 lÇn

INT 9: KeyBoard interrupt, ph¸t ra khi cã mét thao t¸c phÝm

INT 13: DISK interrupt, ®­îc gäi khi cÇn thùc hiÖn mét thao t¸c ®Üa

IV. mét sè ch­¬ng tr×nh minh ho¹

1. Ch­¬ng tr×nh chÆn ng¾t bµn phÝm (INT 9)

Cã lÏ tÊt c¶ c¸c ch­¬ng tr×nh POP-UP thùc tÕ ®Òu chÆn (Intercept) ng¾t sè 9 - ng¾t bµn phÝm. §Þa chØ cña vector ng¾t lµ 4x9 = 24H; 0:0024H. Khi cã mét thao t¸c phÝm, KeyBoard ph¸t ra mét tÝn hiÖn ®iÖn (IRQ1) yªu cÇu MPU xö lý, MPU sÏ dõng c«ng viÖc, gäi ng¾t nµy - INT 9, nã sÏ ®äc cæng bµn phÝm (60H) nhËn m· SCAN cña t¸c ®éng phÝm võa x¶y ra, ngoµi ra nã sÏ ®äc Keyboard Flags, ®ã lµ word ë ®Þa chØ 40:0017 ®Ó kÕt hîp víi SCAN CODE sinh ra ASCII code øng víi t¸c ®éng phÝm. CÆp hai byte ASCII CODE, SCAN CODE ®­îc INT 9 ®Æt vµo Keyboard Buffer, theo thø tù ASCII byte, SCAN byte. Chóng sÏ n»m ë ®ã cho tíi khi ®­îc c¸c phôc vô cña BIOS ®äc th«ng

qua INT 16H.

NÕu INT 9 ph¸t hiÖn thÊy tõ cæng 60H c¸c m· SCAN øng víi c¸c tæ hîp phÝm ®Æc biÖt: Ctrl_Alt_Del, PrintScreen (Shift_Prinscreen), Ctrl_Numlock, Ctrl_Break, SysReq th× nã sÏ hiÓu ®©y nh­ lµ c¸c lÖnh, khiÕn ROM-BIOS ph¶i thùc hiÖn ngay tøc kh¾c chø kh«ng l­u l¹i m· cña c¸c

tæ hîp phÝm nµy trong Keyboard Buffer.

- khi gÆp Ctrl_Alt_Del,ROM-BIOS gäi INT 19H (Boot strap loader)

- khi gÆp PrtScr, ROM-BIOS gäi INT 5 hard copy

- khi gÆp Ctrl_Numlock ROM-BIOS thùc hiÖn mét vßng lÆp v« h¹n cho tíi khi

cã mét t¸c ®éng phÝm míi (t¸c ®éng phÝm nµy còng kh«ng ®­îc ghi l¹i.)

- khi gÆp Ctrl_Break , ROM-BIOS gäi INT 1B - kÕt thóc ch­¬ng tr×nh

®ang thùc hiÖn, tr¶ ®iÒu khiÓn vÒ cho DOS.

- khi gÆp 'SysReq' ROM-BIOS gäi INT 15H víi gi¸ trÞ 8500H trong AX, khi nh¶ phÝm nµy INT 15H còng ®­îc gäi nh­ng víi AX:= 8501H. Function 85H

cña INT 15H chØ chøa 1 lÖnh IRET, kh«ng g©y t¸c ®éng g×!

1.1 Keyboard buffer and Scan Codes

- mçi phÝm trªn bµn phÝm ®­îc Micro Processor cña bµn phÝm g¸n cho mét m· gäi lµ Scan Code ®Æc tr­ng cho vÞ trÝ cña phÝm trªn bµn phÝm vµ cho

tr¹ng th¸i cña phÝm (Ên nh­ng ®· nh¶ hay ch­a nh¶ ra) - Keyboard buffer lµ mét miÒn nhí 16 word trong RAM (BIOS DATA AREA), l­u

tr÷ ®­îc 16 t¸c ®éng phÝm. - Keyboard buffer ®­îc tæ chøc theo kiÓu Circular buffer (Queue), thao t¸c Read from vµ thao t¸c Write to Keyboard buffer lµ ®éc lËp víi nhau. §iÒu

nµy lµm cho viÖc ghi t¸c ®éng phÝm vµo vµ ®äc ra ®­îc thuËn lîi.

+ Head

T¹i bÊt cø thêi ®iÓm nµo 1 trong sè 16 Word ®­îc gäi lµ Head (®Çu), ®ã lµ vÞ trÝ sÏ ®äc ký tù tiÕp theo ra khái Keyboard buffer. Sau mçi thao

t¸c ®äc Head ®­îc t¨ng vÞ trÝ lªn 1 word.

word t¹i ®Þa chØ 40:001A chØ ra ®Þa chØ cña HEAD (location of Keyboard

Buffer Head)

+ Tail

1 word kh¸c trong sè 16 Word ®­îc gäi lµ Tail (®u«i), ®ã lµ vÞ trÝ sÏ ghi t¸c ®éng phÝm tiÕp vµo Keyboard buffer. Sau mçi thao t¸c ghi Tail

®­îc t¨ng vÞ trÝ lªn 1 word.

word t¹i ®Þa chØ 40:001C chØ ra ®Þa chØ cña TAIL (location of Keyboard

Buffer TAIL)

+ Keyboard buffer ®Çy:

khi c¶ Head vµ Tail cïng trá tíi word cuèi cïng cña miÒn 16 word, nÕu cã thªm 1 t¸c ®éng phÝm n÷a x¶y ra, chóng (HEAD & TAIL) ®­îc quay

vßng trë l¹i ®Çu cña miÒn tøc lµ cïng trá vµo 40:001E

+ Keyboard buffer rçng:

Cø mçi phÝm ®­îc ®äc HEAD l¹i tiÕn gÇn TAIL h¬n, khi tÊt c¶ buffer ®· ®­îc ®äc hÕt, HEAD ®uæi kÞp TAIL, c¶ hai trá tíi cïng mét ®Þa chØ, lóc

®ã Keyboard buffer lµ rçng. - Ta cã thÓ xem bªn trong Keyboard buffer b»ng c¸ch dïng DEBUG nh­ sau:

- D 0:39E -- ;xem 128 byte tõ 0:39E tíi 0:41D

- AAAAAAAAAAAAAAAA -- ;Fill ®Çy Keyboard buffer bëi 16 ký tù 'A'

;vµ cuèi cïng lµ c¶ ký tù CR (0DH)

- D -- ;chÝnh ký tù 'D' nµy vµ c¶ ký tù CR (0DH)

;theo sau còng ®­îc ®Æt trong Keyboard buffer

sau lÖnh D cuèi cïng nµy ta sÏ thÊy mäi ®iÒu nh­ ®· m« t¶ ë trªn.

Chó ý r»ng, nÕu cã mét ch­¬ng tr×nh TSR nµo ®ã chÆn ng¾t bµn phÝm råi

th× kÕt qu¶ cã thÓ kh«ng hoµn toµn gièng nh­ trªn.

1.2 MiÒn d÷ liÖu cña BIOS (BIOS DATA AREA)

Keyboard buffer n»m trong miÒn BIOS data Area, n»m sau b¶ng Vector ng¾t:

Address Contents

-------------------------------------------------------------------------

40:0000 - 40:0006 Addresses of RS 232 adapters 1-4 40:0008 - 40:0006 Addresses of printer adapters 1-4

40:0010 Equipment Flag (Returned by INT 11H)

40:0012 Manufacturer's test mark

40:0013 Motherboard memory (in KB)

40:0015 I/O Channel memory

40:0017 The Keyboard Flags (see below) *** 40:0019 Numbers input with ALT key *** 40:001A Location of Keyboard Buffer Head *** 40:001C Location of Keyboard Buffer Tail *** 40:001E - 40:003D Keyboard Buffer ***

40:003E Status of Diskette Seek

40:003F Status of Diskette Motor

40:0040 Timeout of Diskette Motor

40:0041 Status of Diskette

40:0042 - 40:0048 Status Bytes of Diskette Controller (The NEC)

40:0049 Display Mode (see the section on Clock)

40:004A Number of Columns (40 or 80)

40:004C Length of Video Regen. Buffer

40:004E Starting Address in Regen. Buffer

40:0050 - 40:005E Position of Cursors on Screen pages 1-8

40:0060 Mode of the Cursor 40:0062 Active Page Number

40:0063 Address of current display adapter

-------------------------------------------------------------------------

BBIOS Data Area at 0:0410.

1 1 1 1 1 1

5432109876543210 Perform INT 11H or fetch AX=word at 0:0410

prt j aux drvvidram7

bit mask value

0: 0=no disk drives present (AX & 0001H)

1: 8087 coprocessor

2-3: motherboard RAM (AX & 000eH)

01=16K; 10H=32K; 11H=64K+

ðPS/2ð bit 2=pointing device installed

4-5: Initial/active video mode (AX & 0030H)

00=(reserved) 10=80-clm color

01=40-clm color 11=TTL Monochrome

6-7: total diskettes drives-1 (AX & 00c0H)

00=1; 01=2; 10=3; 11=4

8: DMA present (AX & 0100H)

9-11: RS232 ports (AX & 0e00H)

000=none; 001=1; ... 111=7

12: 1=game adapter present (AX & 1000H)

13: 1= -Jr- serial printer

14-15: printers installed (AX & c000H)

00=none; 01=1; 10=2; 11=3

Notes:

This data word is often used to ascertain the active video adaptor and the location of video RAM. If (AX & 30H) == 30H then the monochrome

adapter is activevideo RAM segment is at b000H, otherwise use b800H.

* Ta cã thÓ g¸n nh·n (Label) cho c¸c sè liÖu trong BIOS DATA AREA b»ng

c¸ch ®Þnh nghÜa mét segment víi 1 chØ thÞ assembler AT nh­ sau:

ROM_BIOS_DATA SEGMENT AT 40H;BIOS status and KBD Buff. held here

ORG 1AH

HEAD DW ?;unread chars go from HEAD to TAIL

TAIL DW ?

BUFFER DW 16 DUP(?);this is KBD Buff.

BUFFER_END DW ?

ROM_BIOS_DATA ENDS

* 40:0017,0018 The Keyboard Flags

Bit State Byte at 40:0017 Byte at 40:0018

-------------------------------------------------------------------------

0 Right Shift 1 -- Key is pressed

1 Left Shift 1 -- Key is pressed

2 Ctrl_ Shift 1 -- Key is pressed

3 1 -- Alt_Shift is pressed 1 -- Ctrl_Numlock On

4 Scroll_Lock 1 -- ON 1 -- Key is pressed

5 Num_Lock 1 -- ON 1 -- Key is pressed

6 Caps_Lock 1 -- ON 1 -- Key is pressed

7 Insert 1 -- ON 1 -- Key is pressed hai byte nµy th­êng ®­îc c¸c ch­¬ng tr×nh viÕt cho assembler sö dông, byte ®Çu t¹i 40: 0017 ®ã chÝnh lµ byte do INT 16, service 2 tr¶ vÒ trong

AL - byte nµy m« t¶ tr¹ng th¸i bµn phÝm.

BÊt kÓ ch­¬ng tr×nh nµo mµ cã thÓ truy cËp tíi 2 byte nµy ®Òu cã thÓ thay ®æi tr¹ng th¸i bµn phÝm cña PC, bëi v× SCAN CODE tõ bµn phÝm göi vÒ ®­îc INT 9 ®äc råi dÞch sang m· ASCII ph¶i dùa trªn 2 byte nµy (Keyboard

Flags).

Chóng ta cã thÓ dïng DEBUG viÕt 1 ch­¬ng tr×nh nhá trong bé nhí ®Ó thö

nghiÖm, tªn ch­¬ng tr×nh ta ®Æt lµ TURNCAPS.COM:

?\DEBUG

_ NTURNCAPS.COM --

- A100 --

- xxxx:0100 MOV AX,40 --

- xxxx:0103 MOV DS,AX --

- xxxx:0105 MOV BX,17 --

- xxxx:0108 OR BYTE PTR [BX],40 --

- xxxx:010B INT 20 --

- xxxx:010B --

- RCX --

CX 0000 -- ;ta ®­a sè liÖu D vµo - sè byte sÏ ghi vµo

: D -- ;file TURNCAPS.COM

- W --

Writing 0000D bytes

- Q --

khi trë vÒ DOS, nÕu ta ch¹y TURNCAPS.COM nh­ ch¹y c¸c ch­¬ng tr×nh .COM kh¸c th× sÏ thÊy ®Ìn CAPS_LOCK bËt s¸ng (nÕu tr­íc ®ã lµ t¾t), tÊt nhiªn

nÕu ta Ên phÝm CAPS_LOCK th× vÉn cã t¸c dông nh­ b×nh th­êng.

1.3 §äc tõ Keyboard Buffer

- Khi cã lêi gäi INT 9 th× ch­¬ng tr×nh cña chóng ta chiÕm quyÒn ®iÒu

khiÓn, viÖc lµm ®Çu tiªn cña nã lµ gäi ch­¬ng tr×nh xö lý ng¾t bµn phÝm

cò ®Ó nhËn t¸c ®éng phÝm, ®Æt m· ASCII vµ SCAN vµo Keyboard Buffer. - Sau ®ã ch­¬ng tr×nh cña ta sÏ kiÓm tra xem (tæ hîp) phÝm nµo ®· ®­îc t¸c

®éng, cô thÓ nh­ sau:

+ cho DS trá tíi ROM_BIOS_DATA segment (sau chØ thÞ assume ds:ROM_BIOS_DATA)

+ kiÓm tra xem TAIL cã ë trong Keyboard Buffer kh«ng, word n»m tr­íc TAIL chÝnh lµ øng phÝm võa míi nhËn vµo. §äc SCAN CODE vµo DH, ASCII

CODE vµo DL.

+ kiÓm tra word trong DX xem cã ph¶i lµ HOT-KEY hay kh«ng, nÕu kh«ng

ph¶i th× kÕt thóc (JMP to EXIT label).

1.4 LÊy c¸c 'phÝm' ra khái Keyboard Buffer (Removing keys grom the Keyboard Buffer).

NÕu nhËn ra HOT-KEY, ch­¬ng tr×nh cña ta cÇn ph¶i 'ra tay', b¾t ®Çu chÆn tÊt c¶ c¸c phÝm ®¸nh vµo nh­ lµ input cña nã. §iÒu nµy cã nghÜa lµ ch­¬ng tr×nh cña chóng ta sÏ lÊy (remove) c¸c 'phÝm' khái Keyboard Buffer ngay khi chóng ®­îc ®¸nh vµo vµ ®Æt vµo miÒn d÷ liÖu cña ch­¬ng tr×nh cña ta. Khi ch­¬ng tr×nh cña ta kÕt thóc nhiÖm vô m· (2 byte) cña

HOT-KEY sÏ kh«ng cã ë Keyboard Buffer.

§Ó lµm viÖc nµy ta chØ cÇn lµm cho con trá TAIL (40:001CH) trá vµo ®óng

vÞ trÝ 'phÝm' võa ®­îc ®¸nh vµo.

1.5 SWITCH.ASM - A TSR HOT-KEY PROGRAM

Bµi gi¶ng m«n Assembly Language, Bµi 7 - $ - NguyÔn §×nh ViÖt, §HQG HN, 1995 ---------------------------------------------------------------------------

Bạn đang đọc truyện trên: Truyen2U.Pro