Assermbler
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, nhng 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 nhng ®î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õ, nhng 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. Lu ý 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)
(cha ®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, nhng 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Ï lu ®å (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)
Lu ý: - 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, nhng 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 cha ®Þ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 cha 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 nhng chÝnh lµ ®iÒu chóng ta muèn, nã b¸o r»ng cha 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) nhng 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 cha.
- Lu ý: 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, nhng 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, nhng ®Ó 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, nhng cÇn lu ý: - ®Æ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, nhng sö dông File rÊt quan träng v× nã lµ bé nhí ngoµi, cã thÓ lu 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 ®Ó lu 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 - ngng 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 lu 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 ®Ó lu 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), lu 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, lu 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, nhng 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 nhng 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 cha 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, cha 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 cha 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, nhng 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,
nhng nã hiÓn thÞ Pixel nhanh h¬n.
Lu ý:
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 nhng 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 nhng 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, nhng 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 cha ®î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
lu ý 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
lu ý - 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 cha 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, nhng
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 lu ý: 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, nhng 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, nhng 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), nhng ë 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), nhng 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 lu ý: 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 nhng 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 lu 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 lu 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 lu 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 lu ý 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 lu ®Þ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), nhng 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 lu ý
- 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 lu 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 nhng 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 trng cho vÞ trÝ cña phÝm trªn bµn phÝm vµ cho
tr¹ng th¸i cña phÝm (Ên nhng ®· nh¶ hay cha nh¶ ra) - Keyboard buffer lµ mét miÒn nhí 16 word trong RAM (BIOS DATA AREA), lu
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: AzTruyen.Top