Website: http://www.docs.vn Email :
[email protected] Tel (: 0918.775.368
Lêi nãi ®Çu
Ngµy nay c«ng nghiÖp m¸y tÝnh ®· trë thµnh mòi nhän khi bíc vµo kû
nguyªn kü thuËt hiÖn ®¹i.Víi tèc ®é t¨ng trëng ®¸ng kÓ nh÷ng s¶n phÈm liªn
quan ®Õn m¸y tÝnh tõ phÇn mÒm tíi c¸c thiÕt bÞ ghÐp nèi.ViÖt Nam còng ®ang
gãp phÇn vµo sù ph¸t triÓn cña c«ng nghÖ m¸y tÝnh, chuyÓn m×nh dÇn tõ thÞ trêng tiªu thô c¸c s¶n phÈm m¸y tÝnh thµnh n¬i ph¸t triÓn c«ng nghÖ. Bªn c¹nh
®ã c«ng nghÖ phÇn mÒm cña ViÖt Nam cã nhiÒu bíc tiÕn triÓn gãp phÇn thóc
®Èy sù ph¸t triÓn cña nÒn c«ng ngiÖp m¸y tÝnh nãi riªng vµ nÒn kinh tÕ nãi
riªng.
§· cã rÊt nhiÒu ng«n ng÷ lËp tr×nh ®îc sö dông ®Ó t¹o nªn sù ph¸t triÓn
cña nÒn c«ng nghÖ phÇn mÒm. Mét trong nh÷ng ng«n ng÷ lËp tr×nh xuÊt hiÖn
sím nhÊt ®ã lµ ng«n ng÷ lËp tr×nh Assembler. §©y lµ mét trong nh÷ng ng«n
ng÷ lËp tr×nh bËc thÊp thêng ®îc sö dông ®Ó lËp tr×nh hÖ thèng, nã cã mét u
®iÓm mµ kh«ng mét ng«n ng÷ lËp tr×nh nµo b× kÞp, bëi lÏ nã t¹o ra nh÷ng ch¬ng tr×nh cã dung lîng rÊt nhá, nã thêng ®îc sö dông ®Ó lµm c¸c ch¬ng tr×nh
qu¶n lý trong c«ng nghiÖp ,diÖt vius, t¹o vius, t¹o hÖ ®iÒu hµnh, t¹o mËt
khÈu…
HiÖn nay hÇu hÕt c¸c ch¬ng tr×nh khi viÕt xong ®Òu ®îc x¸c lËp mËt khÈu
®Ó b¶o mËt d÷ liÖu
Trong thêi gian häc tËp t¹i kho¸ häc 1996 – 2001 cña tr êng §¹i häc
Më Hµ Néi t«i ®· ®îc ®µo t¹o mét c¸ch cã hÖ thèng vµ tiÕp thu nh÷ng kiÕn
thøc vÒ ng«n ng÷ Assembler §Ó kÕt thóc kho¸ häc t«i ®îc nhËn vµ hoµn thµnh
®Ò tµi “X¸c lËp mËt khÈu cho ch¬ng tr×nh d¹ng tÖp cã ®u«i .COM”.
Môc tiªu cña ch¬ng tr×nh:
-Tríc tiªn ch¹y ch¬ng tr×nh x¸c lËp mËt khÈu víi nh÷ng yªu cÇu nhËp
tªn tÖp thùc hiÖn d¹ng .COM
-Sau ®ã nhËp mËt khÈu; Sau khi tÖp .COM ®· x¸c lËp mËt khÈu th× tõ
®ã trë ®i ch¬ng tr×nh chØ ®îc ch¹y khi vµo ®óng mËt khÈu ®· x¸c lËp
Ch¬ng I
C¬ së lý thuyÕt
C¸c file COM ®îc lu trªn ®Üa lµ h×nh ¶nh chÝnh x¸c cña néi dung bé nhí
sau khi c¸c file nµy ®îc n¹p. Sau khi ®îc n¹p, c¸c file .COM khong cÇn thªm
mét th«ng tin nµo n÷a vµ cã thÓ ch¹y ngay, do vËy, c¸c ch¬ng tr×nh COM cã
thÓ ®îc n¹p vµ khëi ®éng nhanh h¬n so víi c¸ ch¬ng tr×nh EXE. Ngay sau khi
ch¬ng tr×nh COM ®îc n¹p vµo bé nhí, ngay díi PSP, nã ®îc thùc hiÖn b¾t ®Çu
tõ « nhí s¸t « nhí cuèi cïng cña PSP, nghÜa lµ tõ ®Þa chØ offset 100h. ¤ nhí
nµy thêng chøa mét lÖnh nh¶y, lÖnh nµy nh¶y ®Õn phÇn ®Çu thùc cña ch¬ng
tr×nh.
Mét ch¬ng tr×nh COM kh«ng thÓ vît qu¸ 64KB(65536 byte), tÝnh c¶ ®é
dµi cña PSP (256 byte) vµ Ýt nhÊt 1tõ (2 byte) cho ng¨n xÕp. §é dµi mét ch¬ng
tr×nh COMkh«ng vît qu¸ 64 KB, nhng DOS vÉn dµnh c¶ bé nhí cho tr¬ng
tr×nh lo¹i nµy. Nã kh«ng ®Ó l¹i mét phÇn nhí tù do nµo (díi quan ®iÓm cña
DOS), vµ ch¬ng tr×nh COM kh«ng thÓ gäi mét ch¬ng tr×nh kh¸c th«ng qua
hµm EXEC. VÊn ®Ò nµy cã thÓ gi¶i quyÕt ®îc, nÕu ch¬ng tr×nh COM th«ng
qua mét hµm cña DOS gi¶i phãng bé nhí mµ nã kh«ng dïng ®Õn.
Khi ®iÒu khiÓn ®îc truyÒn cho ch¬ng tr×nh COM, c¸c thanh ghi ®o¹n
®Òu híng tíi ®Çu cña PSP. §Çu cña ch¬ng tr×nh COM (so víi ®Çu cña PSP)
lu«n ®îc ®Æt ë ®Þa chØ 100h. Con trá ng¨n xÕp nhËn gi¸ trÞ FFFEh vµ nã híng
tíi ®o¹n cuèi cña ®o¹n 64KB mµ ch¬ng tr×nh COM chiÕm, ng¨n xÕp tiÕn l¹i
gÇn cuèi ch¬ng tr×nh cø 2 byte mét, ngêi lËp tr×nh cÇn ®¶m b¶o lµm sao cho
ng¨n xÕp kh«ng lín ®Õn møc ®ông vµo phÇn cu«Ý ch¬ng tr×nh
Tån t¹i nhiÒu kh¶ n¨ng ®Ó kÕt thóc mét ch¬ng tr×nh COM vµ ®Ó tr¶ ®iÒu
khiÓn vÒ cho DOS hay ch¬ng tr×nh gäi.
NÕu ch¬ng tr×nh ch¹y díi DOS 1.0, nã cã thÓ kÕt thóc b»ng c¸ch gäi
hµm 00h cña ng¾t 21h hoÆc gäi ng¾t 20h. Mét kh¶ n¨ng kh¸c , tho¹t ®Çu cã vÎ
l¹, lµ kÕt thóc ch¬ng tr×nh b»ng mét “Near Return” (lÖnh assembler RET).
Khi lÖnh nµy ®îc thùc hiÖn, ch¬ng tr×nh ®îc tiÕp tôc tõ ®Þa chØ offset ®Æt trong
2byte ë ®Ønh ng¨n xÕp. Mµ hµm EXEC l¹i ®Æt gi¸ trÞ 0 vµo 2byte nµy tríc khi
trao ®iÒu khiÓn cho ch¬ng tr×nh COM. Nh vËy, ch¬ng tr×nh ®îc tiÕp tôc thùc
hiÖn t¹i ®Þa chØ CS:0000. V× ®Þa chØ nµy chÝnh lµ ®Ønh PSP, nã chøa lêi gäi ng¾t
20h, nªn ch¬ng tr×nh sÏ ®îc kÕt thóc b»ng ng¾t 20h.
§èi víi c¸c thÕ hÖ sau cña DOS, hµm 4Ch cña ng¾t 21h têng dïng ®Ó
kÕt thóc ch¬ng tr×nh. Nã kÕt thóc ch¬ng tr×nh vµ gäi mét ch¬ng tr×nh th«ng
b¸o, ch¬ng tr×nh th«ng b¸o nµy cho kÕt qu¶ díi d¹ng mét gi¸ trÞ sè . DOS
kh«ng ®Æt ë ®©y mét gi¸ trÞ cè ®Þnh nµo, nhng viÖc truyÒn gi¸ trÞ chØ cã ý
nghÜa nÕu ch¬ng tr×nh ®îc goi vµ ch¬ng tr×nh gäi ®Òu g¸n cho gi¸ trÞ ®ã mét ý
nghÜa nh nhau. ThÝ dô, mét kh¶ n¨ng hay ®îc dïng lµ th«ng b¸o cho ch¬ng
tr×nh gäi, th«ng qua gi¸ trÞ 0, r»ng ch¬ng tr×nh ®îc gäi kÕt thóc b×nh thêng,
trong khi mäi gi¸ trÞ kh¸c th«ng b¸o sù xuÊt hiÖn lçi trong khi thùc hiÖn ch¬ng
tr×nh ®îc gäi. Mét ngêi lËp tr×nh ng«n ng÷ bËc cao kh«ng cÇn ph¶i quan t©m
®Õn viÖc x©y dùng mét ch¬ng tr×nh COM, v× tr×nh biªn dÞch (compiler) sÏ lµm
thay mäi c«ng viÖc cÇn thiÕt. Ngîc l¹i, mét ngêi lËp tr×nh Assembler ph¶i
quan t©m ®Õn nhiÒu vÊn ®Ì khi x©y dùng mét ch¬ng tr×nh COM.
Ch¬ng tr×nh COM ®îc lu díi d¹ng ph¶n ¸nh chÝnh x¸c néi dung bé nhí
RAM sau khi d· ®îc n¹p. DOS kh«ng n¹p ch¬ng tr×nh nµy vµo mét ®Þa chØ
x¸c ®Þnh tríc. Chóng cã thÓ ®îc n¹p vµo mét ®Þa chØ bÊt kú(lµ béi nguyªn cña
16). Do vËy, c¸c ch¬ng tr×nh COM kh«ng nhÊt thiÕt ph¶i chøa ®Þa chØ ®o¹n râ
rµng. NÕu ®Þa chØ offset lu«n dùa vµo ®o¹n hiÖn thêi vµ nã chØ mét ®Þa chØ bÊt
kú trong ®o¹n ®ã, th× vÊn ®Ò l¹i kh«ng ph¶i nh vËy ®èi víi c¸c ®Þa chØ ®o¹n, v×
c¸c ®Þa chØ nµy x¸c ®Þnh c¸c ®o¹n cè ®Þnh c¸ch nhau 16 byte.
KÝch thíc mét ch¬ng tr×nh COM bÞ h¹n chÕ lµ 64KB nªn ngêi lËp tr×nh bÞ
giíi h¹n chØ ®îc dïng c¸c lÖnh NEAR, c¸c lÖnh nµy chØ thay ®æi ®Þa chØ offset
cña con trá lÖnh. C¸c lÖnh FAR kh«ng ®îc phÐp dïng trong ch¬ng tr×nh bëi v×
tÊt c¶ c¸c lÖnh FAR cho phÐp tiÕp tôc ch¬ng tr×nh ë mét chç kh¸c cña ch¬ng
tr×nh b»ng c¸ch x¸c ®Þnh l¹i kh«ng chØ ®Þa chØ offset mµ c¶ ®Þa chØ ®o¹n cña
con trá lÖnh (CS:IP). Do ®ã c¸c gi¸ trÞ kh«ng ®æi cã thÓ ®îc n¹p vµo mét thanh
ghi , thÝ dô nh ®Þa chØ ®o¹n cña RAM mµn h×nh.Nhng kh«ng thÓ n¹p mét ®Þa
chØ ®o¹n cña c¸c lÖnh hay d÷ liÖu cña ch¬ng tr×nh COM vµo mét thanh ghi
®o¹n. Bëi lÏ c¸c ®Þa chØ nµy thay ®æi mçi khi ch¬ng tr×nh ®îc gäi ch¹y. Mét
ch¬ng tr×nh COM kh«ng ®îc chøa nhiÒu ®o¹n vµ c¸c biÕn ph¶i n»m trong mét
®o¹n duy nhÊt-®o¹n m· lÖnh. V× chØ cã mét ®o¹n, nªn DOS cã thÓ n¹p ch¬ng
tr×nh vµo c¸c vÞ trÝ kh¸c nhau, tuú theo t×nh tr¹ng cña RAM cßn tù do. C¸c tr¬ng tr×nh COM kh«ng gÆp khã kh¨n g× khi ®Þnh nghÜa ng¨n xÕp. Nã ®îc ®Æt tù
®éng vµo cuèi ®o¹n COM 64KB.
Khi gäi mét ch¬ng tr×nh COM, DOS dµnh cho ch¬ng tr×nh nµy toµn bé
RAM cßn tù do, ®a sè ch¬ng tr×nh sÏ mÊt ®i khái bé nhí sau khi kÕt thóc vµ
bé nhí mµ nã chiÕm sÏ ®îc gi¶i phãng. Nhng nÕu mét ch¬ng tr×nh COM ®îc
chuyÓn thµnh néi tró, cã nghÜa lµ nã sÏ tån t¹i trong bé nhí sau khi thùc hiÖn,
th× mét sè vÊn ®Ò sÏ xuÊt hiÖn, v× díi quan ®iÓm cña DOS, kh«ng cßn bé nhí
tù do kh«ng thÓ n¹p vµ thùc hiÖn mét ch¬ng tr×nh kh¸c.
VÊn ®Ò còng sÏ xuÊt hiÖn, khi ch¬ng tr×nh COM trong qua tr×nh thùc hiÖn
yªu cÇu n¹p vµ thùc hiÖn mét ch¬ng tr×nh kh¸c th«ng qua hµm EXEC. §iÒu
nµy còng kh«ng thùc hiÖn ®îc, bëi v× DOS cho r»ng kh«ng cßn bé nhí tù do
®Ó nhËn ch¬ng tr×nh ®îc gäi. Tuy nhiªn , hai trêng hîp trªn cã thÓ ®îc gi¶i
quyÕt b»ng c¸ch gi¶i phãng vïng nhí mµ ch¬ng tr×nh kh«ng dïng ®Õn.
Cã hai kh¶ n¨ng ®Ó thùc hiÖn ®iÒu nµy: hoÆc lµ chØ gi¶i phãng phÇn bé
nhí n»m ngoµi ®o¹n COM 64 KB, hoÆc gi¶i phãng tÊt c¶ c¸c phÇn nhí mµ ch¬ng tr×nh kh«ng dïng ®Õn, tÝnh c¶ vïng nhí kh«ng sö dông n»m trong ®o¹n
COM. C¸ch thø hai cho phÐp gi¶i phãng ®îc nhiÒu RAM h¬n, nhng ng¨n xÕp
l¹i n»m ngoµi phÇn ch¬ng tr×nh COM (nã ë cuèi ®o¹n 64 KB). Cho nªn trong
trêng hîp nµy cÇn thiÕt ph¶i chuyÓn ng¨n xÕp ®Õn cuèi tr¬ng tr×nh vµ chØ gi¶i
phãng vïng nhí n»m sau ®u«i ng¨n xÕp. §Ó lµm ®iÒu nµy, ta ph¶i cho ng¨n
xÕp mét kÝch thíc x¸c ®Þnh. §èi víi ®a sè c¸c ch¬ng tr×nh th× 512 byte lµ qu¸
®ñ.
Trong khi kÝch thíc cña ch¬ng tr×nh COM kh«ng vît qu¸ 64 KB, th× mätt
ch¬ng tr×nh EXE cã thÓ lín ngang phÇn RAM tù do mµ DOS qu¶n lý. §ãi víi
cr COM, trong ®o¹n 64 KB ph¶i ®Æt c¶ m· lÖnh, d÷ liÖu vµ ng¨n xÕp. KÕt qu¶
lµ tÊt c¶ c¸c thanh ghi ®o¹n ®Òu nhËn cïng mét gi¸ trÞ khi khëi ®Çu vµ trong
qu¸ tr×nh thùc hiÖn ch¬ng tr×nh, gi¸ trÞ nµy chØ ra ®Þa chØ b¾t ®Çu cña mét ®o¹n
64 KB( chØ cã néi dung cña thanh ghi ES lµ cã thÓ bÞ thay ®æi, v× nã kh«ng cã
ý nghÜa trùc tiÕp víi viÖc thùc hiÖn ch¬ng tr×nh). §èi víi c¸c file EXE, sù tæ
chøc c¸c ®o¹n kh«ng ngÆt nghÌo nh vËy. M· lÖnh, d÷ liÖu ng¨n xÕp ®îc ®Æt
trong c¸c ®o¹n kh¸c nhau, mçi lo¹i cã thÓ ®îc ph©n bè trong nhiÒu ®o¹n. V× lÏ
®ã mµ c¸c thanh ghi ®o¹n cã gi¸ trÞ kh¸c nhau trong qu¸ tr×nh thùc hiÖn ch¬ng
tr×nh EXE. C¸c file COM lu trªn dÜa mÒm hay ®Üa cøng lµ h×nh ¶nh chÝnh x¸c
cña RAM khi thùc hiÖn ch¬ng tr×nh, trong khi c¸c file EXE l¹i ®îc lu trªn ®Üa
theo mét c¸ch ®îc m· ho¸.
Ch¬ng II
Giíi thiÖu ch¬ng tr×nh
Ch¬ng tr×nh ®îc chia lµm 2 phÇn:
PhÇn Cµi dÆt (INSTALL):
PhÇn nµy thùc hiÖn c¸c chøc n¨ng sau:
-Vµo tªn tÖp cã d¹ng .COM cÇn cµi mËt khÈu
-KiÓm tra liÖu tÖp .COM ®ã tríc ®· ®îc x¸c lËp mËt khÈu hay cha?
. NÕu tÖp .COM ®ã ®· x¸c lËp mËt khÈu råi th× 9 byte cuèi cña tÖp
.COM míi (®îc h×nh thµnh b»ng néi dung tÖp .COM + néi dung ®o¹n ch¬ng
tr×nh gép vµo thªm sau) sÏ chøa ch÷ "PROTECTED". Kh«ng tiÕn hµnh cµi ®Æt
vµ kÕt thóc phÇn ch¬ng tr×nh cµi ®Æt.
. NÕu tÖp .COM cha ®îc x¸c lËp mËt khÈu th× 9 byte cuèi cña tÖp .COM
®ã kh«ng ch÷ Protected. SÏ tiÕn hµnh nhËp mËt khÈu( 2lÇn : lÇn ®Çu nhËp mËt
khÈu vµo, kiÓm tra (verify) liÖu nhí ®óng mËt khÈu hay cha b»ng c¸ch nhËp
mËt khÈu lÇn n÷a vµ kiÓm tra mËt khÈu gi÷a 2 lÇn nhËp?). §äc 3 byte ®Çu cña
tÖp .COM vµ cÊt néi dung 3byte ®ã vµo mét biÕn nhí (®Ó sau nµy cã thÓ phôc
håi ®îc). TÝnh ®é dµi cña c¸c byte tÖp .COM cò vµ cÊt bíc nh¶y ®ã vµo biÕn 3
byte cã tªn JMPCODE: byte 1 lµ 0e9h - m· cña lÖnh JMP vµ 2 byte sau lµ bíc
nh¶y). Sau ®ã tiÕn hµnh ghi thªm ®o¹n ch¬ng tr×nh cÇn gép vµo tÖp .COM.
Lu ®å thuËt to¸n X¸c
lËp mËt khÈu cho
File .com
B¾t ®Çu
Vµo tÖp
d¹ng
.COM
KT tÖp ®ã cã tån
t¹i kh«ng
SAI
®óng
Tho¸t
KT .COM®ã
d· xl mk ch
a
sai
Xl MK cho tÖp
.COM
X¸c lËp l¹i mËt
khÈu
KT 2 lÇn
vµo MK cã
gièng nhau
hay ko?
sai
®óng
CÊt 3 byte ®Çu cña tÖp
.COM vµo biÕn nhí
X¸c lËp bíc nh¶y
Ghi ®oan ch¬ng tr×nh can
gép vµo tÖp .COM
PhÇn ch¬ng tr×nh sÏ gép vµo tÖp .COM sau khi ®· cµi mËt khÈu
(®o¹n tõ START CODE ®Õn END CODE).
PhÇn nµy sÏ ®îc ch¹y khi tiÕn hµnh ch¹y tÖp >COM ®· ®îc x¸c lËp mËt
khÈu. Khi mét tÖp .COM ®· ®îc x¸c lËp mËt khÈu th× 3 byte ®Çu cña tÖp
.COM ®ã chøa chøa lÖnh nh¶y ®Õn phÇn ch¬ng tr×nh gép thªm vµo vµ phÇn
ch¬ng tr×nh gép thªm vµo sÏ tiÕn hµnh c¸c chøc n¨ng sau:
- Yªu cÇu nhËp mËt khÈu.
- KiÓm tra mËt khÈu võa nhËp cã ®óng víi mËt khÈu ®· x¸c lËp hay cha?
. NÕu kh«ng ®óng th× kh«ng cho ch¬ng tr×nh ch¹y vµ tho¸t.
. Cßn nÕu ®óng mËt khÈu th× håi phôc l¹i phÇn m· ë 3 byte ®Çu cña tÖp .COM
(tríc khi cµi ®Æt mËt khÈu), ®a phÇn ®Þa chØ OFFSET vÒ 100h vµ tiÕp tôc ch¹y
phÇn ch¬ng tr×nh .COM
Lu ®å thuËt to¸n
FIle.com ®· ®îc x¸c
lËp mËt khÈu
Start
NhËp mËt khÈu
§óng
KiÓm tra
mËt khÈu
Sai
End
Kh«i phôc l¹i
ch¬ng tr×nh
Ch¹y ch¬ng tr×nh *.COM
Toµn bé ch¬ng tr×nh sÏ cã d¹ng sau:
; T¹o Macro cho hiÖn ra mµn h×nh mét x©u ký tù
HienString macro xau
mov dx, offset xau
mov ah,9 ;Nap so ham vao AH
int 21h
endm
;KÕt thóc macro
CODE segment
assume CS:CODE, DS:CODE, ES:CODE, SS:CODE
ORG 100h
BEGIN:
jmp INSTALL
;B¾t ®Çu ®o¹n chong tr×nh vµ phÇn d÷ liÖu sÏ gép (append) vµo tÖp .COM cÇn
x¸c lËp mËt khÈu
START_CODE:
call NEXT
NEXT:
pop SI
jmp CHECK
; B¾t ®Çu vïng d÷ liÖu cÇn ®îc gép vµo tÖp .COM
;SI+4
MESS
db 0ah,0dh,'PASSWORD : $'
;SI+18
FIRSTTHREE
db 3 dup(?)
;SI+21
KEYWORDLEN
dw ?
;SI+23
KEYWORD
db 30 dup(?)
;SI+53
CHFLAG
db 1
;SI+54
KEYWORDERR
db 10,13,10,13,10,13,'Access is denied !!! $'
;Ket thucs vïng du lieu se gop vao tep .COM
CHECK:
mov DX,SI
; hien xau ky tu MESS
mov AH,9
add DX,4
int 21h
mov BX,SI
add BX,21
; BX tro den KEYWORDLEN
mov CX,WORD PTR[BX] ; CX chua do dai cua KEYWORD
(mat ;khau)
inc BX
inc BX
;BX tro den vung nho KEYWORD
mov DI,SI
add DI,53
; DI tro den bien CHFLAG
STAR_CHECK:
mov AH,8
; Nhap cac ky tu mat khau(khong hien)
int 21h
cmp AL,0dh
jz END_CHECK
;Neu la ENTER ket thuc nhap mat khau
jcxz WRONG
cmp AL,BYTE PTR[BX] ;SS voi cac ky tu mat khau da xac lap
jnz WRONG
; Neu sai thi nhay
mov DL,'*'
; Hien dau'*' ra man hinh
mov AH,2
int 21h
inc BX
; Tro den byte tiep theo cua KEYWORD
dec CX
; Giam so luong byte cua bien KEYWORD
jmp STAR_CHECK
WRONG:
mov BYTE PTR[DI],0
mov DL,'*'
mov AH,2
int 21h
jmp STAR_CHECK
END_CHECK:
cmp BYTE PTR[DI],1 ; Hoi co CHFLAG(1=dung;0=sai mat khau)
jnz INCORPASS
cmp CX,0
ja INCORPASS
;Tra 3 byte cu dau cua tep.COM (khi chua gop) cat o bien FIRSTTHREE
;vao o ca o nho co dia chi OFFSET la 100h,101h va 102h
add SI,18
mov DI,100h
mov CX,3
cld
; Huong chuyen theo chieu tang cua dia chi
rep MOVSB
;Quay ve dau chuong trinh cu
mov AX,100h
push AX
ret
;Phan thong bao khi vao sai mat khau. Hien xau 'Acces is denied !!!'
INCORPASS:
mov DX,DI
inc DX
mov AH,9
int 21h
mov AH,4ch
int 21h
psign db 'PROTECTED'
END_CODE:
;Ket thuc doan ma chuong trinh gop vao tep .COM
INSTALL:
call CLRSCR
jmp EXEC
Buff
db 50
db ?
db 50 dup(?)
FILENAMELEN db ?
FILENAME
db 50 dup(?)
KEYWORD2
db 30 dup(?)
FILEHAND
dw ?
FILELEN
dw ?
JMPCODE
db 0e9h,?,?
FSIGN
db 9 dup(?)
MESS0
db 10,13,'Xac lap mat khau cho tep dang .COM$'
MESSN
db 10,13,'Ch¬ng tr×nh viÕt bëi NguyÔn Quèc ViÖt$'
MESS1
db 10,13,'Nhap ten FILE.COM: $'
MESS2
db 10,13,'Nhap mat khau:$'
MESS3
db 10,13,'Nhap lai:$'
MESS4
db 10,13,'DA NHAN ! $'
ERR1
db 10,13,'Khong the mo tep !$'
ERR2
db 10,13,'Khong the doc tep !$'
ERR3
db 10,13,'Khong the ghi tep !$'
ERR4
db 10,13,'Tep da duoc xac lap mat khau roi !$'
ERR5
db 10,13,'mat khau khong hop le !$'
EXEC :
HienString MESS0
HienString MESSN
HienString MESS1
;Vao ten tep .COM can xac lap mat khau
lea BX,FILENAME
; BX tro den dia chi dau chua ten tep
call GET_FILE_NAME ; Goi chuong trinh con vao tep
;Mo tep .COM de doc /ghi
mov AL,2
;Mode doc/ghi
mov DX,OFFSET FILENAME
mov AH,3dh
;chuc nang mo tep
int 21h
jnc NEXT1
HienString ERR1
;Thong bao khong mo duoc tep
jmp FINISH
NEXT1:
mov FILEHAND,AX
;Cat the tep(filehandle)vao bien
FILEHAND
;Xac lap kich thuoc cua tep bang cach di chyen den cuoi tep
mov AL,2
xor CX,CX
xor DX,DX
mov BX,FILEHAND
mov AH,42h
;Chucnang dich chuyen con tro tep
int 21h
mov FILELEN,AX
;Tro den 9 byte cuoi cua tep( Cac bute nhan dang lieu tep .COM da duoc xac
;lap mat khau hay chua? Neu da duoc xac lap thi 9 byte nay chua 9 ky
tu ;"PROTECTED"
mov AL,0
xor CX,CX
mov DX,FILELEN
sub DX,9
mov BX,FILEHAND
mov AH,42h
int 21h
;Doc 9 byte cuoi tep va de vao bien nho FSIGN
lea DX,FSIGN
mov CX,9
mov BX,FILEHAND
mov AH,3fh
int 21h
jnc NEXT2
HienString ERR2
jmp CLOSE
;SO sanh voi noi dung cua bien PSIGN de kiem tr lieu tep .COM
;do da duoc xac lap mat khau hay chua?
NEXT2:
mov SI,OFFSET PSIGN ;Tro den byte dau cua PSIGN
mov DI,OFFSET FSIGN ;Tro den byte dau cua FSIGN
mov CX,9
; So luong byte can so sanh la 9
cld
;So sanh tung byte theo chieu tang dia chi
repz cmpsb
;Lap viec so sanh voi dieu kien dung la: noi dung
;ZF=1 va noi dung CX=0
cmp CX,0
jnz NEXT3
HienString ERR4
jmp CLOSE
;Nhap mat khau neu tep .COM truoc do chua duoc xac lap mat khau
NEXT3:
HienString MESS2
mov DI,OFFSET KEYWORD
cld
xor CX,CX
;CX=0
START_REPEAT1:
mov AH,8
int 21h
cmp AL,0dh
jz END_REPEAT1
cmp CX,30
jae END_REPEAT1
stosb
inc CX
mov DL,'*'
mov AH,2
int 21h
jmp START_REPEAT1
END_REPEAT1:
mov KEYWORDLEN,CX
; KEYWORDLEN=so luong byte
mat khau
;Nhap lai mat khau (lan thu 2)
HienString MESS3
mov DI,OFFSET KEYWORD2
cld
xor CX,CX
START_REPEAT2:
mov AH,8
int 21h
cmp AL,0dh
jz END_REPEAT2
cmp CX,30
jae END_REPEAT2
stosb
inc CX
;Tang so dem so luong ky tu mat khau
mov DL,'*' ; Hien dau '*' ra man hinh
mov AH,2
int 21h
jmp START_REPEAT2
END_REPEAT2:
;So sanh giua hai lan nhap mat khau( so sanh theo tung byte)
cmp CX,KEYWORDLEN
; So sanh do dai mat khau giua hai
lan nhap
jnz PASSNMERR
; Neu khac nhau thi nhay
mov SI,OFFSET KEYWORD
; SI tro den xau ky tu vao lan 1
mov DI,OFFSET KEYWORD2 ; DI tro den xau ky tu vao lan 2
cld
; DF= 0 -So sanh theo chieu tang dia chi
repz cmpsb
; Vong lap so sanh mat khau 2 lan vao
jcxz NEXT4
PASSNMERR:
HienString ERR5
; Hien thong bao mat khau khong hop le
jmp NEXT3
NEXT4:
; Dich ve dau tep .COM
mov AL,0
mov BX,FILEHAND
xor CX,CX
xor DX,DX
mov AH,42h
int 21h
; Doc 3 byte dau cua tep.COM va cat vao bien FIRSTTHREE
mov AH,3fh
mov DX,FILEHAND
mov DX,OFFSET FIRSTTHREE
mov CX,3
int 21h
jnc NEXT5
; Doc tot thi nhay
jmp READERR
NEXT5:
;Tinh dia chi (phan OFFSET)cho lenh CALL de nhay ve dia chi chua lenh
;dau tien cua phan chuong trinh cua chung ta duoc gop them vao tep.COM khi
;tep nay duoc xac lap mat khau
mov BX,OFFSET JMPCODE ;Tro den bien JMPCODE
mov AX,FILELEN
sub AX,3
mov WORD PTR[BX+1],AX ; Cat do dai vao bytethu 2 va 3
; Chuyen ve dau tep
mov AL,0
mov BX,FILEHAND
xor CX,CX
xor DX,DX
mov AH,42h
int 21h
; Thay noi dung 3 byte dau cua tep.COM bang ma lenh CALL va 2 byte
;chua buoc nhay(bo qua phan ma chuong trnh.COM cu)
mov BX,FILEHAND
mov DX,OFFSET JMPCODE
mov CX,3
mov AH,40h
int 21h
jnc NEXT6
jmp WRITERR
NEXT6:
; Chuyen con tro ve cuoi tep
mov AL,2
; Mode buoc dich chuyen so voi cuoi tep
mov BX,FILEHAND ; BX chua the tep
xor CX,CX
; Buoc dich CX:DX=0 so voi cuoi tep
xor DX,DX
mov AH,42h
; chuc nang chuyen con tro tep
int 21h
; Ghi them vao cuoi tep.COM phan chuong trinh cua chung ta doan tu
;START_CODE den END_CODE
mov BX,FILEHAND
mov DX,OFFSET START_CODE
mov CX,OFFSET END_CODE
sub CX,DX
mov AH,40h
int 21h
; Dong tep
mov BX,FILEHAND
mov AH,3eh
int 21h
; Hien thong bao sai
HienString MESS4
jmp FINISH
; Phan cac thong bao sai
OPENERR:
HienString ERR1
jmp FINISH
READERR:
HienString ERR2
jmp CLOSE
WRITERR:
HienString ERR3
jmp CLOSE
PROTECTERR:
HienString ERR4
;Dong tep
CLOSE:
mov BX,FILEHAND
mov AH,3eh
int 21h
FINISH:
mov AH,8 ; cho 1 ky tu tu ban phim( khong hien ra)
int 21h
mov AH,4ch ; Ve DOS
int 21h
;------------------------------------------------------;
chuong trinh con vao ten tep can doc
;Vao: DX:BX tro den dia chi dau bien xau chua ten tep
;Ra: Ten tep nam o bien xau ten_tep
;---------------------------------------------------------CLRSCR PROC
push AX
mov AH,0fh
int 10h
mov AH,0
int 10h
pop AX
ret
CLRSCR ENDP
GET_FILE_NAME PROC
push AX BX DX DI ; Bao ve noi dung cac thanh ghi
lea DX,Buff
; DX tro den vung dem Buff de chua cac ky tu
mov AH,0ah
; doc duoc bang chuc nang 0ah cua int 21h.
int 21h
lea DI,Buff
inc DI
GF1:
inc DI
mov AL,[DI]
cmp AL,0dh
je GF2
mov [BX],AL
inc BX
jmp GF1
GF2:
xor AL,AL
mov [BX],AL
pop DI DX BX AX
ret
GET_FILE_NAME ENDP
CODE ENDS
END BEGIN
Phô lôc
Mét sè lÖnh assembler dïng
trong ch¬ng tr×nh
1. LÖnh MOV
Chøc n¨ng : ChuyÓn d÷ liÖu tõ to¸n h¹ng nguån sang to¸n h¹ng ®ich
Có ph¸p : mov DST,SRC
reg reg
mem data
reg data
segreg reg16
reg mem
segreg mem16
mem reg
reg16 segreg
mem16 segreg
2. LÖnh PUSH
Chøc n¨ng : ChuyÓn d÷ liÖu to¸n h¹ng nguån vµo ®Ønh ng¨n xÕp
Có ph¸p : PUSH SRC
3. LÖnh POP
Chøc n¨ng : ChuyÓn d÷ liÖu to¸n h¹ng nguån vµo ®Ønh ng¨n xÕp
Có ph¸p : POP DST
3. LÖnh IN
Chøc n¨ng : §äc d÷ liÖu tõ mét cæng 8/16 bit vµ ®a vµo AL/AX
Có ph¸p : IN
AL/AX, ®Þa chØ cæng
Chó ý
: NÕu ®Þa chØ cæng < 256 th× ®Þa chØ ®îc trùc tiÕp ®øng trong lÖnh IN
cßn nÕu ®Þa chØ cæng >255 th× DX sÏ thay ®Þa chØ ®øng trong lÖnh IN
4. LÖnh OUT
Chøc n¨ng : ChuyÓn gi¸ trÞ 1 byte hoÆc 1 tõ tõ thanh ghi AL hoÆc AX ra cæng
(PORT)
Có ph¸p : OUT §Þa chØ cæng, AL/AX
Chó ý
: NÕu ®Þa chØ cæng < 256 th× ®Þa chØ ®îc trùc tiÕp ®øng trong lÖnh IN
cßn nÕu ®Þa chØ cæng >255 th× DX sÏ thay ®Þa chØ ®øng trong lÖnh IN
5. LÖnh INC
Chøc n¨ng : T¨ng gi¸ trÞ cña to¸n h¹ng ®Ých lªn 1
Có ph¸p : INC DST
reg8/16
mem
Cê
: C¸c cê bÞ thay ®æi: OF, SF, ZF, PF,CF
6. LÖnh DEC
Chøc n¨ng : Gi¶m gi¸ trÞ cña to¸n h¹ng ®Ých ®i 1
Có ph¸p : DEC DST
reg8/16
mem
Cê
: C¸c cê bÞ thay ®æi: OF, SF, ZF, AF, PF
7. LÖnh XOR
Chøc n¨ng : Thùc hiÖn chøc n¨ng EXCLUSIF OR gi÷a hai to¸n h¹ng. KÕt qu¶ ®Æt ë
to¸n h¹ng ®Ých (c¸c bit cña kÕt qu¶ cã gi¸ trÞ 1 nÕu gi¸ trÞ c¸c bit t¬ng øng cña 2
to¸n h¹ng lµ kh¸c nhau).
Có ph¸p : XOR DST,SRC
reg, reg
mem, reg
reg, mem
Cê
reg, data
mem, data
:
8. LÖnh CMP
Chøc n¨ng : So s¸nh gi¸ trÞ cña to¸n h¹ng ®Ých vµ to¸n h¹ng nguån. Néi dung cña
hai to¸n h¹ng kh«ng thay ®æi sau lÖnh nµy. LÖnh nµy cã t¸c dông dùng c¸c cê t¬ng
øng.
Có ph¸p : CMP DST, SRC
Cê
:
reg, reg
reg, data
mem, reg
mem, data
reg, mem
9. LÖnh TEST
Chøc n¨ng : So s¸nh néi dung cña hai to¸n h¹ng b»ng c¸ch thùc hiÖn lÖnh AND (Vµ
LOGIC) gi÷a hai to¸n h¹ng (néi dung cña hai to¸n h¹ng kh«ng thay ®æi). KÕt qu¶ cã
t¸c dông ®Õn tr¹ng th¸i c¸c cê.
Có ph¸p : TEST DST, SRC
Cê
:
reg, reg
reg, data
mem, reg
mem, data
reg, mem
10. LÖnh LOOP
Chøc n¨ng : LÆp khèi lÖnh tõ nh·n ®Õn lÖnh LOOP cho ®Õn khi gi¸ trÞ cña CX=0.
Mçi khi thùc hiÖn mét vßng lÆp gi¸ trÞ cña CX gi¶m ®i 1.
Có ph¸p : LOOP
nh·n
11. LÖnh INT
Chøc n¨ng : Thùc hiÖn ng¾t mÒm
Có ph¸p : INT Sè ng¾t (sè d¹ng HEXA)
Cê
: IF=0, OF=0
12. LÖnh JMP
Chøc n¨ng : Nh¶y kh«ng ®iÒu kiÖn
Có ph¸p : JMP addr
label
tªn ch¬ng tr×nh con
reg
mem
Chó ý
: Bíc nh¶y cña lÖnh nh¶y nµy n»m trong 64K
13. C¸c lÖnh nh¶y cã ®iÒu kiÖn
Chøc n¨ng : Thùc hiÖn viÖc nh¶y nÕu tho¶ m·n ®iÒu kiÖn
Có ph¸p :
JE/JZ
Label
Nh¶y nÕu cê ZF=1 hoÆc 2 to¸n h¹ng phÐp so s¸nh b»ng nhau.
JNE/JNZ Label
Nh¶y nÕu cê ZF=0 hoÆc 2 to¸n h¹ng phÐp so s¸nh kh¸c nhau.
JL/JNGE Label
Nh¶y nÕu gi¸ trÞ to¸n h¹ng bªn tr¸i
gi¸ trÞ to¸n h¹ng bªn ph¶i cña
phÐp so s¸nh.
JA/JNBE Label
Nh¶y nÕu gi¸ trÞ to¸n h¹ng bªn tr¸i > gi¸ trÞ to¸n h¹ng bªn ph¶i cña
phÐp so s¸nh; gi¸ trÞ cê CF=0, vµ cê ZF=0.
JGE/JNL Label
Nh¶y nÕu gi¸ trÞ to¸n h¹ng bªn tr¸i > hoÆc = gi¸ trÞ to¸n h¹ng bªn ph¶i
cña phÐp so s¸nh; gi¸ trÞ cê SF=OF.
JAE/JNB/JNC
Label
Nh¶y nÕu gi¸ trÞ to¸n h¹ng bªn tr¸i > hoÆc = gi¸ trÞ to¸n h¹ng bªn ph¶i
cña phÐp so s¸nh; gi¸ trÞ cê CF=0.
JP/JPE Label
Nh¶y nÕu parity lµ ch½n; gi¸ trÞ cê PF=1
JNP/JPO Label
Nh¶y nÕu kh«ng cã parity hoÆc parity lµ lÎ; gi¸ trÞ cê PF=0
JO
Label
Nh¶y nÕu trµn ; gi¸ trÞ cê OF=1
JNO Label
Nh¶y nÕu trµn ; gi¸ trÞ cê OF=0
JS Label
Nh¶y nÕu cê dÊu SF=1
JNS Label
Nh¶y nÕu cê dÊu SF=0
JCXZ Label
Nh¶y nÕu gi¸ trÞ cña thanh ghi CX=0
Chó ý : Bíc nh¶y cña c¸c lÖnh nh¶y cã ®iÒu kiÖn kh«ng vît qu¸ 128 byte.
Mét sè Ng¾t assembler dïng
trong ch¬ng tr×nh
Trong ch¬ng tr×nh d· sö dông mét sè ng¾t mÒm
.Chøc n¨ng 0ah cña ng¾t int 21h cña DOS
Chøc n¨ng: NhËn mét chuçi ký tù tõ bµn phÝm vµ ®a c¸c ký tù ®ã vµo mét vïng nhí
®Öm ®îc trá bëi DS:DX (SEG: OFFSET)
vµo : AH=0Ah
ra: DS:DX chøa c¸c ký tù
Chøc n¨ng 42h cña ng¾t int 21h cña DOS
Chøc n¨ng: DÞch chuyÓn con trá tÖp