Professional Documents
Culture Documents
Lập trình hợp ngữ
Lập trình hợp ngữ
lp trnh hp ng
V B Duy
Li ni u
I.
np (fetching) cc ch lnh t b nh
gii m ch lnh
Cc thnh phn c gn trn mt bng mch gi l bng mch ch (main board). Trong
CPU l tri tim ca h thng, trong gio trnh ny chng ta ch ni n cc my tnh
IBM-PC v tng thch (h cc my PC s dng b vi x l Intel).
a. Khi EU
Trong EU li gm hai khi thnh phn l khi iu khin CU (Control Unit), khi s
hc v logic ALU (The Arithmetic & Logical Unit ) v cc thanh ghi.
Thanh ghi c v cc c
-
Vi b vi x l 386 tr v sau, cc thanh ghi chung AX, BX, CX, DX, SI, DI, BP, SP,
thanh ghi c c m rng thnh cc thanh ghi 32 bit EAX, EBX, ECX, EDX, ESI,
EDI, EBP, ESP. S khc nhau gia cc th h vi x l trong h x86 xin xem [5.p.110135}
b. BIU (Bus Interface Unit): Khi EU khng ni trc tip vi bn ngoi, n thc hin
vic giao tip thng qua BIU. Khi cn ly 1 lnh hoc truy xut b nh th n yu cu
BIU thc hin. Cc a ch m EU thao tc l 16 bit (segment, offset) BIU s thc hin
i sang a ch vt l 20 bit v gi vo bus a ch.
I.1.2 Bus
y l thnh phn kt ni v truyn thng tin gia cc thnh phn ca h thng, c 3
loi l:
bus d liu (data bus)
bus a ch (address bus) v
bus iu khin (control bus).
a. data bus: l bus chuyn d liu gia CPU v cc thnh phn khc hoc gia cc thnh
phn trong h thng my tnh. Kch thc bus d liu ty thuc vo th h my tnh c
th (khi ni my 16 hoc 32 bit tc l ni my tnh c bus d liu l 16 hay 32 bit- tc l
ngi ta dng kch c ca bus d liu ni kch c ca CPU)
CPU
8088
8086
80286
80386SX
80386DX
80486
80586/Pentium
bus d liu
16
16
16
32
32
64
b. address bus: Trong khi d liu c truyn chng hn t b nh (hoc I/O) ti CPU
qua data bus th vn l d liu c ly t nh no tc l nh c a ch bao
nhiu (hoc t thit b no)? nh vy CPU phi pht tn hiu l a ch ca d liu cn
ly, tn hiu c gi qua 1 bus khc gi l bus a ch - s thc th mi nh hoc
thit b I/O u c 1 a ch phn bit v nh vy trn bus a ch chng c coi tng
t nhau. Vi 1 ng a ch th ch c 2 gi tr khc nhau l 0 v 1, do vy ch c th
dng xc nh ng 2 a ch, nu c n ng a ch th c th xc nh c 2n a
ch khc nhau. Nh vy s bit ca bus a ch quyt nh khng gian nh ti a v cc
thit b I/O ca my tnh, kch thc ca bus a ch cng khc nhau tu thuc th h b
vi x l.
CPU
8088
8086
80286
80386SX
80386DX
80486
80586/Pentium
bus a ch
20
20
24
24
32
32
32
c. control bus: L bus truyn ti cc tn hiu iu khin m CPU lin lc hay iu khin
cc thnh phn khc ca my tnh: v d tn hiu iu khin gi hay nhn d liu ti/t
bus d liu. Trn bus iu khin c ng c, ng ghi, tn hiu ngt,..
(khi ng read v write u bng 0 c ngha l CPU khng trao i d liu vi b nh
hoc thit b I/O, khi ng read =0, l CPU ang nhn, nu ng write =0 tc l CPU
ang gi d liu X.[5.p87]).
H 80x86 cung cp 2 khng gian a ch phn bit cho b nh v cc I/O. Cc bus a
ch c th c kch thc khc nhau nhng cc bus a ch I/O lun l 16 bit, nh vy ti
a c th c 216 a ch I/O khc nhau., c th 1 s thit b I/O nh bn phm, my in,..
khng phi ch c 1 a ch, thc ra cc ng dng cng chng cn ht bng y a ch
vi IBM PC ch c 1024 a ch I/O.
[ghi]
t 125 ln bus a ch
t 125 ln bus a ch
<i>
set address
set data on the data bus
assert control signal 'write'
<wait>
finish
c/Ghi 2 / 4 byte
Vng nh cao (High Memory Area - HMA): Vng ny c 64KB u tin trn vng
1MB (t 100000h 10FFFFh, vng u ca Extended Memory). Vng ny c th
truy xut bi b vi x l ngay trong ch real mode (iu ny lm n khc vi
vng cn li ca Extended Memory), n thng dng cho vic m rng b nh
quy c(?)
Cc vng b nh vt l
Mode a ch thanh ghi: Kiu a ch ny thanh ghi c dng nh 1 ton hng trong
cc thao tc tc l ton hng l chnh thanh ghi
10
v d: MOV AX,BX
II - H m v i c s
Vi chng ta h m thp phn l quen thuc, t nhin v thun li, nhng chng ta c t
hi vy trong my cc s c c biu din nh vy khng hay n c biu din theo
h m khc. Chng ta bit rng m lnh chng trnh cng nh d liu u lu trong b
nh trc khi c x l. Cc nh u c hnh thnh t cc phn t nh c 2 trng
thi m chng ta hiu l n biu din hai gi tr 0 v 1 (bit) , v mi d liu ca chng ta
u biu din qua hai con s ny. Nh vy thng tin trong my tnh c biu din qua
h m nh phn. Tuy nhin khi chng ta vit hoc hin th theo h nh phn th thng l
qu di v bt tin do thng chng ta s dng h m 16 (hexadecimal gi tt l
hex)
a. H thp phn c s 10
y l h m quen thuc vi chng ta nht, n gm 10 ch s 0,1, .. ,9, mt n v
ca ch s hng bn tri bng 10 ln n v ch s hng bn phi k tip n.
b. H nh phn h m c s 2
Nh ni trn, y l h m ch gm 2 ch s 0 v 1. Mt s nh phn gi tr 1
con s cng ph thuc vo v tr ca n nh sau:
gi s c s x c vit trong h nh phn c dng: xkxk-1,..,x1x0 trong xi l mt ch
s nh phn th gi tr ca n x = xk * 2k + xk-1 * 2k-1 +,..,+ x1* 21 + x0 *20
c. H hexa - c s 16
L h m gm 16 con s 0, 1, , 9, A, B, C, D, E, F ( biu din cc gi tr tng
ng 0,1, ,9, 10, ,15). V gi tr ca 1 n v hng bn tri bng 16 ln 1 n v hng
bn phi k n. Tc l nu y=ykyk-1,..,y1y0 trong yi l mt ch s hex th gi tr ca
y c xc nh: y = yk * 16k + yk-1 * 16k-1 +,..,+ y1* 161 + y0 * 160
11
Ti sao khng ch s dng h thp phn m li s dng h 16? theo kha cnh no
th s con s hex thun li hn s h 10, chng hn nh 1 ch s h 16 tng ng
vi 4 ch s h 2, v 1 byte gm ng 2 ch s hex.
d. i c s
Trong thc t chng ta c th c mt s c cho trong mt c s ny nhng chng ta
cn biu din ca n trong mt c s khc. Trong phn ny chng ta nu vn tt
phng php i biu din ca mt s nguyn dng gia cc c s.
Bi ton l chng ta c s N trong h c s P v chng ta cn i sang biu din trong
h c s Q. Gi s s trong h Q l qk qk-1 q1 q0. Nh vy gi tr ca N c tnh
l: N = qk * Qk + qk-1 * Qk-1 +,..,+ q1* Q1 + q0
cng vic ca ta l phi xc nh cc ch s qi (i=0,..,k, qi [0,Q-1])
Cc bn thy rng nu ta thc hin chia N cho Q chng ta s c phn nguyn l
qk * Qk-1 + qk-1 * Qk-2 +,..,+ q1 v phn d l q0. Nh vy sau mt php chia chng ta
xc nh c phn d chnh l ch s bn phi nht cn tm. Tip tc thc hin php
chia vi phn nguyn thu c chng ta thu c q1 ,.. qu trnh chia kt thc khi ta
nhn c qk tc l khi ta nhn c phn nguyn ca php chia =0, cc s d thu
c chnh l cc ch s cn tm. T ta c thut ton tng qut nh sau:
46
<kt thc>
12
N=2E9h
Tuy nhin vi mt s trng hp c th c bit chng ta khng s dng thut ton
trn m dng cch khc hiu qu hn l cc trng hp:
i h s Q sang h 10: gi s c N = qk qk-1 q1 q0. Nh vy biu din ca N
trong h 10 l: N = qk * Qk + qk-1 * Qk-1 +,..,+ q1* Q1 + q0 . Trong qi l gi
tr trong h 10 tng ng vi gi tr con s qi trong h Q.
V d: N = 2B5(trong h 16) 2*162 + 11*16+5 = 693(trong h 10)
i gia c s 2 v 16: Chng ta bit 1 ch s h 16 tng ng 4 ch s h 2 do
vy khi i t h 16 sang h 2chng ta thay mi ch s h 16 bng 4 ch s h 2
c gi tr tng ng.
V d:
2 4 F(h 16)
0010 0100 1111 (h 2)
00000001
(2) - o bit
11111110
(3) - cng 1
11111111 ( -1)
01101001
(2) - o bit
10010110
(3) - cng 1
10010111 (-105)
o bit ca xkxk-1,..,x1x0
V d: cho 10110111
-
o bit thu c
01001000
cng 1
01001001 (= 73)
vy l s 73
Cu hi v bi tp
14
S
hiu
Thit b
IRQ0
IRQ1
IRQ2
IRQ3
IRQ4
IRQ5
IRQ6
IRQ7
IRQ8/0
IRQ9/1
IRQ10/2
IRQ11/3
IRQ12/4
IRQ13/5
IRQ14/6
IRQ15/7
08H
09H
0AH
0BH
0CH
0DH
0EH
0FH
70H
71H
72H
73H
74H
75H
76H
77H
15
16
17
M t chc nng
0h
1h
2h
3h
4h
5h
8h
9h
0Eh
10h
11h
12h
13h
14h
16h
17h
18h
19h
1Ah
Chia 0
Chy tng bc
S c phn cng
im dng
Trn s
In mn hnh ra my in
Ngt thi thi gian
Ngt bn phm
Ngt a mm
Ngt mn hnh
Danh sch cc thit b
Xc nh kch thc b nh
Phc v a
Cng ni tip
Phc v bn phm
My in
ROM-BASIC
Khi ng ny
Thi gian
Mt s ngt ca ROM-BIOS
Danh sch y cc ngt v phc v ca ROM-BIOS cc bn c th tra cu trong
[3.BIOS] hay [4.BIOS]
b. Mt s ngt ca DOS
S hiu ngt
20h
21h
23h
25h/26h
27h
2Eh
2Fh
33h
M t chc nng
Kt thc chng trnh dng COM
Cc phc v ca DOS
Ngt CTRL-Break
c/ghi a tuyt i
kt thc v thng tr 1 chng trnh
Thc hin 1 lnh ca DOS
Ngt a chc nng
H tr con chut
Mt s ngt ca DOS
18
Hm 01: c 1 k t t bn phm
u vo:
AH = 01
Gi ngt:
INT 21h
Tr v :
AL cha m ASCII ca k t va nhp
M t: Ngt ny i ngi s dng nhp 1 k t t thit b vo chun (thng l
bn phm), hin th k t ln mn hnh, m k t va nhp c lu trong AL.
Cc k t m rng trn bn phm nh F1, F2,, khi c bm s tr v 2 byte,
byte th nht c gi tr =0, byte th 2 l m ASCII m rng. Do , trong trng
hp ny AL c gi tr =0, nu tip tc gi li chc nng ny s thu c byte th 2,
nu ngi dng bm Ctrl-Break th INT 23h s c gi thc hin.
Hm 02: In 1 k t
u vo:
AH=02
DL = M k t cn in
Gi ngt
Int 21h
Tr v:
Khng
M t : Chc nng ny in 1 k t c m trong DL ra mn hnh, ti v tr hin thi
ca con tr mn hnh ri dch con tr sang phi 1 ct.
Trong hm ny cng nh hm 09, mt s k t c bit c coi l iu khin ch
khng phi k t in. V d k t c m 0Ah, 0Dh gi tr iu khin chuyn con
tr mn hnh tng ng l xung dng, v u dng, k t c m 7 iu khin pht
1 ting bip ra loa,..
Hm 05: gi 1 k t ra my in chun
u vo:
AH = 05
DL = M k t cn in
Gi ngt:
INT 21h
Tr v :
Khng
M t : Chc nng ny in 1 k t c m trong DL ra my in (thng l LPT1)
Hm 08: c 1 k t
u vo:
AH = 08
Gi ngt:
INT 21h
Tr v :
AL cha m ASCII ca k t va nhp
M t: Hm ny tng t nh hm 01 nhng ch khc l k t nhp vo khng
c hin th trn mn hnh.
Hm 09: In 1 xu k t ra mn hnh
u vo:
AH = 09
DS:DX l a ch ca xu cn in
Gi ngt:
INT 21h
Tr v :
Khng
M t: Khi cn in 1 xu k t ra mn hnh chng ta phi xc nh a ch ca xu,
DS cha a ch segment, DX cha a ch offset ca xu, hm nyin cc k t t
19
AH = 0Ah
DS:DX l a ch ca vng m cn nhp
INT 21h
Khng
M t: Chc nng ny cho php ngi s dng nhp 1 xu t bn phm. Trc khi
thc hin nhp chng ta phi xc nh a ch ca vng m lu xu s nhp trong
cp thanh ghi DS v DX. Byte u tin ca vng m cha 1 s nguyn l di
(max) ti a c th nhp cho xu. Cc k t c nhn t bn phm cho ti khi gp
ENTER hoc nhn (max-1) k t. Khi thao tc nhp kt thc th k t cui
cng lun c in l k t c m 0Dh(Enter), byte th 2 ca vng m cha
di thc s ca xu (khng tnh k t 0Dh) hai byte ny c t ng in.
V d : bn cn nhp 1 xu k t, di bn c lng khng qu 20 k t. Vy
bn phi chun b vng m (buffer) nh sau:
Trc lc nhp:
20 ? ?
? ? ?
X Y 0D ?
AH = 0Bh
INT 21h
AL
AH = 4Ch
INT 21h
khng
M t: Chng ta c ngt 20h kt thc 1 chng trnh dng COM, cn chc nng
ny ca ngt 21h c th kt thc chng trnh dng COM hoc EXE.
2. Ch dn Assume
Nhim v ca gi lnh ny l ch dn cho assemble xc nh gi tr cc thanh ghi
on.
C php:
ASSUME CS:<Seg_name1>[, DS: <Seg_name1>][, ES: <Seg_name3>]
[, SS: <Seg_name4>]
Vi <Seg_name> l tn on c nh ngha bi Segment, ch th ny cho assemble
bit cn gn a ch cc on vo cc thanh ghi tng ng.
3. Ch dn ORG
C php:
ORG <a_ch>
21
22
<Proc_name> Endp
Vi <proc_name> l tn ca th tc do ngi lp trnh t theo quy tc ca tn, t
kho near hoc far khai bo th tc ny l loi gn hoc xa (xem thm CALL)
6. Ch dn PUBLIC v EXTRN
Cp ch dn ny dng khi bn mun khai bo 1 tn(tn bin, hng, nhn hay th tc)
l tn dng chung, chng hn nh trong cc phn sau bn vit chng trnh trn 2 file,
file th nht c nh ngha th tc P, m chng ta mun dng P trong file th 2, trong
trng hp tn P phi c khai bo l Public trong file th nht v khai bo l
EXTRN trong file th 2.
C php: PUBLIC <tn_1>[, <tn_2>,..]
EXTRN <tn_1>: Far/Near [,...]
Chng ta c th hnh dung ngha ca 2 khai ny l khi 1 tn c vit sau public s
ch cho assemble bit cn phi to cho n 1 kh nng c s dng vt ra ngoi file
cha nh ngha n. V khai bo EXTRN bo cho assemble bit tn ny c to
ra (nh ngha) ni khc v s c lin kt li.
23
MOV AX,23C1h
PUSH AX
Stack trc lnh push
3. Lnh POP
C php
POP < ch >
Vi <ch> l thanh ghi 16 bit
Chc nng: lnh POP thc hin thao tc ngc li vi lnh PUSH, n s ly gi tr ti
nh ngn xp a vo ton hng <ch> v tng thanh SP ln hai n v
V d :
PUSH AX
PUSH BX
PUSH CX
Ta dng lng POP ngc li vi PUSH
POP CX
POP BX
POP AX
4. Lnh PUSHF ( Push flags)
C php:
PUSHF
Chc nng:
5. Lnh POPF
C php :
POPF
Chc nng:
24
so dd 12345678h
LES DI,so
25
AL,12h
OUT
70h, AL
IN
AL,71h
IV.2.2 - Mt s lnh s hc
1. Lnh ADD (Addition )
C php : ADD <ch >, < ngun>
Trong <ch> l thanh ghi hay b nh, <ngun> l thanh ghi hay b nh hay
hng.
Chc nng: Dng cng ton hng <ch> v ton hng <ngun>, kt qu lu vo
ton hng <ch>, tc l < ch > = < ch > + < ngun >
lnh ny nh hng n cc c : SF, CF, OF, AF, PF, ZF
V d:
Mov AX, 10h
ADD AX,5;
AX= 15h
26
Chc nng: lnh ny tng t nh lnh ADD, nhng lnh ADC thc hin php cng
c nh, c ngha l thc hin php cng 3 gi tr <ch>, <ngun> v c nh, kt qu
lu vo ton hng <ch>
tc l ta c < ch > = < ch > + < ngun > + <c_nh>
V d:
ADC DL,0 ; DL = 0 +1 = 1
3. Lnh SUB ( Subtract)
C php:
SUB < ch>,<ngun>
Trong < ch> v <ngun> l 2 ton hng c th thanh ghi hoc bin, hay vng
nh ph hp
Chc nng: lnh s ly gi tr ton hng <ch> tr i ton hng <ngun>, kt qu
lu vo <ch>. Tc l < ch > = < ch > + < ngun >
V d : Mov AX, 1342h
Sub AX, 345h;
; AX = 1342h 345h
lnh Sub nh hng n su c OF, CF, AF, PF, SF,ZF
4. Lnh SBB (Subtract with Borrow: tr c c nh)
C php:
SBB < ch >, < ngun >
Vi ch <ch> v <ngun> l hai ton hng nh trong lnh SUB
Chc nng: thc hin php tr <ch> cho <ngun> v <c_nh>, kt qu ghi li
trong <ch>, tc l: < ch> = < ch > - < ngun > - <c_nh>.
Cc c nh hng tng t SUB.
5. Lnh INC (Increment )
C php :
INC < ton_hng >
Trong <ton_hng> c th l thanh ghi hay b nh, lnh ny tng <ton_hng>
thm 1 n v tc l < ton_hng > = < ton_hng > + 1
lnh ny nh hng n 5 c : OF, ZF, PF, AF, SF
6. Lnh DEC (decrement )
C php :
DEC < ton_hng >
Vi <ton_hng> c th l thanh ghi hay b nh, lnh ny gim <ton_hng> 1 n
v, tc l < ton_hng > = < ton_hng > - 1
lnh ny nh hng n 5 c : OF, ZF, PF, AF, SF
7. Lnh MUL ( Multiply)
C php:
27
Mov BX, 8h
Div BX ; AX = 4006h, DX = 0002h
9. Lnh NEG (Negative)
C php: NEG <ton_hng>
Trong <ton_hng> l bin hoc thanh ghi
Chc nng: Tnh gi tr b 2 ca <ton_hng> ri li gn vo chnh n.
V d:
Mov AL,35h
Neg AL
ZF
CF
ton_hng_1 = ton_hng_2
29
Chc nng: Thc hin php AND trn 2 ton hng cng kch thc, theo tng cp
bit, bit th i (i=0,1,..) ca <ton_hng_1> and vi bit th i ca <ton_hng_2>, kt
qu t ngay trong <ton_hng_1>. Nh vy <ton_hng_1> phi l thanh ghi, bin
hoc nh, <ton_hng_2> c th l thanh ghi, bin hoc hng cng kch thc vi
ton hng th nht (trng hp l hng th trnh bin dch s coi hng cng kch thc
vi ton hng th nht, nu thc t kch thc n nh hn ton hng th nht th c
b xung cc s 0 vo bn tri, nu kch thc n ln hn th s b li (out of range).
AL,25
DL,13
AL,DL
AL= 00011001
DL= 00001101
= 00001001 kt qu l AL = 9
Bng gi tr ca php OR
Cc c b nh hng: OF, PF, SF, ZF
V d:
Mov
AL,25
AL= 00011001
Mov
DL,13
DL= 00001101
Or
AL,DL
= 00011101 kt qu l AL = 29
trong 1 s trng hp khi chng ta cn kim tra 1 bin(s) c bng hay khc 0, bn c
th thc hin php so snh (lnh CMP) s vi 0, hoc bn cng c th thc hin
30
AL, 5
Not
AL
; kt qu ta thu c AL = 250
AL= 00011001
DL= 00001101
= 00010100 kt qu l AL = 20
31
Minh ho SHL
V d: Mov DL, 5
Mov BL,4
SHL DL,BL
trong v d trn chng ta dch cc bit ca DL sang tri 4 v tr, kt qu DL = 80.
Khi dch tri s <ch> vi s bc l k, nu cha xy ra cc bit c gi tr 1 ca
<ch> b mt th kt qu s l <ch> * 2k, nhng c kh nng khi dch tri k 1 s
bit cao ca <ch> s b mt, tng qut c th tnh gi tr nh sau: gi l l s bit ca
<ch> th kt qu l( <ch> * 2 k ) mod 2l (mod: php chia ly phn d).
lnh SAL hon ton tng t nh SHL.
Cc c nh hng: CF, OF, PF, SF, ZF
Lu : lnh SHL ca 86/88 ch chp nhn <ngun> l hng vi gi tr 1, nu
<ngun> ln hn 1 cc bn phi dng thanh ghi CL (286 c th chp nhn hng >1).
6. Ton t SHR (Shift Right dch phi), SAR (Shift Arithmetic Right)
C php:
SHR <ch>, <ngun>
Trong lnh trn <ch> l thanh ghi, bin, hoc nh; <ngun> c th l hng hoc,
thanh ghi.
lnh ny thc hin tng t nh SHL nhng dch cc bit ca <ch> sang phi, cc bit
bn tri s c in bng 0, cc bit bn phi s b ghi bi bit bn tri.
Minh ho SHR
Khi dch s n sang phi k bit, kt qu thu c n div 2 k (div:php chia ly phn
nguyn).
lnh SAR cng tng t nh SHR.
Cc c nh hng: CF, OF, PF, SF, ZF
32
C php:
RCL <ch>, <ngun>
Trong <ch>, <ngun> tng t nh trong SHL.
Chc nng: lnh ny quay tri <ch> vi s bc bng gi tr ca ton hng
<ngun>. Khc vi cc lnh dch (Shift), lnh ny c dng ti c nh lu bit ngoi
cng va ra khi <ch>, chng hn khi quay tri X vi bc quay l 1 th bit bn tri
nht ca X s c ghi vo c nh, gi tr (c) ca c c ghi vo bit bn phi nht
ca X.
Minh ho RCL
Php quay tri s bc n c th hiu l n ln quay tri vi s bc l 1. Khi quay tri
(hoc phi) vi s bc quay bng s bit ca <ch> th gi tr ca <ch> li nh ban
u.
V d 1: Mov AX, 8012 ; (AX = 1000 0001 0010)
CLC
; xo c nh (CF = NC)
RCL AX,1
; Kt qu CF = CY, AX = 0024
; t c nh (CF = CY)
RCL AX,1
; Kt qu CF = CY, AX = 0025
Minh ho RCR
Cc thc hin ca RCR tng t nh RCL nhng vi hng quay tri.
33
; xo c nh (CF = NC)
ROL AX,1
; Kt qu CF = CY, AX = 0025
9. Lnh TEST
C php:
TEST <ch>, <ngun>
Trong <ch> c th l thanh ghi, hoc nh; <ngun> c th l thanh ghi, nh
hoc hng.
Chc nng: thc hin and trn 2 ton hng nhng kt qu khng c lu m ch c
cc c tng ng c t nh sau:
Xo c nh, c trn.
34
IV.2.4 - Mt s lnh v xu
Xu l 1 dy cc byte lin tip trong b nh, 80x86 h tr 1 s lnh thao tc vi xu theo
cc phn t l 1 byte, hay 1 word, v vy mt n v ca xu m chng ta ni n trong
phn ny c th l 1 byte, 2 byte tu vo lnh thao tc theo 1 byte hay 1 word (k t cui
cng ca lnh l B hay W), nu khng c g c bit hoc gy nhm ln th ta ni chung
l size, l cc lnh sau:
1. Lnh MOVSB/ MOVSW (move string byte/word)
C php:
MOVSB
MOVSW
Chc nng:
Hai lnh trn thc hin sao chp 1 phn t xu t xu ngun ti xu ch, vi xu
ngun l vng nh c a ch xc nh bi DS:SI, xu ch l vng nh c a ch
xc nh bi ES:DI. Sau SI v DI c tng hay gim 1 lng = size tu vo c
hng l UP hay DN.
2. Lnh LOADSB/ LOADSW (load string element byte/word into the accumulator)
C php:
LOADSB
LOADSW
Chc nng:
LOADSB np 1 phn t (1 byte) t xu xc nh bi DS:SI vo AL, LOADSW np
1 phn t (2 byte) t xu xc nh bi DS:SI vo AX. Sau SI tng hay gim 1
lng = size tu vo c hng l UP hay DN.
3. Lnh STOSB/ STOSW (store accumulator into string element(byte/word))
C php:
STOSB
STOSW
Chc nng:
STOSB ghi gi tr AL vo nh (1 byte) c a ch xc nh bi DS:DI, STOSW
ghi gi tr AX vo nh (2 byte) c a ch xc nh bi DS:DI. Sau SI tng
hay gim 1 lng = size tu vo c hng l UP hay DN.
4. Lnh SCASB/SCASW (Scan string (byte/word) and check for match
against the value in the accumulator)
C php:
SCASB
SCASW
Chc nng: Ly gi tr AL(scasb) hoc AX(scasw) tr i gi tr nh 1 byte/ 1
word ti DS:SI, kt qu php tr khng c lu m ch cc c cn thit (ZF, SF)
c thit lp. Sau DI tng hay gim 1 lng = size tu vo c hng l UP hay
DN.
5. Lnh CMPSB/CMPSW (compare two strings byte/word).
C php:
35
CMPSB
CMPSW
Chc nng:
So snh 2 phn t (kiu byte/word) ti a ch DS:SI v ES:DI, cc c cn thit
c thit lp phn nh kt qu php so snh. Sau SI, DI tng hay gim 1
lng = size tu vo c hng l UP hay DN.
6. Lnh REP (repeat a string operation)
36
10. Lnh REPNE (repeat while not equal): lnh ny tng ng vi REPNZ
9 jmp disp16
37
2. Nhy c iu kin
H x86 cung cp 1 s lnh nhy (chuyn iu khin) theo mt iu kin nht nh no
, iu kin c tnh bng cch kim tra gi tr cc c. Cc (tn) lnh u bt u
bng k t J (jump) tip theo l mt s k t vit tt ca cc t mang ngha ca iu
kin, iu kin ca mi lnh l c hoc nhm c khc nhau, c 1 s lnh c cng mt
ngha (hay ni cch khc ch l tn gi khc ca lnh).
C php:
<tn_lnh> <ch>
Chc nng: CPU s kim tra cc trng thi c ti thi im hin ti, nu iu kin
ng th s nhy ti cu lnh (a ch) xc nh bi <ch>
ngha v cc c, iu kin ca cc lnh nhy c cho trong bng sau
tn
lnh
m t
tng
ng
iu kin
lnh i
JC
JNC
JZ
JNZ
JS
JNS
JO
JNO
JP
JPE
JNP
JPO
JA
Jump if carry
Carry = 1
JB, JNAE
JNC
Jump if no carry
Carry = 0
JNB, JAE
JC
Jump if zero
Zero = 1
JE
JNZ
Zero = 0
JNE
JZ
Jump if sign
Sign = 1
JNS
Jump if no sign
Sign = 0
JS
Jump if overflow
Ovrflw=1
JNO
Jump if no Ovrflw
Ovrflw=0
JO
Jump if parity
Parity = 1
JPE
JNP
Parity = 1
JP
JPO
Jump if no parity
Parity = 0
JPO
JP
Parity = 0
JNP
JPE
Carry=0, Zero=0
JNBE
JNA
JNBE
JAE
JNB
JB
JNAE
JBE
JNA
Carry=0, Zero=0
JA
JBE
Carry = 0
JNC, JNB
JNAE
Carry = 0
JNC, JAE
JB
Carry = 1
JC, JNAE
JNB
Carry = 1
JC, JB
JAE
Carry = 1 or Zero = 1
JNA
JNBE
Carry = 1 or Zero = 1
JBE
JA
38
JE
JNE
JG
JNLE
JGE
JNL
JL
JNGE
JLE
JNG
JE
JNE
Zero = 1
JZ
JNE
Zero = 0
JNZ
JE
SF = OV or Zero=0
JNLE
JNG
Sign = Ov or Zero=0
JG
JLE
Sign = Ovrflw
JNL
JGE
Sign = Ovrflw
JGE
JL
Sign Ovrflw
JNGE
JNL
Sign Ovrflw
JL
JGE
SF =Ov or Zero = 1
JNG
JNLE
Sign= Ov or Zero = 1
JLE
JG
Zero = 1
JZ
JNE
Zero = 0
JNZ
JE
; v d in s D
ADD DL,0
CMP DL, 9
; so snh DL vi 9
JLE inso
; nu nh hn hoc bng th in ra
ADD DL, 7
Inso:
Mov AH, 02
Int 21h
3. Lnh Call v Ret
y l cp lnh thng gi v kt thc (on) chng trnh con.
Lnh Call gi chng trnh con
C php chung :
CALL <ch>
C 5 dng khc nhau ca lnh call l:
call disp16
call adrs32
call mem16
call reg16
39
call mem32
ngha ca cc dng khc nhau ca <ch> tng t nh trong lnh jmp. Tu vo
<ch> l 16 hay 32 bit m ta c hai dng gi gn (near call) hay xa(far call). Khi gp
lnh call th iu khin c chuyn ti cc lnh ti a ch xc nh <ch>. Tuy
nhin sau khi thc hin xong cc lnh ti <ch>, CPU cn phi thc hin tip cc
lnh sau lnh Call, tc l CPU xc nh c a ch ca lnh cn thc hin sau khi
lnh call kt thc (chng ta ni l a ch tr v), v vy trc khi thc hin cc lnh
ti <ch>, CPU phi lu a ch tr v vo ngn xp. Vi far call cn phi ct a ch
segment:offset, vi near call ch cn lu a ch offset.
Cc bc CPU thc hin x l lnh Call xa (far call)
Lu thanh ghi CS vo stack.
Lu a ch offset ca lnh tip sau lnh call vo stack.
Copy a ch segment v offset ca im cn chuyn n (<ch>) vo CS, IP.
Thc hin tun t cc lnh ti CS:IP
Cc bc CPU thc hin x l lnh Call gn (near call)
Lu a ch offset ca lnh tip sau lnh call vo stack.
Copy a ch offset ca im cn chuyn n (<ch>) IP.
Thc hin tun t cc lnh tr bi IP (CS:IP, CS khng i)
Call gn s dng a ch tng i, tc l xc nh ri v tr hin ti ti <ch>,
call xa s dng a ch tuyt i.
Lnh Ret (return): chc nng ca lnh ny l kt thc chng trnh con v tr iu
khin v cho ni gi n.
C php:
RET
RETN
RETF
Khi gp lnh ny b vi x l s khi phc a ch tr v trong stack v chuyn iu
khin cho on chng trnh ti a ch tr v. Vi RETN (tr v gn) ch khi phc
thanh ghi IP t stack, RETF (tr v xa) khi phc IP v CS t stack. Ret s tu vo
chng trnh con l loi no Far hay Near m CPU hiu n l RETF hay RETN.
iu ch quan trng l bn phi s dng far call vi retf; near call vi retn tng cp
tng xng, khng th dng ln chng c. Vn na l bn phi m bo lnh ret
phi khi phc c CS:IP t stack nh khi n c ct vo khi gp call, tc l on
chng trnh con c gi phi ly ng nhng th n t vo stack.
4. Lnh Int: lnh gi ngt
C php:
Int <s_hiu_ngt>
Xin tham kho phn ngt
40
CLD (Clears the direction flag) Xo c hng(DF =UP), khi c hng l UP,
cc thao tc duyt xu s i theo hng a ch tng( y l ch ngm nh ca
CPU)
STI (Sets the interrupt enable)- Bt c ngt (IF=EI), trong trng hp ny CPU
cho php thc hin ngt.
Lnh Hlt (halt) lnh ny lm cho CPU ngng thc hin cc lnh, trng thi dng
ny kt thc khi reset hoc nhn c 1 li gi ngt y khng phi ch th l kt
thc chng trnh.
IV.3 - Mt s ton t
Trong phn chng ta m t mt s ton t ca hp ng m c th dng trong trng ton
hng ca 1 lnh hoc gi lnh. Trong phn trn chng ta gii thiu mt s lnh ca b vi
x l, thc ra chng ta ni ti cc t gi nh v d nh SHR, MOV,.. m s c dch
tng ng thnh cc ch th m my m b vi x l c th thc hin c, cn trongphn
ny chng ta ni ti cc ton t c x l bi assemble, tc l khi gp nhng ton t
ny th assemble s thc hin ch khng dch thnh m my cho b vi x l. C 5 loi
ton t:
1. Cc ton t s hc
ton t + c php
<gi_tri_1> + <gi_tr_2>
ton t - c php
<gi_tri_1> - <gi_tr_2>
ton t * c php
<gi_tri_1> * <gi_tr_2>
ton t / c php
<gi_tri_1> / <gi_tr_2>
ngha ca cc ton t (trong biu thc) trn l tr v gi tr kt qu tng ng l
tng, hiu, tch, thng ca <gi_tri_1> vi <gi_trj_2>.
2. Cc ton t logic
ton t AND
c php
<gi_tri_1> AND <gi_tr_2>
ton t OR
c php
<gi_tri_1> OR <gi_tr_2>
ton t XOR
c php
<gi_tri_1> XOR <gi_tr_2>
3 ton t AND, OR, XOR tr li gi tr l kt qu ca php AND, OR, XOR
ca <gi_tr_1> vi <gi_tr_2>
ton t NOT
c php
NOT <gi_tr>
ton t not tr v kt qu tng ng vi <gi_tri> sau khi o cc bit.
3. Cc ton t quan h
42
ton t EQ(equate)
c php: <gi_tri_1> EQ <gi_tr_2>
php ton ny tr li gi tr ng (khc 0) nu 2 ton hng bng nhau ngc
li tr li gi tr sai(=0).
V d:
Mov DL, 2 eq 2; kt qu DL = FFh
Mov CL, 2 eq 10; kt qu CL = 00h
ton t NE (not equate)
c php: <gi_tri_1> NE <gi_tr_2>; chc nng ca ton t ny ngc vi
EQ.
ton t LT (less than)
c php: <gi_tri_1> LT <gi_tr_2>
kt qu tr li l li gi tr ng (khc 0) nu <gi tr_1> nh hn <gi_tr_2>
ngc li tr li gi tr sai(=0).
ton t LE (less than or equate)
c php: <gi_tri_1> LE <gi_tr_2>
kt qu tr li l li gi tr ng (khc 0) nu <gi tr_1> nh hn hoc bng
<gi_tr_2> ngc li tr li gi tr sai(=0).
ton t GT(greater than)
c php: <gi_tri_1> GT <gi_tr_2>
kt qu tr li l li gi tr ng (khc 0) nu <gi tr_1> ln hn <g_tr_2>
ngc li tr li gi tr sai(=0).
ton t GE(greater than or equate)
c php: <gi_tri_1> GT <gi_tr_2>
kt qu tr li l li gi tr ng (khc 0) nu <gi tr_1> ln hn hoc bng
<gi_tr_2> ngc li tr li gi tr sai(=0).
4. Cc ton t tr li gi tr
ton t $
c php: $
ton t ny tr li gi tr ca nh c a ch bng gi tr hin ti ca con m
v tr lnh(IP)
ton t SEG (Segment)
c php: SEG <name>
Vi <name> l 1 tn bin hoc nhn, ton t ny tr li a ch segment ca
<name>
ton t OFFSET
c php: OFFSET <name>
<name> tng t nh trong ton t SEG, ton t ny tr v a ch offset ca
<name>
ton t TYPE
c php: LENGTHT <name>
Ton t ny tr v kiu ca <name>:
- nu <name> l bin kiu byte th kt qu tr v l 1
- nu <name> l bin kiu word th kt qu tr v l 2
- nu <name> l bin kiu double word th kt qu tr v l 4
- nu <name> l nhn th kt qu tr v l -1(vi near), -2 (cho far)
ton t LENGTH
43
V.
Lp trnh Hp ng
-------------------------------------------------------------------------------------------Mc ch:
Yu cu:
Ti liu tham kho: [1- p.16- 18; 5-c17]
Gii thiu
V.1. Ngn ng my
Chng ta bit rng my tnh hot ng c l do c cc phn mm hay cc
chng trnh iu khin n. Nhng d l cc chng trnh no chng na th b
vi x l cng ch hiu v thc hin c cc lnh dng nh phn thuc tp cc
ch th c thit k k bi cc nh ch to. Cc con s tng ng vi cc lnh m
b vi x l c th thc hin c chng ta gi l m my. Tp cc lnh hp l
thc hin mt chc nng no ta gi l chng trnh. Tp hp gm tt cc cc
m my v quy tc vit chng trnh chng ta gi l ngn ng my.
Cc con s thng nhm chn v chng c n tng g v ngha ca n. V vy
vic lp trnh bng ngn ng my i hi ngi lp trnh cn phi nh cc m lnh
44
V.2 - Hp ng (assembly) l g
Chng trnh vit bng ngn ng m my c mt s u im nht nh l d
pht huy ti a kh nng ca phn cng, kch thc nh v thng chy nhanh.
Tuy nhin nu chng trnh ln v phc tp th s rt kh khn.
Ta th so snh mt on chng trnh n gin bng hp ng v m my
Code_seg SEGMENT
assume CS: code_seg, DS : Code_seg
org 100H
start: JMP init
old_int
DW 0
Old_int_add DW 0
Prog proc
CMP AH,4Fh
JE xly
jmp Dword ptr cs:old_int
xly: PUSHf
CMP al,30
Jne ktb
mov al,48
jmp kt15
ktb: cmp al,48
Jne kt15
mov al,30
kt15: POPF
CLC
Iret
prog endp
Init: Mov AH, 35h
Mov AL, 15h
Int 21h
Mov old_int, BX
Mov old_int_add, ES
mov AX, CS
Mov DS, AX
Mov AH, 25h
Mov AL,15h
LEA DX,Prog ; dau doan tt
Int 21h
Lea DX, init +1 ; doan cuoi
Mov ah,31h
Int 21h
45
Code_seg ENDS
End start
M my tng ng ca n l:
u im ca hp ng
46
[; ch thch]
nhn :
Mov
AH, 09
tn_lnh
ton_hng_1, ton_hng_2
; ch thch
47
1: Mov
CX, 0
2: Mov DL,a
3: LapIn: Inc DL
4: Mov
AH, 02
5: Int
21h
6: Inc
CX
7: CMP
CX,10
8: JA
Ketthuc
9: Jmp
LapIn
10:
Ketthuc: Int 20h
48
dn hoc thng bo cho trnh bin dch v trnh lin kt bit mt s thng tin lin quan
ti vic bin dch, lin kt hay np chng trnh.
V d gi lnh ORG 100h ch dn chng trnh c np vo a ch offset 100h
hay ch dn End main cho bit main (main l 1 nhn) l im vo ca chng trnh.,,
Thc chi tit ra th c 3 loi lnh: loi th nht l cc ch th ca b vi x l (opcode);
loi th 2 l cc ch dn cho assembler (assembler directives) cc ch dn ny khng
pht sinh ra cc ch th m my cho b vi x l m n ch cung cp 1 s thng tin cho
assembler, v d nh Segment, Ends, ORG,..), v loi th 3 l cc gi lnh (pseudo
opcodes) cng l s ch dn cho assembler, nhng khc vi loi th 2 chng c pht
sinh cc m i tng v d cc gi lnh khai bo bin: DB, DW,.. sau ny nu
khng c iu g c bit hoc gy nhm ln th chng ta ch phn bit 2 loi l cc
lnh (hoc ch th) v cc ch dn (hay gi lnh). Mt s ch dn v ngha ca chng
bn c xem phn cc lnh v ch dn.
3. Bin v hng
Trong lp trnh ni chung khng th khng ni ti bin v hng, tuy nhin bn c th
ngh rng bin hay hng cng l mt trong nhng cch nh v b nh m thi, vy th
thay v bin hay hng c th dng nh ph hp. Nhng hy xt v d sau:
mov ax, ds:[0010] ; Ly gi tr ti nh c a ch ds[10h]
add
ax,2
; cng thm 2
mov ds:[0012], ax ; ghi vo ds:[12h]
Cc thao tc trn khng thun li lm nhng c th hnh dung c, nu c rt nhiu
dng lnh cng s dng nh ds:[10h] th sao, hoc v mt l do no m phi
thay i khng phi l a ch [10h] m l [15h]? bn phi sa tt cc cc dng .
Vy hy gn cho nh cn dng mt ci tn v s dng tn th s thun li
hn rt nhiu. Tn l bin hay hng.
Khai bo v s dng hng
Cng nh trn bn thy c kh nng chng ta cn s dng mt gi tr (con s, k t ,,)
nhiu ln trong chng trnh, mt cch trc gic nht l ta dng mode a ch trc
tip, tc l dng trc tip gi tr , tuy nhin lm nh vy khng th tt bng cch
vy bn hy gn cho gi tr 1 ci tn, d hiu, c ngha v ngi lp trnh dng
ci tn , nh vy chng trnh s nht qun v d hiu hn, hn na nu trong qu
trnh pht trin nu cn phi thay i gi tr th ch cn sa (mt dng lnh) ni
nh ngha m thi. Cc hng c khai bo bng gi lnh EQU (equate).
Cu phap:
EQU
10
sh
EQU
21h
49
50
Mov DL,[0103]
Mov [0103], BL
Khi bn khai bo nh trn (gi l khai bo bin n) th kch thc ca vng nh c
cp pht c s byte ng bng s byte theo ngha ca gi lnh (tc l DB s l 1
byte, DW s l 2 byte,..) nhng trong trng hp bn khai bo 1 xu hoc dng gi
lnh DUP xem thm phn ch th DUP- khai bo lp th kch thc ca vng nh
ph thuc vo s k t trong xu hoc s phn t lp li nhng bin vn c coi l c
kiu theo ngha ca gi lnh.
V d:
byte
Org 100h
<entry>:
<thn chng trnh>
...
Int 20h
<Seg_name> EndS
End <entry>
51
52
53
<entry>:
<cc lnh ca hp ng>
mov AH,4Ch
Int 21h
9: <Seg_name> EndS
10: End <entry>
54
56
57
(b4) Lin kt chng trnh: Khi bc 3 hon thnh chng ta c file i tng ca
chng trnh ngun, nhng cha phi chng trnh ch, bc tip theo chng
ta phi s dng trnh lin kt to file kh thi, trong gio trnh ny chng ta s
dng TLINK.EXE ca hng Borland.
C php
TLINK <tn_file_1> <tn_file_2> .. [/t] [/3]
Trong <tn_file_1> <tn_file_2> l cc tn file i tng cn lin kt phn
m rng ngm nh l obj. Nu thnh cng lnh ny to ra file chng trnh ch
c tn trng vi tn file u tin.
Tham s ty chn /t c s dng nu bn mun to file chng trnh dng COM,
nu khng c tham s ny TLINK to file dng EXE.
Ty chn /3 c dng nu trong chng trnh ca bn c nhng lnh ca b vi x
l 80286 m khng thuc vo tp lnh ca 8086.
Nu bc ny thnh cng chng ta c c file chng trnh ch dng COM
hoc EXE v bn c th thc hin n ti du nhc ca DOS. Nu cn li (li lin
kt) th TLINK s thng bo cho chng ta ni dung li.
V d: mt thng bo li ca TLINK
C:\LANG\MASM>bin\tlink nt_n/t
Turbo Link Version 2.0 Copyright(c) 1987, 1988 Borland International
Cannot generate COM file : data below initial CS:IP defined
Kim nghim v g ri chng trnh: Khi c chng trnh ch, cng vic ca
bc ny l chy th chng trnh vi nhng b d liu mu kim tra tnh ng
n ca chng trnh, trong trng hp kt qu khng nh chng ta mong i tc
l trong chng trnh c g khng ng nh tng thit k ban u, bn
phi tm ra v tr gy li v sa li, mt trong nhng cch l s dng debug
chy tng bc xc nh cu lnh gy li (cng vic ny gi l g ri chng
trnh). Ty vo li xy ra m bn phi quay li cc bc pht sinh li sa v
thc hin li t bc cho ti khi c chng trnh hon chnh.
VI - Mt s bi ton minh ha
Trong phn ny chng ta pht biu v gii mt s v d n gin m ngi mi hc lp
trnh hp ng cn nm c, thng qua mong mun cc bn c th t mnh gii quyt
c cc bi tp trong gio trnh cng nh cc bi ton phc tp hn m cc bn gp sau
ny. Trong phn ny chng ti quan nim rng bn tm hiu cc lnh v php ton c
lin quan, phn ny nu c gii thch mt php ton no th cng ch nhm nhn
mnh phng php gii ch khng nhm trnh by li cu lnh hoc ton t, v th nu
cu lnh no bn cha r th hy tra cu phn cc lnh.
1. In mt s
V d 1: Gi s trong DL c 1 s (0<=DL<=9), hy vit chng trnh COM in ch s
ra mn hnh.
Gii: Do 0<=DL <= 9, nn trong DL l s c 1 ch s, chng ta ch c chc nng in 1 k
t c m trong DL l hm 02 ca ngt 21h, v vy in 1 ch s ta phi in k t tng
gi tr s , c ngha l nu cn in s 5 th chng ta s in k t 5 bng cch t m ca
58
Segment
Assume CS:INSO
Org 100h
main:
Mov DL, 6
ADD DL,'0'
Mov AH,02
Int 21h
Int 20h
INSO Ends
End main
; s cn in
; cng vi 0, chuyn thnh m k t
; hm 02 ngt 21h, in k t trong DL
; Kt thc chng trnh COM
v d 1- in 1 ch s h 10 trong DL
V d 2: Gi s trong DL c mt s (0<=DL<=15), hy vit chng trnh COM in ch
s ra mn hnh h 16 (0,1,..,9,A,B,..,F).
Gii: Cng tng t nh v d 6.1, chng ta cng phi xc nh m k tng ng vi s
v t trong DL. Nhng cc k s trong h 16 khng lin tc, nhng chng c lit
vo mt trong hai nhm lin tc l 0,1,..,9 v A,B,..F.
V vy nu DL <=9 th ta ch cn tnh DL = DL +0,
v nu DL >9 th DL = DL +A 10 = DL+55 = DL +0 +7 sau ta in k t trong DL.
Nh vy trong c 2 trng hp ta u tnh DL+0, v trong trng hp DL >9 tc l
DL+0 >9 th phi cng thm 7.
Ta c chng trnh sau:
INSOHEX
segment
Assume CS:INSOHEX
Org 100h
Main:
Mov DL,14
; v d s cn in
Add DL,'0' ; DL = DL +0
Cmp DL,'9' ; so snh DL vi 9
Jle inso
; nu nh hn hoc bng th nhy ti inso
Add DL,7
; ngc li cng thm 7
Inso:
Mov AH,02
; in ch s trong DL
Int 21h
Int 20h
INSOHEX Ends
End main
v d .2- in 1 ch s h 16 trong DL
V d 3: In biu din nh phn ca s trong thanh ghi AX
59
; v d s cn in
; c s
; AX/BX, d trong DX, thng trong
;
;
ct phn d vo stack
m s ch s
; kim tra AX
; nu <>0 lp li php chia
; bt u in 1 ch s
; Lp in1so vi s bc lp = CX
V d 3 in s nh phn trong AX
Cch gii 2: Trong trng hp s trong c s 2, ta tm mt ch s bng cch chia cho 2
ly phn d, s cng chnh bng gi tr ca bit thp nht, hay ni cch khc, 1 ch s
chnh l gi tr bit tng ng.
Chng hn nh s 145 c biu din nh phn l 0000000010010001. Vy chng ta c th
dng cc php ton trn bit ly gi tr ca tng bit (t tri sang phi) ri in bit ra
mn hnh. ly gi tr bit cao nht (bit 15) trong AX bn c th dng php quay tri AX
c c nh:
RCL AX,1
sau lnh ny gi tr bit cao nht ca AX ang lu trong c nh v cc bit ca AX dch
sang tri 1 v tr, tc l bt 14 c hin ang trong v tr 15, bit 13 c hin trong v tr
60
Nhp 1 ch s
Chng ta ch c hm nhp 1 k t (hm 01 hoc 08 ca ngt 21h) ch khng c chc
nng nhp s. Nhng nhp k t th ta c m k t trong AL ch khng phi s, v
d bn bm s 3 trn bn phm th bn c AL = m k t 3 = 51 ch khng phi l
3.
61
; X l c s
Y = Y + AL
Loop nhap1chuso ; Lp nhp 1 ch s vi bc lp bng CX
V d 4: Vit chng trnh COM nhp 1 s h 10 c 1 ch s vo thanh ghi BL, sau in
s ra mn hnh dng nh phn.
Da vo cch nhp v in 1 ch s miu t trn chng ta c chng trnh sau:
62
VD6_4
segment
Assume CS:Vd6_4
Org 100h
Main: jmp begin ; nhy qua vng khai bo d liu
tbnhap db 'Nhap 1 chu so: $'
tbkq db 0ah,0dh,'Bieu dien nhi phan la: $'
begin:
Mov DX, offset tbnhap
Mov Ah,09
Int 21h
; Nhp mt s vo BL
Mov AH,01
; nhp 1 k t m ghi
vo AL
Int 21h
Sub AL,'0'
; tr i 0 c s
Mov BL, AL
; a s va nhp vo BL
Mov DX, offset tbkq
Mov AH, 09
Int 21h
Mov CX,8
In1chuso:
XOR DL,DL
In cc (8) s nh
RCL BL,1
phn trong BL
ADC DL,'0'
Mov AH,02
Int 21h
Loop In1chuso
Int 20h
VD6_4 Ends
End main
V d 4 Nhp 1 ch s, in dng nh phn
63
V d 5 nhp 1 s h 10 khng qu 4 ch s
3. Nhp v In xu k t
64
BX, buffer
DL, buffer[1]
DH, DH
BX, DX
BX, 2
byte ptr [bx],'$'
; np a ch offset buffer vo BX
; DL = s k t
; di ch trong DL, xa DH
; BX = offset buffer + <s k t>
; BX = offset buffer + <s k t> +2
BL, buffer[1]
BH, BH
buffer [BX+2],'$'
; BL = s k t
; di ch trong BL, xa BH
hoc
Mov
Xor
Mov
65
------------------------Bi tp -----------------------------------------------Bi tp 1: Vit chng trnh dng COM nhp mt s nguyn dng h 16 khng qu 4
ch s t bn phm vo thanh ghi BX, in s ra mn hnh dng h 10.
Vi yu cu nhp: Ch nhp cc ch s 0,1,..,9, A,B...F hoc a,b,,..f. nu 4 ch s hoc
gp Enter, hoc gp k t khng pha l s (h 16) th kt thc.
Bi tp 2 : Vit chng trnh dng EXE nhp mt s <65535 vo BX, in s dng h 16
v dng nh phn.
Bi tp 3: Vit chng trnh dng COM nhp 1 s nh phn khng qu 16 ch s vo BX,
in s dng h 16.
Bi tp 4: Vit chng trnh dng COM hoc EXE nhp hai s, thng bo s th nht
hay s th hai ln.
66
VII - Th tc trong Hp ng
Trong phn trc chc l chng ta nhn thy mt s chng trnh chng ta vit cha thc
s tt y chng ta mun ni ti cu trc, chng hn nh chng trnh nhp 2 s, in
thng bo s no ln hn bn thy c 2 phn phi nhp s, hoc nhiu chng trnh cng
c mt thao tc (chc nng con) no . Vy th ti sao khng xy dng chc nng con
(nh nhp s, in s chng hn) nh l mt chc nng c lp v khi no cn dng n
th ch vic gi m khng phi bn tm v tnh ng n ca n. Cc chc nng l
cc th tc (hoc chng trnh con).
Th tc trong hp ng cng ging nh trong cc ngn ng lp trnh khc l mt on
m lnh (modul) c lp c mt chc nng xc nh nhm thc hin mt nhim v no
, cc th tc c tn duy nht v c th c gi thc hin bi lnh CALL. u vo v
ra ca th tc (nu c )l cc thanh ghi.
VII.1. nh ngha th tc
nh ngha mt th tc chng ta dng cp ch dn Proc (procedure) v Endp (end
procedure)
theo c php
<proc_name> Proc [near/far]
<cc lnh>
Ret
< proc_name> EndP
Trong :
Proc v Endp l hai ch dn bt u v kt thc 1 th tc.
<proc_name> l tn ca th tc do ngi lp trnh t theo quy tc v tn ca hp
ng.
Cc lnh nm trong cp ch dn proc v endp l thn ca th tc
Ret (return) thc ra cng c th coi l 1 lnh trong thn th tc, nhng lnh ny
lm kt thc th tc v tr iu khin cho ni gi. Nu trong th tc khng c
lnh ny th khi th tc kt thc iu khin khng c tr v cho ni gi dn n
chng trnh chy sai.
near v far: l hai thng tin cho assemble bit th tc loi gn hay xa, trong gio
trnh ny chng ta ch s dng th tc near(ngm nh).
Lu : Trong th tc bn c th s dng cc thanh ghi v cc phn khc ca chng trnh
cng s dng cc thanh ghi . Do vy nu bn thay i gi tr mt thanh ghi no m
bn khng thc s mun gi tr nh hng ti phn khc ca chng trnh (hoc l gi
67
proc
Push AX
Mov
AH,02
Int
21h
Pop
AX
Ret
Write_char Endp
V d 1- th tc in mt k t trong DL
V d 2: Vit th tc chuyn con tr mn hnh xung u dng mi
Gii: nh ni phn trn, chuyn con tr mn hnh xung u dng mi chng ta
thc hin hm in k in 2 k t 0Ah v 0Dh, trong th tc chng ta s dng thanh ghi
DX v AX, vy chng ta phi ct trc khi s dng v khi phc khi kt thc.
Xuong_dong
Proc
Push AX
Push DX
Mov Ah,02
Mov DL,0Ah
Int 21h
Mov Ah,02
Mov DL,0Dh
Int 21h
Pop DX
Pop AX
Ret
Xuong_dong Endp
V d 2 th tc xung dng
Trong hp ng cc bn c th nh ngha cc th tc lng nhau, tc l th tc c th cha
nh ngha ca th tc khc, nhng phi cha trn vn.
68
Th tc nhiu mc
VII.2. Li gi th tc
Mt th tc c th gi thc hin bi lnh CALL ti nhng v tr m cu lnh c th xut
hin theo c php:
Call <proc_name>
vi <proc_name> l tn ca th tc c nh ngha bi ch dn Proc.
V d : Call Write_char
Call Xuong_dong
Trc khi vit lnh thc hin li gi th tc bn phi xem xt th tc s dng (u
vo) cc thanh ghi no v ngha ca chng, bn phi chun b gi tr ph hp cho cc
thanh ghi , sau khi kt thc th tc, ty vo chc nng ca th tc gi tr n c th tr
v gi tr cng qua cc thanh ghi. Khi gp lnh Call <Proc_name> assemble s tnh ton
a ch ca th tc c tn l <proc_name> v thay th lnh gi Call <proc_name> bi
lnh Call <ia_ch> v d Call 0123. V iu khin c chuyn ti thn ca th tc.
Nhng r rng l khi thc hin xong th tc th iu khin phi tr v cho ni gi, tc l
CPU phi thc hin tip lnh ngay sau lnh call. lm c iu b vi x l phi ct
a ch ca lnh sau lnh call (gi l a ch tr v) v ngn xp, v s khi phc khi tr
v.
Minh ha
code segment
assume cs: code
org 100h
main:
Mov DL, 'a'
CALL WRITE_CHAR
Inc DL
Call xuong_dong
ADD DL,5
Call write_char
Int 20h
;--------------------Xuong_dong Proc
Push AX
3D5B:0100
3D5B:0102
3D5B:0105
3D5B:0107
3D5B:010A
3D5B:010D
3D5B:0110
3D5B:0112
69
B261
E81E00
FEC2
E80800
80C205
E81300
CD20
50
MOV
CALL
INC
CALL
ADD
CALL
INT
PUSH
DL,61
0123
DL
0112
DL,05
0123
20
AX
Push DX
Mov Ah,02
Mov DL,0Ah
Int 21h
Mov Ah,02
Mov DL,0Dh
Int 21h
Pop DX
Pop AX
Ret
Xuong_dong Endp
;--------------------write_char proc
Push AX
Mov AH,02
int 21h
Pop AX
Ret
write_char Endp
;--------------------code ends
End main
3D5B:0113
3D5B:0114
3D5B:0116
3D5B:0118
3D5B:011A
3D5B:011C
3D5B:011E
3D5B:0120
3D5B:0121
3D5B:0122
3D5B:0123
3D5B:0124
3D5B:0126
3D5B:0128
3D5B:0129
52
B402
B20A
CD21
B402
B20D
CD21
5A
58
C3
50
B402
CD21
58
C3
PUSH
MOV
MOV
INT
MOV
MOV
INT
POP
POP
RET
PUSH
MOV
INT
POP
RET
DX
AH,02
DL,0A
21
AH,02
DL,0D
21
DX
AX
AX
AH,02
21
AX
70
XOR DX,DX
MOV AX,BX
MOV SI,10
Mul SI
POP BX
ADD BX,AX
LOOP NHAP1CHUSO
kt1:
Pop SI
Pop CX
Pop AX
Ret
Nhapso Endp
;-----------------------Inso Proc
Push Ax
Push BX
Push CX
Push DX
Mov AX,BX
MOV
CX,0
MOV
BX,10
non_zero:
XOR
DX,DX
DIV
BX
PUSH
DX
INC
CX
OR
AX,AX
JNZ
non_zero
in1so:
POP
DX
ADD
DX, '0'
MOV
AH, 02
INT
21H
LOOP in1so
Pop DX
Pop CX
Pop BX
Pop AX
Ret
Inso Endp
;--------------------code ends
End main
V d D_4
VII.4.
Th tc Near v Far
ch offset), nu l far th n khi phc 4 byte tng ng 2 cho offset, v 2 cho segment.
V bt k l do g m a ch khi phc bi Ret khng trng vi a ch c ct khi Call
u dn n kh nng chng trnh b ri.
lnh call t xc nh li gi th tc l xa hay gn, tuy nhin trong trng hp cn xc
nh tng minh th bn hy s dng ton t xc nh kiu: far ptr hoc near ptr n
nh call l xa hoc gn.
V d: Call far ptr nhapso
Call neat ptr inso
VII.5.
72
73
Cc thnh phn trong chng trnh EXE cng c ngha tng t nh phn trn chng ta
ni, ngoi tr trong chng trnh EXE c th c nhiu on do vy trn modul ph ca
n cng c th c on m lnh (<codeseg_name>) on d liu (dataseg_name>), on
ngn xp (<stackseg_name>) tuy nhin chng l ty chn, nu c th cng phi cng tn
vi cc on tng ng trong modul chnh.
Thc ra trong chng trnh com cng nh exe, cng mt cch tng t cc bn c th c
nhiu modul ph ch khng phi ch c 1, v c kh nng trong modul ph th nht s
dng cc tn nh ngha trong modul ph th 2 v ngc li. Trng hp ny cc bn ch
cn m bo l trong modul cha nh ngha thnh phn phi khai bo thnh phn l
public, cn trong mudul s dng phi khai bo thnh phn l extrn.
V d5: Hy vit modul ph gm cc th tc NHAPSO, INSO c chc nng nh v d
D_4. Modul chnh dng COM s dng 2 th tc ni trn nhp 2 s, in ra tng v tch
ca chng.
Gii: Trong modul ph ta khai bo 1 on m lnh CODE vi kiu (combine) l public
nh ngha cc th tc NHAPSO, INSO, v khai bo chng l PUBLIC
Trong modul chnh ta khai bo 1 on m lnh CODE vi kiu (combine) l
public
Khai bo NHAPSO, INSO l EXTRN
Modul ph (D_5_TV.asm)
74
Trong lnh Tlink bn phi lit k tn ca modul chnh trc tin v sau l cc modul
ph, tn ca file chng trnh ch s trng tn vi modul chnh, ty chn /t c dng
trong trng hp bn lin kt chng trnh COM, ngc li to chng trnh EXE.
V d D_6: Gi s c modul th vin D_5_TV nh trong v d D_5, bn hy xy vit
chng trnh EXE s dng th tc NHAPSO v INSO nhp 2 s nguyn, ri in ra tch
ca chng.
Gii: trong phn ny chng ta ch cn xy dng chng trnh chnh theo yu cu ri hp
dch v lin kt vi modul th vin.
Ta c chng trnh nh sau
extrn nhapso: proc, inso:proc
stack segment stack
db 100 dup(0)
stack ends
data segment public
tb1 db 0Ah,0Dh,'Nhap so thu nhat : $'
tb2 db 0Ah,0Dh,'Nhap so thu hai : $'
tb3 db 0Ah,0Dh,'Tong hai so : $'
data ends
code segment public
assume cs: code, Ds: data
main:
Lea dx,tb1
Mov ah,09
Int 21h
Call Nhapso
Push BX
Lea dx,tb2
Mov ah,09
Int 21h
Call Nhapso
Pop Ax
Add BX, AX
Lea dx,tb3
Mov ah,09
Int 21h
Call Inso
Mov ah,4ch
Int 21h
;--------------------code ends
End main
V d 6 - D_6.ASM
Hy bin dch file ny sau lin kt vi modul D_5_TV (gi s D_5_TV c bin
dch)
MASM D_6;
TLINK D_6 D_5_TV
77