You are on page 1of 77

i hc quc gia h ni

khoa cng ngh

Gio trnh tin hc c s


phn II

lp trnh hp ng
V B Duy

H Ni, thng 1 nm 2003

Li ni u

y l bn tho u tin v gio trnh hp ng trong khun kh mn tin hc c s cho


sinh vin nm th nht khoa Cng ngh.
Mc ch ca mn hc ny nhm cung cp cho sinh vin cc hiu bit v lp trnh hp
ng (Assembly) mc n gin gip sinh vin hiu k hn x l thng tin mc my.
Kin thc trnh by trong gio trnh ny s khng vi mc ch sinh vin c th lp
trnh h thng. Thng thng c th lp trnh c tt trn assembler, thi gian cn
thit phi t 3 n 4 n v hc trnh k c l thuyt v thc hnh. Trong chng trnh tin
hc c s ny, vi mc ch nu trn, thi lng dnh cho hc phn ny ch l 12 tit
hc trn lp v 12 tit thc hnh ti phng my.
Do thi gian khng nhiu, sinh vin kh c th tip thu thu o mi kin thc hnh
thnh k nng lp trnh tt trn assembly. Ti liu ny gip sinh vin h thng ho li bi
ging trn lp. Nhng ai mun hiu k hn c th c thm cc ti liu khc nh c
nu trong ti liu tham kho.
Do thi gian rt gp nn chc chn ti liu cn nhiu khim khuyt. Mi vn lin quan
n ni dung xin lin h vi thy V B Duy, B mn Cc H thng thng tin .
Mong rng ti liu ny c th gip ch cho sinh vin khi hc mn lp trnh hp ng trong
khun kh mn hc tin hc c s
Chn thnh cm n thy V B Duy dnh nhiu cng sc kip thi c mt ti liu
cho sinh vin.
Gio vin ph trch mn hc
o Kin Quc

I.

Cc thnh phn c bn ca my tnh

--------------------------------------------------------------------------------------------------Ti liu tham kho: [5-p.99]


Mc ch:
Phn ny gii thiu s lc v: CPU, b nh, bus v lin kt gia chng. Hot ng ca
b vi x l.
---------------------------------------------------------------------------------------------------

I.1 Kin trc Von Neumann


Theo cch nhn logic hu ht cc my tnh c thit k theo nguyn l Von Neumann
(do Jonh von Neumann xut).
Theo kin trc Von Neumann my tnh bao gm 4 phn c bn l:
B vi x l (CPU : Central Processing Unit khi x l trung tm)
B nh (Memory),
H thng vo/ra(I/O: Input/Output)
Bus kt ni, chuyn thng tin gia cc thnh phn.
l kin trc c cc c im sau:

B nh l ni lu tr d liu v chng trnh chng ta ni n b nh trong.

Chng trnh l tp cc ch lnh, cc ch lnh ca chng trnh cng l 1 dng d


liu c m ha iu khin hot ng ca my tnh.

D liu l cc thng tin c cc chng trnh s dng.

B vi x l trung tm (CPU) thc hin tun t thao tc: ly (np) cc ch lnh v d


liu(nu cn thit) t b nh, gii m ch lnh v thc hin cc tc v ca chng
trnh. Tc l b vi x l lp i lp li qu trnh sau:

np (fetching) cc ch lnh t b nh

gii m ch lnh

thc hin lnh

Chu trnh x l cc ch lnh


(Cng c ti liu quan nim rng my tnh gm 3 thnh phn: CPU, b nh v h thng
I/O)

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).

I.1.1 Khi x l trung tm CPU (Central Processing Unit)


Nh tn gi ca n, y thnh phn trung tm ca my tnh, n iu khin mi hot ng
ca my tnh, ni thc hin mi php ton c s, qun l v iu khin cc thit b. Cc
thao tc m CPU c th thc hin c gi l ch th (ch lnh). T khi xut hin b vi x
l ca hng Intel pht trin qua nhiu th h l: 8088, 8086, 80286, 80386,..,
Pentium (ta gi chung l h 80x86), nhng v mt logic (vi gc ca chng ta) b vi
x l h 80x86 bao gm cc thnh phn c bn:

Khi thc hin EU (Excute Unit) v

Khi giao tip bus BIU (Bus Interface Unit).

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.

Cc thnh phn ca CPU


Khi iu khin(CU): L khi nh hng (direct) v iu khin cc hot ng ca
cc thit b, din dch cc ch th, quyt nh ly d liu th no, ni lu kt qu, pht
cc tn hiu iu khin ti cc thit b yu cu thc hin ch th,.. (Chng ta bit
chng trnh l tp cc lnh, CU din dch m lnh pht sinh cc tn hiu iu
khin).

Khi s hc v logic(ALU): Chc nng ca khi ny l thc hin cc php ton s


hc v logic c s. Trong qu trnh thc hin cc thao tc, ALU ly d liu t ni lu
tr tm thi trong CPU l cc thanh ghi.
Cc thanh ghi: Bn trong b vi x l gm c 14 thanh ghi 16 bit, mi thanh ghi c
mt cng dng khc nhau v c chia 4 nhm:

Cc thanh ghi a chc nng:


AX (Accumulator thanh ghi tch ly)
BX (Base thanh ghi c s)
CX (count thanh ghi m)
DX (Data- thanh ghi d liu).
Mi thanh ghi a nng li bao gm 2 (na) thanh ghi 8 bit, l AX gm na cao
AH, na thp AL (H, L l k t vit tt ca High v Low). Tng t BX gm BH,
BL, CX gm CH, CL, DX gm DH, DL

Cc thanh ghi a nng

Cc thanh ghi on:


CS (Code segment - on m lnh)
DS (Data segment - on d liu)
EX (Extra segment - on m rng)
SS(Stack segment- on ngn xp)

Thanh ghi con tr v ch s:


SP (Stack pointer con tr nh ngn xp)
BP (Base pointer con tr c s)
SI (Source index ch s ngun)
DI (Destination index ch s ch)
IP (instruction pointer - thanh ghi tr lnh)

Thanh ghi c (Flags): Thanh ghi c gm 16 bit, mi c l 1 bit c s dng


th hin 1 trng thi ca b vi x l ti thi im hin ti trong qu trnh thc hin
chng trnh, vi 8086 ch c 9 bit (9 c) c s dng.

Thanh ghi c v cc c
-

CF (Cary Flag): C nh, c 2 gi tr CY (carry yes) v NC (no carry), c ny c


bt (CY) khi s nh vt khi bit c trong s cao nht.

PF(Parity Flag): C chn l, c 2 gi tr PE (Perity Even chn) v PO (Perity


Odd- l). C ny nhn gi tr PE hoc PO khi byte s liu qua 1 cng no c s
cc bit 1 l chn hoc l.

AF(auxiliary): c b tr, c 2 gi tr AC v NA. C ny c bt (AC) khi c s


nh vt qua 4 ch s c trng s cao nht.

ZF (Zero flag): c 2 gi tr ZR v NZ. C zero c bt (ZR) khi kt qu php


ton=0.

SF (Sign flag): C du, c cc gi tr NG(Negative) khi s c du, v PL(Plus)

TF (Trap Single step flag): C chy tng bc, nu TF =1 th b vi x l chy


chng trnh theo ch tng bc.

IF (Interrupt flag): c ngt, c 2 gi tr EI (Enable Interupt) v DI (Disable


Interupt. Nu c bt gi tr EI th b vi x l cho php ngt, ngc li cc ngt c
th che s b cm.

DF (Direction Flag): C hng, nu c gi tr UP th cc lnh vn chuyn min d


liu s theo hng a ch tng, ngc li nu c gi tr DN(down) s theo hng
a ch gim.

OF (Overflow Flag): C trn, c gi tr OV khi xy ra trn s, ngc li c gi tr


NV.

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.

I.1.3 - B nh chnh (Main memory)

L khng gian bao gm tp cc nh, l ni lu tr d liu v cc ch th lnh


(instruction). Cc thng tin c lu trong cc nh, mi c1 a ch duy nht (xem
phn b nh). H x86 h tr a ch kiu byte, tc l nh a ch nh theo byte. Kch
thc ti a (s a ch ti a) ph thuc vo kch c ca bus a ch, nu bus a ch l n
(bit) th khng gia nh c th l 2n byte.
Thao tc c/ghi 1 nh: Gi s CPU cn nhn/ghi gi tr 0 (1 byte) ti nh c a ch
125 th cc bc s l:
[c]

[ghi]

t 125 ln bus a ch

t gi tr cn ghi ln bus d liu

t tn hiu iu khin read=0

t 125 ln bus a ch

<i>

t tn hiu iu khin write =0

nhn gi tr trn bus d liu


set address
assert control signal 'read'
<wait>
get the data from the data
bus

set address
set data on the data bus
assert control signal 'write'
<wait>
finish

Hnh: c/ghi 1 byte

l 1 byte cn nu cn c/ghi 1 word (2 byte) hoc double word (2 word) ti 1 a ch


no b vi x l x86 gii quyt bng cch t byte thp nht ti a ch ch nh v byte
cao ti n tip theo, tc l ln lt c hay ghi 1 byte nhng theo v tr t thp ln cao.
Nhng vi cc b vi x l c bus d liu l 16 hoc32 bit th mi ln c hay ghi CPU
thc hin vi 2 hay 4 byte, b nh c t chc dng cc bng (bank) 2 bng (bng
chn, bng l) hoc 4 bng (bng 0,.., bng 3)

c/Ghi 2 / 4 byte

I.1.4 H thng I/O


My tnh cn phi trao i d liu vi th gii bn ngoi thng qua bn phm, chut,
a,.., mn hnh, my in...(hay ni cc thit b ngoi vi), vic trao i thng tin gia CPU
v cc thit b ngoi vi c thc hin thng qua mt h thng l h thng vo/ra
(I/O).
Cng vi bus a ch c th l 20, 24 hay 32 bit xc nh a ch ca b nh, h 80x86
cn cung cp bus a ch I/O 16 bit. Nh vy h my x86 c 2 khng gian a ch phn
bit, l khng gian a ch b nh chnh v khng gian a ch I/O. Cng vy cc
ng trn bus iu khin cng khc nhau cho b nh v I/O. a ch I/O tng t nh
a ch b nh ch c khc l n lun l 16 bit, I/O v b nh dng chung (share) data
bus, v 16 bit thp ca bus a ch (do I/O ch c 16 bit nn I/O ch dng chung 16 bit).
C nhn gii hn nht nh trn h thng I/O ca my tnh IBM PC chng hn nh CPU
phi s dng cc ch lnh c bit truy xut thit b I/O, ngi pht trin phi tun thao
cch nh v I/O ca nh thit k, v khng qu 65537 a ch I/O, nhng nh s a ch
cng nhiu nhng nu bn lm vic vi card mn hnh VGA th bng y a ch l
cha .
Rt may theo thit k, ngi ta c th nh x (map) cc thit b vo ra vo mt vng nh
v s dng khng gian a ch ny nh l vi a ch ca I/O chi tit hn v phn ny
cc bn c th tham kho [4. chng 3]

I.2- T chc b nh v cc mode a ch


I.2.1 - Cc vng b nh
Chng ta c th hnh dung khng gian b nh l tp cc nh c nh a ch theo
byte (tun t) t thp ti cao, tng dung lng ti a ca khng gian ph thuc kch c
(bit) ca bus a ch, n c xc nh = 2n (vi n l kch thc ca bus a ch ), gm
cc vng:

Vng nh quy c (Conventional Memory): gm 640KB u tin (c a ch thp


nht t 00000h ti 9FFFFh), y l vng dnh cho cc chng trnh chun ca
DOS v cc chng trnh thng tr, v hu ht cc ng dng chy trn DOS.

Vng nh trn(Upper Memory Area - UMA): L vng nh gm 384KB k tip trn


vng nh quy c (c a ch A0000h FFFFFh). N thng dnh cho cc thit b
h thng hoc cc mc ch c bit nh vng nh ROM (ROM shadow) hay cc
trnh iu khin(driver)

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(?)

Vng nh m rng (Extended Memory): l tt c vng nh cn li t sau HMA cho


ti ht. N dng cho cc chng trnh v d liu khi chy trong protected mode.

Cc vng b nh vt l

I.2.2 - a ch segment (phn on) v offset ( dch)


Chng ta cp trn, a ch b nh c nh tuyn tnh, thc t l nh vy,
nhng b vi x l khng dng cc nh v mt nh c th m n s dng mt
c ch khc l khng gian nh c chia thnh cc on, mi on(segment) 64KB v
trong mi on li nh v mi theo ri offset (th t ca trong on). Nh vy
a ch l cp gm a ch segment v a ch offset k hiu l segment:offset, cp
ny kt hp vi nhau theo cch no cho ta a ch thc ca nh.
Nh chng ta ni phn trn, CPU ch x l a ch theo cc thanh ghi 16 bit, v 1
a ch gm 1 gi tr l a ch segment(16 bit) v a ch offset (16 bit cng v offset
l 16 bit nn kch thc 1 on l 64KB), chng c BIU x l thnh a ch thc (
a ch vt l) 20 bit bng cch dch tri segment 4 bit (nhn 16) ri cng vi a ch
offset. V d ta c C000h:8000h s xc nh a ch thc C000h*16+8000h =
C8000h. Nh vy chng ta d thy c th c nhiu cp a ch segment:offset tng
ng vi 1 a ch vt l chng hn nh C800:0000 cng tng ng vi a ch vt l
C8000h.

I.2.3 - Cc kiu a nh v (mode a ch)


Phng php xc nh v tr trong b nh ca mt ton hng c gi l kiu nh v a
ch address mode hay mode a ch, vi h 80x86 chng ta c cc kiu sau:

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

Mode a ch tc thi: Ton hng l 1 hng gi tr


v d: mov ah,02

Mode a ch trc tip: Trong mode ny th ton hng l 1 a ch nh (trong hp


ng y c th l 1 tn nhn)

Mode a ch gin tip thanh ghi: ton hng l 1 nh, a ch nh ny nm trong 1


thanh ghi con tr v d [BX]

Mode a ch tng i c s: Mt ton hng l a ch nh c xc nh bi 1


thanh ghi con tr cng vi 1 gi tr ri no , v d [BX]+5. Thc cht kiu nh
v ny cng tng t nh [BX + 5]

Mode a ch ch s ho trc tip: S dng thanh ghi ch s xc nh 1 nh theo


th t, v d array[DI], array[SI] (array l 1 nhn)

Mode a ch ch s ho c s: cos 1 ton hng l a ch nh c xc nh bi


thanh ghi con tr kt hp vi 1 ch s dng [BX][DI], trong BX tr ti u vng
nh, v DI cho bit th t ( lch) ca nh trong vng c a ch u xc nh bi
BX.
V d: BX=0100, DI=2 th [BX][DI] s cho gi tr ca nh c a ch (offset) ti
100+2

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:

V d: cho N = 745 trong h 10, hy tm biu din ca N trong h 16


chng ta thc hin lin tip php chia N cho 16
Ln chia

Phn nguyn Phn d

46

<kt thc>

cc s d thu c vit theo th t ngc s cho ta biu din cn tm

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)

V khi i t h 2 sang h 16 chng ta thay tng nhm 4 ch s nh phn (t phi


sang tri) bng 1 ch s c gi tr tng ng trong h 16.
V d: 10001101011 46B
e. Biu din s nh phn c du
Khi lu tr s nguyn khng c du(tc l s dng) trong mt nh c n(n=8,16,32)
bit th ton b n bt c dng biu din gi tr ca s. Cu hi t ra l s m
c lu nh th no? Khi cn biu din mt s c du th bit cao nht c s dng
biu din du, nu s m th bt du c gi tr =1 v nu l s dng th bt du c
gi tr =0, v nh vy ch cn n-1 bit dng lu tr gi tr ca s. V d khi s dng
1 byte biu din s m th bit 7 c dng lm du, 7 bit cn li (bit 0,..,6) lu
tr gi tr. C phi s 3 c biu din theo cch bit du=1 v phn gi tr biu din
s 3 hay khng? trong my tnh khng phi nh vy m ngi ta s dng phng php
b 2, tc l theo tng s m l 1 s m cng vi s dng i ca n cho ta gi tr
0. Mun tm biu din nh phn ca 1 s -a chng ta thc hin theo cc bc :
(1) - tm dng nh phn ca s dng a
(2) - o bit (1 chuyn thnh 0, 0 chuyn thnh 1) ca biu din (1) tm c
(3) - cng 1 vo (2) s thu c dng cn tm

V d 1: Hy tm biu din nh phn ca 1 (8 bit)


(1) - dng nh phn ca s dng 1

00000001

(2) - o bit

11111110

(3) - cng 1

11111111 ( -1)

Nhng khi bn kim tra li : (-1) + 1 = 11111111 + 00000001 =100000000. Kt qu li


khng phi bng 0? ng bng 0, v s ca chng ta l 8 bit, kt qu php cng m bn
tm c l 9 con s nh phn, 9 con s trong 8 bit nh vy ch c 8 con s bn phi c
gi li cn bit bn tri nht b b qua tc l ch cn 8 s 0, v nh vy kt qu = 0.
V d 2: Hy tm biu din nh phn ca 105 (8 bit)
(1) - dng nh phn ca s dng 105
13

01101001

(2) - o bit

10010110

(3) - cng 1

10010111 (-105)

Nh vy chng ta hon ton c th tm biu din nh phn ca 1 s nguyn m bt k, tuy


nhin chng ta phi bit n c biu din trong bao nhiu bit, iu l quan trng tht
vy nu s 105 trong 1 byte c dng 10010111 nhng nu trong 2 byte s l
1111111110010111.
Vy ngc li cho 1 dng nh phn ca s m, hy xc nh gi tr ca s . Tc l cho
dng nh phn xkxk-1,..,x1x0, hy xc l s no. Cng vic cng ht sc n gin l
bn cng thc hin theo cc bc sau:

o bit ca xkxk-1,..,x1x0

cng 1 vo dng sau khi o bit ta c biu din ca s dng i vi n

V d: cho 10110111
-

o bit thu c

01001000

cng 1

01001001 (= 73)

vy l s 73

Cu hi v bi tp

III. Ngt v vector ngt


-------------------------------------------------------------------------------------------Mc ch: Phn ny gii thiu v
khi nim ngt
vector ngt, bng vector ngt
cch thc hin ngt
gii thiu mt s ngt ca DOS, ROMBIOS
Yu cu: sinh vin phi nm vng khi nim ngt, c ch ca ngt, cch thc hin 1 ngt,
bit cch s dng mt s chc nng thng dng ca ngt 21h.
Ti liu tham kho: [1- p.16- 18; 5-c17]
------------------------------------------------------------------------------------------Khi tm hiu hot ng ca b vi x l cng nh ngn ng lp trnh bc thp, mt khi
nim quan trng l ngt (interrupt) v c ch lm vic ca n. iu ny c bit quan
trng vi nhng ai i su vo lnh vc lp trnh h thng. Trong gio trnh ny chng ta
khng c nh bn v ngt mt cch y nht m ch cp ti nhng vn c bn,
chi tit cc ngt bn c c th tra cu trong[4], [5.P.1005]

III.1. Khi nim ngt

14

Ngt l g? tr li cu hi ny bn hy tng tng l CPU ang tun t thc thi


cc ch th ca mt chng trnh no , nu khng c g bt thng th n s lin
tc thc hin vic np v thi hnh cc ch th trong tp cc lnh. Nhng nu n mi
thc hin c mt s lnh no xy ra s kin ngi s dng bm 1 phm trn bn
phm hoc 1 thao tc no khc m i hi b vi x l phi nhn bit v x l s
kin , nh vy c ngha l buc b vi x l tm ngng chng trnh ang chy
p ng yu cu pht sinh, v d nhin khi x l xong yu cu pht sinh n li tip
tc thc hin phn cn li ca chng trnh. l 1 ngt.
Ngt l c ch yu cu b vi x l phi dng chng trnh ang thc hin x l
mt yu cu khc v sau x l xong yu cu n li tip tc thc hin phn cng
vic ang b d.
Cc yu cu ngt c th pht sinh t rt nhiu ngun hoc thit b khc nhau ca my
tnh, mi ngt c tng ng 1 s nguyn gi l s hiu ngt, ngi ta phn cc ngt
thnh cc nhm:
Ngt phn cng: l nhng ngt do cc thit b ngoi vi nh: b thi gian, bn
phm, cc cng ni tip, cng song song, cc a, ng h CMOS, chut,.. pht
ra yu cu CPU gii quyt cng vic no cho n. Cc thit b ngoi vi gi tn
hiu ngt ti CPU thng qua cc ng dy yu cu ngt (IRQ-Interrupt Request).
Mi ng yu cu ngt c gn 1 s hiu t 0 ti 15 v c k hiu l IRQ0,
IRQ1,..,IRQ15 cc ng c s hiu nh hn c u tin hn.
IRQ

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

Chp thi gian


bn phm
xp tng cho mch iu khin 2(IRQ8-15)
cng ni tip2
cng ni tip 1
cng song song 2 trong AT
a mm
cng song song 1
ng h thi gian thc
vch dc CGA
dnh ring
dnh ring
dnh ring trong AT
ngt FPU
iu khin a cng
dnh ring

Cc thit b ngoi vi c kt ni vi chip 8259 (PIC: programable interrupt controler)


b iu khin ngt lp trnh c, con chip ny thit lp u tin ngt v giao tip
vi CPU. 8259 gim st hot ng ca cc ngt, khi thit b gi yu cu thc hin mt
cng vic no ti CPU chip ny chn tn hiu ngt so snh u tin ca n vi
cc tn hiu ngt khc m n ang lu nhn ch CPU x l pht 1 lnh ngt n CPU.

15

Mt chip 8259 c th ng thi x l 8 yu cu ngt. Trong AT c th kt hp 2 con chip


8259 nn c th x l c 16 yu cu ngt.
Ngt mm: L cc ngt do cc chng trnh ng dng pht sinh nh l cc chng
trnh con c gi thi hnh bi ch th INT ca b vi x l thc hin mt phc
v no. Cc ngt mm c th cung cp bi ROM-BIOS(Int 0, Int 1, Int 8, Int 8, Int
9,..) hoc ca DOS(Int 20h, Int 21h, ... )
Cc ngt logic: l cc ngt do chnh CPU pht ra khi n pht hin iu bt
thng:
Ngt 0: Khi gp php chia cho 0
Ngt 1: Ngt chy tng bc
Ngt 3: lnh im dng (break point) pht sinh lnh ny
Ngt 4: Ngt trn s
Ngt khng che chn c: Cng vi chip 8259 c 1 thanh ghi c bit gi l
thanh ghi mt n ngt, mi bit trong kt hp vi 1 tn hiu yu cu ngt, bit
l mt n ca ngt tng ng, nu n c gi tr 1 th yu cu ngt ca thit b b
cm (ta ni n b che chn), nu mt n c gi tr =0 th ngt c th c p
ng vic cho php hoc cm mt ngt c th thc hin c bng phn mm(ch
th cli v sti) cc ngt ny gi l ngt c th che chn c. C ngt m bn
khng th no cm c, ngt gi l ngt khng che chn c. l ngt Int
2: ngt bo hiu s c phn cng.
Cc ngt khc: Ngoi cc ngt nu trn cn mt s ngt khc, mt s ngt khng
thc hin g m chng tr ti cc bng thng s ca h thng, V d nh ngt 1Dh
tr ti bng thng s VIDEO, ngt 1Eh : Bng thng s a,..

III.2. Vector ngt, bng vector ngt


Nh chng ta ni trn khi CPU nhn c mt yu cu ngt, nu n phi p ng
yu cu n s cho thi hnh mt modul (hay mt chng trnh) no x l
yu cu ngt v ngi ta gi l chng trnh x l ngt nh vy mi mt yu
cu ngt ni chung c tng ng 1 chng trnh x l ngt, on chng trnh
c np trong b nh. Vy lm th no m CPU c th gi chng trnh
thc hin, hay c th hn lm th no CPU xc nh c a ch ca chng trnh
x l ngt. Vn ny thc hin nh sau: Ngi ta dnh vng nh kch thc 1KB
u tin (t a ch 0000:0000 ti 0000:0400) trong c 4 byte lu tr a ch
(segment:offset) ca 1 chng trnh x l ngt, chng ta gi 4 byte nh vy l 1
vector ngt, tp cc vector ngt l bng vector ngt lu l cc byte c lu tr
trong b nh theo trt t o ngc tc l 2 byte c a ch thp lu offset, 2 byte
sau lu segment ca chng trnh con x l ngt. Trong bng vector ngt, cc
vector ngt c lu tun t theo s hiu ngt, tc l vector ngt 0 nm ti a ch
0000:0000, vector ngt 1 nm ti 0000:0004.. Nh vy c ti a 1024/4 = 256
vector ngt.

16

III.3. Cch bc CPU x l mt t hiu ngt


Khi mt yu cu ngt xut hin, CPU thc hin cc bc sau
t thanh ghi c vo stack
t a ch (segment:offset)ca lnh tip theo s thc hin (a ch tr v) vo
stack a ch segment c t vo stack trc sau l a ch offset
CPU xc nh s hiu ngt, np vector ngt t a ch 0: <s hiu ngt>*4
CPU chuyn iu khin cho on chng trnh x l ngt
Sau 4 bc trn quyn iu khin thuc v chng trnh x l ngt. Khi tin trnh x l
ngt kt thc nu n mun tr iu khin v (cho CPU) th n phi thc hin ch lnh
iret((interrupt return), iret s khi phc a ch tr v v thanh ghi c t stack, v cng
vic b b d trc khi ngt xy ra li c tip tc thc hin.

III.4. Mt s ngt ca DOS, ROM-BIOS


Trong b nh ROM ca my tnh cha mt s d liu v cc chng trnh quan trng cn
cho vic khi ng cng nh hot ng ca my tnh v cc thit b ngoi vi. ROM gm
4 thnh phn l: Cc chng trnh cho vic khi ng, ROM-BIOS (h thng vo ra c
s), ROM-BASIC v ROM m rng. Trong vai tr ca ROM-BIOS l cung cp cung
cp cc phc v c bn cn thit cho hot ng vo/ra ca my tnh m phn ln l cho
cc thit b ngoi vi. C th coi ROM-BIOS nm gia cc chng trnh ca ngi dng v
phn cng. Cc ngt c cung cp bi ROM-BIOS chng ta gi l cc ngt ca ROMBIOS, mt ngt c th c nhiu chc nng con, mi chc nng con ta gi l 1 phc v.
Tt nhin khng phi ch c cc phc v ca ROM-BIOS m sau khi h iu hnh c
np (IO.SYS, MSDOS.SYS, COMMAND.COM) n cung cp cho chng ta mt s cc
ngt v gi l ngt ca DOS. Mt ngt ca DOS c th c nhiu chc nng con, mi chc
nng con chng ta gi l 1 hm. {tham kho [6-c.3]}. V pha chng ta th d l ngt ca
ROM-BIOS hay ca DOS cng c th hiu nh mt th tc hay chng trnh con(chng
trnh x l ngt) c th c gi thc hin bi ch lnh INT theo c php:
INT <s_hiu_ngt>
v d: int 21h

17

Mt chng trnh ni chung th c th c d liu vo v c th c kt qu tr v. Vi


chng trnh x l ngt cng vy, nhng c u v v u ra (nu c) u c thc hin
thng qua cc thanh ghi, tn thanh ghi v ngha c xc nh trc bi ngi thit k.
V d : vi ngt 21h c rt nhiu chc nng con, mi chc nng con c 1 s hiu, khi gi
thc hin th AH lun l s hiu ca chc nng.
a. Mt s ngt ca ROM-BIOS
S hiu
ngt

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

c. Mt s hm (chc nng) thng dng ca ngt 21h


Trong phn ny chng ta gii thiu mt vi hm tiu biu ca ngt 21h dng trong
phn lp trnh, Danh sch y cc ngt v cc chc nng ca DOS cc bn c th
tra cu trong [3.DOS] hay [4.DOS]

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

u xu cho ti khi gp k t $- c m 24h th kt thc. nh vy xu cn in phi kt


thc bng k t $.

Hm 0Ah: Nhp 1 xu k t vo vng m


u vo:
Gi ngt:
Tr v :

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 ? ?

? ? ?

gi s bn nhp l ABC XY (cui cng l Enter), sau khi nhp buffer ca bn l


20 6 A B C

X Y 0D ?

Lu buffer l vng nh ti thiu phi c 20+2=22 byte t do. Trong kh nhp


nu gp Ctrl-Break th int 23h c thc hin v vng m khng b thay i.

Hm 0Bh: Kim tra trng thi vng m nhp


u vo:
Gi ngt:
Tr v :

AH = 0Bh
INT 21h
AL

M t: Chc nng ny kim tra trong vng m ca thit b vo chun(bn phm)


c k t no sn sng hay khng, nu c AL s bng FFh, ngc li AL=0.

Hm 4Ch: Kt thc chng trnh


u vo:
Gi ngt:
Tr v :

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.

IV - Mt s lnh v ch dn thng dng


Trong phn ny chng ta gii thiu v mt s ch dn v lnh thng dng ca b vi x l
v chng trnh bin dch assemble .

IV.1 - Cc ch dn( Pseudo-Op: gi lnh)


Trong cc phn sau chng ta quy c s dng cc cch vit nh sau:
Thnh phn trong cp ngoc <> l thnh phn (tham s) phi c.
20

Thnh phn trong cp ngoc [] l thnh phn (tham s) tu chn.


Thnh phn vit khng c ngoc l t kho.
1. Ch dn Segment, Ends : M u v kt thc khai bo 1 on
C php:
<seg_name> Segment [align] [combine] ['class']
<statements>
<seg_name> Ends
Gii thch:
<seg_name> l tn on do ngi lp trnh t theo quy tc tn nhn, bin
Segment, Ends : (t kho) gi lnh
<statements>: cc khai bo hoc cc lnh,.. trong on
[align]: Kiu xc nh bin ca on bt u t a ch nh th no trong b
nh (tham s ny hng dn assemble, trnh lin kt, DOS np on vo a ch
bt u t u) c cc kiu nh sau:
o BYTE:
mt on c th bt u ti bt c a ch no
o WORD: mt on ch c th bt u ti a ch chn (0,2,4,..)
o DWORD: mt on ch c th bt u ti a ch chia ht cho 4 (0,4,8,..)
o PARA: mt on ch c th bt u ti a ch chia ht 16 (0,16,32,.. trong
b nh mi para l 16 byte)
o PAGE: mt on ch c th bt u ti a ch chia ht 256
Khi chn kiu BYTE th trong chng trnh 2 on bao gi cng lin k nhau, nu
chn kiu Word th gia 2 on c th b trng 1 byte, kiu DWORD c th 15
byte,.
[combine]: Trong chng trnh rt c th bn c nhiu on cng tn (chng hn
bn c hai on m lnh trn 2 file) bn mun lin kt chng li, tham s
[combine] ch dn h thng lin kt chng nh th no, c cc kiu sau:
o Public (Memory): chng c ni li vi nhau.
o Common: Trm ln nhau
o Stack: on ngn xp phi c kiu ny.
[class] tham s ny xc nh th t sp xp cc on (khc tn) trong b nh, cc
on cng tn class c xp lin nhau, cc on khc tn class c sp xp theo
th t m trnh TLINK gp.
(chng hn bn c 2 on m lnh(khc tn on), khi lin kt bn mun kt hp
chng li thnh 1, trong trng hp ny bn dng chung tn class cho c 2)

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

Ch th ny hng dn assemble np chng trnh t a ch offset =<ia_ch> trong


on n lnh, vi chng trnh COM ch dn ny phi c v bt buc <a_ch> phi
l 100h (hay 256)
4. Mt s ch dn khi bo d liu
Cc ch dn DB (define byte), DW(define word), DD (define double word),
DT(define ten byte)
C php:
<tn_bin> DB [gi_tr]
<tn_bin > DW [gi_tr]
<tn_bin > DD [gi_tr]
<tn_bin > DT [gi_tr]
Cc dng khai bo trn yu cu chng trnh dch cp pht vng nh tng ng kiu byte,
word, double word, 10 byte kt hp vi <tn_bin>. Cng c th hnh dung chng ta khai
bo bin tn bin l <tn_bin>, cc [gi_tr] sau t kho DB,DW,.. l cc gi tr c
gn vo vng nh ca cc bin tng ng.
V d:
x db 10
y dw 125h
msg db Tin hoc co so $
Ch dn DUP (duplicate)
C php:
<n> DUP(<gi tr>)
Chc nng: lp li <n> ln <gi_tr>, tc l yu cu assemble cp vng nh
cho <n> ln <gi_tr>.
V d:
20 dup (0) ; cp pht vng nh c 20 s 0 lin tip
lnh ny thng dng vi DB, DW, DD, DT cp pht 1 vng nh kt hp vi 1 bin c
kiu byte, word, ..
V d:
array db 10 dup (0)
vng nh dnh cho array l 10 byte, cc phn t c gi tr =0
array1 dw 20 dup(5)
cp pht 20 phn t kiu word, gi tr cc phn t l 5, nhu vy cn vng nh 40
byte.
db 5 dup(abc); lp li 5 ln xu abc
Ch dn EQU (Equate) - Khai bo hng
C php: <tn> equ <gi_tr>
V d:
X EQU 10 ; khai bo hng X c gi tr = 5
Trong <tn> l tn hng hp l, <gi_tr> l 1 hng y l gi tr ca hng. T sau
khai bo ny, khi gp tn hng, assemble s thay th bi gi tr hng tng ng.
5. Ch dn Proc (procedure) v Endp (end procedure)
y l hai t kho dng khai bo 1 th tc trong hp ng, hai ch dn ny phi i
vi nhau theo 1 cp.
C php:
<Proc_name> Proc [near/far]
<Cc lnh trong th tc>

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.

IV.2 - Mt s lnh v ton t ca Hp ng


IV.2.1 - Cc lnh chuyn d liu
1. Lnh MOV (move)
C php :
MOV < ch >, < ngun >
trong
< ch > : ch c th l mt thanh ghi hay b nh (bin hoc nh)
< ngun >: c th l thanh ghi, b nh hay hng
Chc nng: Chuyn ni dung (gi tr) ton hng <ngun> vo ton hng <ch>, chiu
di d liu c th 8 hay 16 bit.
Ghi ch :
lnh MOV khng nh hng n cc thanh ghi c.
Khng c php chuyn hai tan hng b nh vi nhau, mun chuyn gi tr
gia chng ta phi dng thanh ghi trung gian.
V d (Var1, Var2 l 2 bin)
MOV AX, Var 1
MOV Var 2, AX
Khng th chuyn trc tip gia hai thanh ghi an.
Khng th chuyn mt hng vo thanh ghi an, mun chuyn chng ta phi
dng thanh ghi trung gian.
V d :
MOV AX,data
MOV DS, AX
2. Lnh PUSH
C php:
PUSH < ngun >

23

Trong < Ngun > ch c th l mt thanh ghi hay b nh 16 bit


Chc nng : Dng np ni dung ca tan hng < ngun > vo nh ngn xp
(stack) thanh ghi SP gim i hai n v.
Minh ho

MOV AX,23C1h
PUSH AX
Stack trc lnh push

Stack sau 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:

Ct gi tr thanh ghi c vo Stack

5. Lnh POPF
C php :

POPF

Chc nng:

Khi phc thanh ghi c t Stack

6. Lnh LEA ( Load effective address )


C php :
LEA<ch>, <ngun >
Trong : <ngun> l 1 ton hng (bin hoc nhn,,), <ch> l thanh ghi a nng 16
bit.
Chc nng : Np a ch offset ca <ngun> vo thanh ghi <ch>

24

( lnh ny tng t MOV<ch>, offset <ngun>)


V d:
LEA DX, msg ; vi msg l 1 nhn th DX = da ch offset ca msg
7. Lnh LES (Load ES register)
C php :
LES < ch >,<ngun>
Vi <ch> l 1 thanh ghi 16 bit, <ngun> l ton hng kiu dd (double word)
Chc nng: Chuyn gi tr (2 word) ca <ngun> vo thanh ghi ES v <ch> theo
cch: 16 bit cao a vo ES, 16 bit thp a vo <ngun>
V d:

so dd 12345678h
LES DI,so

th ES = 1234h v DI = 5678h (lu s 12345678h c lu theo th t ngc trong


b nh)
8. Lnh LDS (Load DS register)
C php :
LDS < ch >,<ngun>
Vi <ch> l 1 thanh ghi 16 bit, <ngun> l ton hng kiu dd (double word)
Chc nng: lnh ny cng thc hin tng t nh LES, nhng chuyn gi tr(2 word)
ca <ngun> vo thanh ghi DS v <ch> theo cch :16 bit cao a vo DS, 16 bit thp
a vo <ngun>.
9. Lnh IN (ly d liu t cng)
C php :
IN AL, < port >
hoc IN AX, <port>
trong <port> l a ch cng(s hiu), nu <port> nh hn FFh th c th dng 1
hng s hoc thanh ghi, nu <port> ln hn FFh th phi dng thanh ghi DX lm s
hiu cng.
Chc nng: c 1 gi tr 1 byte t cng <port> vo thanh ghi AL, hoc 2 byte vo
thanh ghi AX.
V d :
MOV DX, 278 h
IN AL, DX
(ly d liu t cng 278 vo thanh ghi AL)
10. Lnh OUT (ghi d liu ra cng)
C php :
OUT < port >,<ton_hng>

25

trong <port> l a ch cng(s hiu), nu <port> nh hn FFh th c th dng 1


hng s hoc thanh ghi, nu <port> ln hn FFh th phi dng thanh ghi DX lm s
hiu cng, <ton hng> l AL, hoc AX.
Chc nng: Gi gi tr ca <ton hng> ra cng <port>
v d: Nhn gi tr (byte) th 12h ca CMOS (ch s 12h phi gi ra cng 70h, nhn
gi tr qua cng 71h)
MOV

AL,12h

OUT

70h, AL

IN

AL,71h

11. Lnh XCHG (Exchange: hon i gi tr)


C php :
XCHG < ton_hng_1>,<ton_hng_2>
Trong <ton_hng_1>,<ton_hng_2> l thanh ghi hay b nh
Chc nng : dng han chuyn ni dung ca hai tan hng
* Ghi ch :
- lnh ny khng nh hng n c hiu
- Khng dng lnh ny vi thanh ghi an
12. Lnh XLAT
C php:
XLAT
Chc nng: Chuyn gi tr ca mt s nh (1 byte ) ti a ch DS :BX vo thanh ghi
AL.

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

2. Lnh ADC (Addition With Carry )


C php :
ADC < ch >, <ngun >

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:

Mov AX, F13A


Mov DL,0
RCL AX,1

; quay tri AX 1 bit, bit cao nht lu vo c nh (1)

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

MUL < ngun>


Trong < ngun> c th l thanh ghi, bin, hoc nh
Chc nng: Ly thanh ghi AL, hoc AX nhn vi <ngun>, c 2 trng hp sau:
Trng hp 1: Nu < ngun> c di l 8 bt th lnh MUL s ly ni dung ca
thanh ghi AL nhn vi <ngun >, kt qu lu vo thanh ghi AX, ta k hiu
AX=AL*< ngun >.
Trng hp 2: Nu < ngun > c di 16 bt th lnh MUL s ly ni dung
thanh ghi AX nhn vi < ngun >, kt qu l 32 bt : 16 bt thp lu vo AX, 16
bit cao lu vo DX. Ta k hiu DX:AX = AX*< ngun >
Cc c b nh hng: CF, OF
V d 1 :
Mov AX, 2315h
Mov BL, 25h
MUL BL
Do <ton_hng> ca ta l BL -1 byte, do vy AL*BL =15h*25h =0210h. Kt qu
ta c AX = 0210h.
V d 2 :
Mov AX, 2315h
Mov BX, 25h
MUL BX
Ta thu c AX=1209h, DX=0005h
8. Lnh DIV(Divide)
C php:
DIV < ton_hng >
Chc nng: Thc hin php chia theo 2 trng hp sau:
Trng hp 1: Nu <ton_hng> c di 8 bt th lnh DIV ly ni dung
thanh ghi AX chia cho <ton_hng>, thng s (phn nguyn) ca php chia
c lu trong thanh ghi AL v phn d c lu trong AH.
Trng hp 2: Nu source l 16 bit th lnh DIV s ly ni dung trong cp
thanh ghi DX : AX chia cho <ton_hng>, phn nguyn c lu trong AX,
phn d c lu trong DX.
Cc c b nh hng: CF, OF
V d 1:
Mov AX, 0234
Mov BL, 10
DIV BL
; Kt qu ta c AL = 23, AH = 04
V d 2:
Mov AX, 32h
Mov DX, 2h
28

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

kt qu chng ta thu c AL= CBh

Cc c chu nh hng: AF, CF, OF, PF, SF, ZF.


10. Lnh CMP (Compare )
C php :
CMP < ton_hng_1 >, < ton_hng_2>
Trong <ton_hng_1> c th l thanh ghi, bin hoc nh, <ton_hng_2> c th
thanh ghi, bin, hng
V d : CMP AL,0Dh
Chc nng: Dng so snh gi tr gia <ton_hng> v <ton_hng_2>. Gi tr cc
c s ph nh kt qu ca php so snh. lnh ny s ly <ton_hng_1> tr
<ton_hng_2> kt qu c lu trong cc c m khng thay i ni dung ca hai
ton hng trn.
Cc c b nh hng: AF, CF, OF, PF, SF, ZF
Quan h gia 2 ton hng

ZF

CF

ton_hng_1 > ton_hng_2

ton_hng_1 = ton_hng_2

ton_hng_1 < ton_hng_2

Kt qu(cc c) ca php so snh :


Thng thng ngi ta s dng kt qu ca php so snh lm iu kin cho cc lnh
nhy, tt nhin cc lnh nhy c iu kin cn c vo cc c ch khng phi l trc
tip t php so snh, do vy bt k mt thao tc no c th t cc c iu kin ca
n u c th dng lm iu kin cho lnh nhy.

IV.2.3 - Cc lnh, Ton t thao tc mc bit


1. Ton t AND (php hi)
C php:
AND <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).

Bng gi tr chn l ca php AND


lnh ny lm nh hng ti cc c: OF, PF, SF, ZF
V d:
Mov
Mov
And

AL,25
DL,13
AL,DL

AL= 00011001
DL= 00001101
= 00001001 kt qu l AL = 9

2. Ton t OR (php tuyn)


C php:
OR <ton_hng_1>, <ton_hng_2>
Chc nng: Thc hin php OR trn 2 ton hng cng kch thc, theo tng cp bit,
bit th i ca <ton_hng_1> vi bit th i ca <ton_hng_2>, kt qu t ngay trong
<ton_hng_1>. Quy nh v 2 ton hng tng t nh trong lnh AND

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

lnh OR bin cn kim tra vi chnh n v bn kim tra cc c thu c kt qu


tng t nh lnh CMP, nhng mt s ngi lp trnh a dng cch th 2 hn v thi
gian thc hin ca OR nh hn CMP.
3. Ton t NOT( ph nh)
C php:
NOT <ton_hng>
Chc nng: Thc hin php o bit trn <ton_hng>, bit c gia tr 0 chuyn thnh
gi tr 1 v ngc li, bit c gi tr 1 chuyn thnh 0 (kt qu ghi tr li vo
ton_hng, ton hng phi phi l bin, thanh ghi a nng hoc nh.
V d:
Mov

AL, 5

Not

AL

; kt qu ta thu c AL = 250

4. Ton t XOR (eXclusive OR tuyn loi tr )


C php: XOR <ch>, <ngun>
trong <ch> lbin, thanh ghi, nh; <ngun> l bin, thanh ghi, nh, hoc
hng c kch thc ph hp v <ch>.
Chc nng: Thc hin php ton XOR trn tng cp bit tng ng ca <ch> v
<ngun>, kt qu t vo trong <ch>

Bng gi tr chn l php XOR


V d:
Mov AL,25
Mov DL,13
XOR AL,DL

AL= 00011001
DL= 00001101
= 00010100 kt qu l AL = 20

Cc c nh hng: CF, OF, PF, SF, ZF


5. Ton t SHL (Shift Left dch tri), SAL(Shitf Arithmetic Left)
C php:
SHL <ch>, <ngun>
Trong lnh trn <ch> l thanh ghi, bin, hoc nh; <ngun> c th l hng hoc
thanh ghi CL.
Chc nng: dch cc bit ca ton hng <ch> sang tri vi s bit bng gi tr
ca <ngun>, cc bit bn phi s c b xung gi tr 0, cc bit cao s b loi b (thc

31

ra n c ghi tm thi vo c nh). Tc l nu <ch> l ton hng 16 bit chng


hn, v ta dch tri 1, th bit 15 (tri nht) s b mt (ghi vo c nh), bit 14 s chim
v tr bit 15, bit 13 chim v tr bit 14,.., bit 0 chim v tr bit 1, bit 0 (phi nht) s
c in 0. Nu ta dch tri nhiu bt (<ngun> ln hn 1) th cng c th hiu l
nhiu ln dch tri 1. Nu dch tri vi s bc >= s bit ca <ch> th kt qu s = 0.

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

7. Ton t RCL(Rotate through Carry Left) Php quay tri c c nh.

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

V d 2: Mov AX, 8012 ; (AX = 1000 0001 0010)


STC

; t c nh (CF = CY)

RCL AX,1

; Kt qu CF = CY, AX = 0025

8. Ton t RCR(Rotate through Carry Right) Php quay phi c c nh


C php: RCR <ch>, <ngun>
Trong <ch>, <ngun> tng t nh trong SHL.
Chc nng: lnh ny quay phi <ch> vi s bc bng gi tr ca ton hng
<ngun>.

Minh ho RCR
Cc thc hin ca RCR tng t nh RCL nhng vi hng quay tri.

33

Lu : Cng ging nh trong cc lnh dch bit, vi b vi x l 8086/8088 th <ngun>


nu l hng th ch c th l 1, trong trng hp s bc quay >1 th chng ta phi
dng thanh ghi CL lm <ngun> (s bc quay), vi b vi x l th h cao hn th
<ngun> c th l hng s ln hn 1.
Ngoi hai ton t quay trn, b vi x l cn h tr 2 lnh quay l ROL (Rotate Left)
v ROR( Rotate Right) c php chung l:
ROL <ch>, <ngun>
ROR <ch>, <ngun>
Cc thnh phn trong 2 lnh trn ging nh RCL, chc nng ca chng l quay tri
(ROL), quay phi (ROR) ton hng <ch> vi s bc quay l <ngun>, nhng khc
vi RCL v RCR l bit ngoi cng (trong mi bc quay) c chuyn trc tip vo
bit u bn kia ca <ch> v gi tr ca n cng c copy vo c nh.

Thao tc quay tri ROL


V d :

Thao tc quay phi ROR

Mov AX, 8012 ; (AX = 1000 0001 0010)


CLC

; 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.

Bt c Zero nu kt qu = 0, ngc li th xo Zero.

t c du theo bit cao nht ca kt qu.

t c chn l theo tnh chn l ca byte thp trong kt qu.

Cc c b nh hng : CF, OF, PF, SF, ZF

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)

Chc nng: lp mt thao tc no vi xu k t vi s ln lp = CX, sau mi


bc CX gim 1, lnh ny thng dng vi lnh movsb, movsw,..
v d: Mov CX,10
Rep Movsb
trong v d trn s lp 10 ln thao tc movsb tc l chuyn 10 byte t DS:SI ti
ES:DI
Lnh ny khng lm nh hng ti cc c

7. Lnh REPZ (repeat while zero)


Chc nng: lnh ny cng thng dng vi 1 thao tc xu lp li thao tc trn
xu vi s bc lp CX ln, sau mi bc th gi tr ca thanh ghi gim 1. Nu n
c dng vi CMPSB. CMPSW, SCASB, SCASW th n ch lp khi c ZERO c
bt ( ZR).
V d:
Mov CX, 10
Mov SI, 150
Mov DI, 180
Repz CMPSB
on lnh trn so snh tng cp k t tng ng ti DS:SI v ES:DI, sau mi bc CX
gim 1 v SI, DI s tng 1 nu DF = UP (hoc gim 1 nu DF =DN), vic so snh s
kt thc khi 10 bc (CX = 0) hoc gp cp k t khng bng nhau(lnh CMPSB so
snh 2 k t nu bng nhau th ZF = ZR(1), ngc li ZF = NZ).
Lnh ny khng lm nh hng ti cc c
8. Lnh REPE (repeat while equate): lnh ny tng ng vi REPZ
9. Lnh REPNZ (repeat while not zero) : lnh ny cng thng dng vi 1 lnh thao tc
vi xu k t lp li thao tc CX ln, sau mi bc th gi tr ca thanh ghi gim
1. Nu n c dng vi CMPSB. CMPSW, SCASB, SCASW th n ch lp khi c
ZERO khng bt ( ZF = NZ).
V d:
Mov CX, 10
Mov SI, 150
Mov DI, 180
Repz CMPSB
on lnh trn so snh tng cp k t tng ng ti DS:SI v ES:DI, sau mi bc CX
gim 1 v SI, DI s tng 1 nu DF = UP (hoc gim 1 nu DF =DN), vic so snh cn
thc hin khi CX >0 vcha gp cp k t bng nhau. Lnh ny khng lm nh hng
ti cc c

36

10. Lnh REPNE (repeat while not equal): lnh ny tng ng vi REPNZ

IV.2.5 - Cc lnh chuyn iu khin


Chng ta bit CPU thc hin lp i lp li tun t cc thao tc np 1 lnh v thc hin
lnh . Nhng thut gii ca nhng chng trnh thc t phc tp hn s tun t
nhiu, chng hn phi lp 1 on lnh no n ln ri mi ti lnh tip theo hoc 1
on lnh no ch c thc hin khi c iu kin tho mn,..h 80x86 h tr 1 s
lnh loi ny l cc nhm:
1. Lnh JMP (jump) - Nhy khng iu kin
C php: Jmp <ch>
Trong <ch> l 1 a ch, nhn
Chc nng: Chuyn iu khin ti lnh c a ch c xc nh bi <ch>.
Thc ra vi b vi x l c nhiu lnh nhy khc nhau c cng 1 c php trn. Trong 1
chng trnh assemble, khi gp 1 lnh nhy tu vo kiu ca <ch> m chng
trnh dch xc nh n tng ng c th l:
9 jmp disp8

; nhy trc tip trong on, ri 8 bit.

9 jmp disp16

; nhy trc tip trong on, ri 16 bit.

Vi hai lnh ny CPU tnh di so vi lnh hin ti tng ng 8 bit (-128


..+127) hoc 16 bit(-32,768..+32,767), CPU s tnh ri sau cng vo IP,
v l lnh cn thc hin.
V d:
Jmp begin
vi begin l 1 nhn, CPU s tnh ri t lnh hin ti (jmp) ti lnh ti nhn
begin, ri cng gi tr ny vo IP.
9 jmp adrs32 ; nhy trc tip (far), vi a ch 32 bit(offset, segment)
adrs32 l a ch trc tip, CPU s t a ch segment vo CS, offset vo IP, sau
thc hin lnh ti CS:IP.
9 jmp mem16 ; indirect intrasegment, 16 bit memory operand
mem16 l nh 16 bit, khc 3 dng trn, vi lnh ny CPU s tnh gi tr ca mem16,
y chnh l a ch ca lnh cn chuyn n (c th coi l IP=mem16).
V d:
addr dw 234
jmp addr
9 jmp reg16 ;register indirect intrasegment
Trong lnh ny dng thanh ghi a nng l a ch v d JMP BX, ngha cng tng
t nh Jmp mem16.

9 jmp mem32 ;indirect intersegment, 32 bit memory operand


lnh ny cng tng t nh Jmp mem16, ch khc l Jmp mem16 ch chuyn iu
khin trong on hin ti(IP=mem16, CS khng i) cn y c th nhy sang on

37

khc. Gi tr (2 word) mem32 s xc nh i ch segment v offset cn chuyn ti


(np vo CS, IP bi gi tr ca men32).
Tu vo ch l 8,16 hay 32 bit m chng ta gi lnh nhy l short, near(gn) hay
far(xa), nhy xa tc l nhy ra khi on hin ti, cn nhy gn th ch gii hn trong
on hin ti.

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

Jump if not zero

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

Jump if parity even

Parity = 1

JP

JPO

Jump if no parity

Parity = 0

JPO

JP

Jump if parity odd

Parity = 0

JNP

JPE

Jump if above (>)

Carry=0, Zero=0

JNBE

JNA

JNBE
JAE
JNB
JB
JNAE
JBE
JNA

Jump if not below or equal (not <=)

Carry=0, Zero=0

JA

JBE

Jump if above or equal (>=)

Carry = 0

JNC, JNB

JNAE

Jump if not below (not <)

Carry = 0

JNC, JAE

JB

Jump if below (<)

Carry = 1

JC, JNAE

JNB

Jump if not above or equal (not >=)

Carry = 1

JC, JB

JAE

Jump if below or equal (<=)

Carry = 1 or Zero = 1

JNA

JNBE

Jump if not above (not >)

Carry = 1 or Zero = 1

JBE

JA

38

JE
JNE
JG
JNLE
JGE
JNL
JL
JNGE
JLE
JNG
JE
JNE

Jump if equal (=)

Zero = 1

JZ

JNE

Jump if not equal ()

Zero = 0

JNZ

JE

Jump if greater (>)

SF = OV or Zero=0

JNLE

JNG

Jump if not less than or equal

Sign = Ov or Zero=0

JG

JLE

Jump if greater than or equal (>=)

Sign = Ovrflw

JNL

JGE

Jump if not less than (not <)

Sign = Ovrflw

JGE

JL

Jump if less than (<)

Sign Ovrflw

JNGE

JNL

Jump if not greater or equal

Sign Ovrflw

JL

JGE

Jump if less than or equal (<=)

SF =Ov or Zero = 1

JNG

JNLE

Jump if not greater than (not >)

Sign= Ov or Zero = 1

JLE

JG

Jump if equal (=)

Zero = 1

JZ

JNE

Jump if not equal

Zero = 0

JNZ

JE

Cc lnh nhy c iu kin


Vi b vi x l 286 v trc <ch> l ri 1 byte (-128,..,+127), do vy trong
trng hp phi nhy vi ri ln hn kh nng cho php ca lnh nhy c iu kin
th bn hy thc hin bi 2 bc nhy.
V d:
OR AX, AX
JZ shortzero
.......
shortzero: Jmp longzero
V d : In 1 ch s hex trong thanh ghi DL ra mn hnh
Mov DL, 0Dh

; 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

; ngc li, n l ch s A,..F phi cng thm 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

IV.2.6 - Cc lnh iu khin lp


C 3 lnh iu khin lp (ta gi l lnh lp cho gn) l LOOP, LOOPZ v LOOPE
1. Lnh LOOP
C php:
LOOP <ch>
trong <ch> l nhn hoc a ch tng t nh trong lnh nhy c iu kin

40

Chc nng: Chuyn iu khin v lnh xc nh bi <ch>, v gim CX i 1, vic


chuyn ny kt thc khi CX =0, tc l iu khin thc hin lp cc lnh t <ch> ti
v tr ca lnh LOOP vi s ln lp bng CX.
V d:
Mov CX,10
lap_A:
Mov AH,02
Mov DL,A
int 21h
LOOP lap_A
on lnh trn lp 10 ln cc cc lnh
Mov AH,02
Mov DL,A
Int 21h
Lu : Gii hn khong cch ca LOOP cng ging nh lnh nhy c iu kin l
128
V d 1 : In cc bit ca thanh ghi AX ra mn hnh
V d 2: In s trong thanh ghi AL dng h 10
Bi tp: Nhp s nguyn h 10 khng qu 4 ch s vo BX, in s ra mn hnh
2. Lnh LOOPZ v LOOPE
LOOPZ <ch>
LOOPE <ch>
Hai lnh ny c c php v cch s dng ging nh lnh LOOP.
Chc nng: Lp thc hin mt on lnh t <ch> ti v tr ca lnh
LOOPZ/ LOOPE khi CX >0 v c ZERO cn c bt(ZR).
V d: Tm phn t =0 u tin trong mng Array, mng c 16 phn t
mov cx, 16 ;
Max 16 array elements.
mov bx, -1 ;
Index into the array (note next inc).
SearchLp:
inc bx ;
Move on to next array element.
cmp Array[bx], 0 ;
See if this element is zero.
Loope SearchLp ;
Repeat if it is.
je AllZero ;
Jump if all elements were zero.
Cc lnh LOOP khng lm nh hng ti cc c

IV.2.7 - Mt s lnh iu khin cc c v b vi x l


Trong phn trn chng ta cng ni n gi tr ca 1 s c c nh ti cc iu kin ca
lnh nhy, hoc c m gi tr ca n quy nh vic thao tc vi xu theo hng tng ca
a ch hay gim,.. Chng ta khng th trc tip a gi tr vo c (tt nhin bn c thay
i bng cch dng pushf v popf), b vi x l cung cp cho chng ta 1 s lnh t
hoc xo 1 s c trong thanh ghi c v mt s lnh iu khin chnh b vi x l.
CLC (Clears the carry flag) lnh ny xo c nh (CF = NC)
STC (Sets the carry flag ) Bt c nh (CF =CY)
CMC (Complements the carry flag) - o c nh (chuyn gi tr CY thnh NC v
ngc li)
41

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)

STD (Sets the direction flag) Bt c hng(DF=DN), trong trng hp ny cc


thao tc duyt xu s i theo hng a ch gim.

CLI (Clears the interrupt enable) Xo c ngt(IF =DI), Gi tr ca c ngt = DI


th CPU s cm cc ngt c th che chn- khng cho php ngt.
Ch : bn phi cn thn khi xo c ngt, v khi cc ngt c th che chn c
b cm, nh vy CPU s khng p ng cc tn hiu yu cu ngt ny. Nu
dng khng hp l h thng ca bn c th coi nh b kho.

STI (Sets the interrupt enable)- Bt c ngt (IF=EI), trong trng hp ny CPU
cho php thc hin ngt.

Lnh NOP (no operation): lnh ny chng lm g c v cng khng nh hng ti


cc c ngoi tr vic lm tr thi gian thc hin ca CPU.

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

c php: LENGTHT <tn_bin>


ton t length tr v di ca bin, bin c nh ngha bi db, dw, dd, dt
c di bng 1, bin nh ngha bi DUP c bng s m ln lp.
V d:
X DB 34;
Length X = 1
Y DD 123574;
Length Y = 1
Z DW 10 dup(0); Length Z = 10
5. Cc ton t thuc tnh
ton t PTR (pointer)
c php:
<kiu> PTR <bin>
Cu lnh ny nh li (chuyn kiu) mt bin thnh kiu mi (byte, word). Cu
lnh ny c s dng trong trng hp nh bn c 1 bin kiu word nhng
bn mun truy xut theo tng byte th bn tm thi nh li kiu ca bin
theo kiu byte, vic p kiu theo ngha ti thi im ny bin truy xut theo
kiu c p.
ton t BYTE, WORD
Hai ton t ny thng dng vi ton t PTR nh kiu1 ton hng (bin,
nh) theo kiu byte hoc word.
V d:
X DW 12345h
Mov DL, BYTE PTR X ; ly 1 byte(thp) trong X chuyn vo
DL(=45)
ton t LOW v HIGH
c php: LOW <gi_tr>
Tr li byte thp ca <gi_tr> kiu 16 bit
c php: HIGH <gi_tr>
Tr li byte cao ca <gi_tr> kiu 16 bit

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

bng s, phi sp xp v tr ca m lnh cng nh tt c cc d liu trong b nh


my tnh hon ton l cc con s, cng vic ny ht sc nng nhc, kh sa v
d gy nhm ln.
V d: Mt on m lnh (s h 16)

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:

Tuy nhin ti thi im ny c 2 loi u l mi l vi chng ta, nhng r rng l kh


hiu ca hai loi chng ta c th nhn c l rt khc nhau.
trnh cc kh khn ca lp trnh bng ngn ng my nhng vn c th t c cc
u im nh khi s dng m my ngi ta lp trnh bng Hp ng. l ngn ng lp
trnh bc thp m ngi lp trnh c th:
S dng cc t gi nh (ta gi chung l lnh) thay cho cc m my ca b vi x l,
cc t gi nh ny s c dch thnh m lnh tng ng.
Cho php dng cc tn gi (nhn) ch cc a ch.
C th dng cc ch dn cho trnh bin dch (gi lnh)
Trong chng trnh c th c cc li ch thch
Tn hp ng xut pht t ngha trong chng trnh c 2 loi ch th lnh v gi
lnh.
Ngy nay c rt nhiu ngn ng lp trnh bc cao, rt mnh v d lp trnh, t tn
cng sc, d pht trin (so vi hp ng v ngn ng my). Vy chng ta bn n hp
ng l g? kch thc chng trnh nh hn, tc nhanh hn, c kh nng can
thip su vo phn cng, ngoi ra cn g na khng? iu cn gi tr na hay khng
khi my tnh ngy cng nhanh, b nh cng ln? Cu tr li ty vo bn.
Nh chng ta ni trn, b vi x l ch c th thc hin c cc lnh m my, nh
vy n khng th hiu c chng trnh vit bng hp ng cng nh chng trnh vit
bng ngn ng lp trnh khc. V th chng ta cn phi chuyn i chng trnh vit
bng hp ng (gi l chng trnh ngun) sang dng m my (gi l chng trnh ch).
Cng vic ny chng ta phi nh trnh bin dch v trnh lin kt. C rt nhiu trnh bin
dch v lin kt cho php chng ta chuyn mt chng trnh ngun thnh chng trnh
ch, nhng trong gio trnh ny chng ta s dng trnh bin dch MASM (Macro
Assembler ca Microsoft) v trnh lin kt Tlink (ca borland), ngoi ra bn cn mt
trnh son tho vn bn chun no son tho chng trnh ngun chng hn nh
NCEDIT, Turbo Pascal, NotePad,..
Nhc im ca hp ng

Hp kh hc, kh hiu, kh lp trnh


Kh kim tra li
Kh bo bo tr, pht trin chng trnh, kh chuyn i
Tn nhiu thi gian lp trnh

u im ca hp ng

Tc thc hin chng trnh, ni chung cc chng trnh hp ng chy nhanh


hn ngn ng bc cao khc.
Kch thc thng nh hn khi vit bng ngn ng bc cao.

46

S dng tt kh nng phn cng.


Tm hiu hp ng gip bn hiu su hn v my cng nh gip bn vit cc
chng trnh bng ngn ng bc cao ti u hn.

V.3 - Cu trc chng trnh hp ng


B vi x l ch thc hin c cc lnh m my hay chng trnh ch, vi h iu hnh
m chng ta s dng chng trnh ch c 2 loi: mt loi c phn m rng l COM, loi
cn li c phn m rng l EXE, v chng ta gi tng ng chng trnh ngun l
chng trnh dng COM v dng EXE. Tuy cng l dng m my nhng chng c
khc nhau i cht v cu trc nn khi vit chng trnh chng c dng khc nhau.
Trong phn ny chng ta trnh by v cu trc dng lnh ca hp ng, cu trc chng
trnh ngun n gin trn 1 file v cc bc to ra chng trnh ch, phn sau chng
ta s cp ti chng trnh c th tc v trn nhiu file.
1. Cu trc dng lnh ca hp ng
Chng ta bit l mt chng trnh l tp cc cu lnh theo nhng quy tc nht
nh, mi ngn ng lp trnh c tp cc t kha, lnh v c nhng quy tc khc
nhau xy dng thnh cc dng lnh v chng trnh. Mt dng lnh ni chung
ca hp ng c 4 thnh phn (trng) nh sau:
[nhn :] [tn_lnh [<ton_hng_1>[, <ton_hng_2>]]]

[; ch thch]

( cp [] ni rng thnh phn bn trong l ty chn)


V d:
LEA
DX, MSG
inxau:

nhn :

Mov

AH, 09

; Ham 09 ngat 21h, in xau ki tu

tn_lnh

ton_hng_1, ton_hng_2

; ch thch

Trng nhn : l mt tn nhn do ngi lp trnh t, vi hp ng mt tn (chng ta


dng chung cho cc loi tn bin, hng, nhn, th tc, tn on,..) l 1 xu k t c
di ti a 31 k t, khng cha cc du cch v cc k t iu khin phi bt u
bng ch ci. Hay c th tn l xu cc k t c th l cc ch ci a..z, cc ch s,
?, _,@ v di khng qu 31 k t v khng c trng vi cc t kha hoc cc
tn dnh ring.
Nhn nhm nh du (xc nh) mt v tr (a ch) b nh trong chng trnh cc
lnh ca hp ng c th dng tn ny thay cho a ch ca v tr . V d nh khi
chng ta cn nhy ti lnh no th thay v phi t tnh ton a ch ca lnh cn
nhy n, chng ta c th t ti v tr 1 nhn v chng ta thc hin lnh nhy ti
nhn . Khi dch v np chng trnh nhn c tnh ton v s c thay bi a ch
ph hp.
V d: on m lnh in 10 k t t b ti l

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

(ct bn tri l on lnh vit bng hp ng, ct bn phi l chng trnh ch c np


v dch ngc bng lnh u ca debug)
Trong v d trn ti dng lnh 9: chng ta mun nhy v dng lnh INC DL (dng 3:)
th chng ta t ti v tr (trc) ca lnh 1 nhn l LapIn v thc hin lnh nhy (
Jmp LapIn) ti nhn LapIn. Sau khi bin dch v lin kt assemler s xc nh c
chnh xc a ch lnh cn chuyn n, nhn LapIn ti a ch offset 0105h, v chuyn
lnh Jmp LapIn thnh Jmp 0105. Tng t nh vy nu iu kin c tho mn
(CX>10) th ti dng 8: chng ta mun nhy ti thc hin lnh Int 20h, chng ta t ti
(trc int 20h)1 nhn l Ketthuc v thc hin lnh nhy ti nhn Ketthuc (JA
Ketthuc) cng c thay bi JA 0113.
Ti v tr t nhn th sau tn nhn phi l du hai chm :, trong dng lnh mun s
dng nhn th ch cn tn ca n, ti v tr no ca chng trnh c th t cu lnh
th cng c th t nhn ti .
Trng tn_lnh: y chnh l t gi nh tng ng vi mt trong tp cc lnh ca b
vi x l (opcode - hay chng ta ni gn l lnh), tn lnh v c php ca dng lnh tu
vo lnh c th m chng ta dng (xem thm phn cc lnh v ton t)
Trng ton hng: vi mi lnh hoc (ton t) c th c mt, hai,,. hoc khng c cc
ton hng, y c th l tn thanh ghi, bin, hng, nh,.. hoc l mt biu thc tu
vo yu cu v s cho php ca lnh. Nu c nhiu hn 1 ton hng th cc ton hng
cch nhau bi du phy (,).
Trng ch thch: chng ta c th thm cc cu ch thch din gii chng trnh
hoc cu lnh, xu ch thch c bt u sau du chm phy (;) cho ti ht dng.
Xu ch thch ch c tc dng vi ngi c chng trnh, ch khng nh hng ti
trnh bin dch, khi bin dch chng trnh MASM s b qua li ch thch.
Mt lnh ca hp ng phi c vit nguyn trn 1 dng, tc l mt lnh khng th
vit trn nhiu dng v ngc li trn 1 dng ch c vit 1 lnh, cc t kho, lnh
hoc tn khng phn bit ch hoa hay ch thng, gia cc trng c th cc du
cch, tab, hoc gia cc dng lnh c th c cc dng trng.
2. Dng ch dn
Nh chng ta ni trong mc 2 ca phn ny, trong chng trnh hp ng cn c
mt loi ch dn cho chng trnh dch hoc trnh lin kt (gi l gi lnh : pseudo
op), cc gi lnh khng phi l cc ch th cho b vi x l thc hin m n l cc ch

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:

<const_name> EQU <Value>

Trong <const_name> l tn hng hp l theo quy tc v tn ca hp ng, <Value>


l gi tr hng ( mode nh v trc tip).
V d:

EQU

10

sh

EQU

21h

Trong hp ng chng ta c th s dng cc hng s nguyn h 10, h 2, v h 16 bng


cch vit trc tip gi tr ca n, nhng MASM s dng s ngm nh trong h 10, v

49

vy mun ch ra rng s l hng nh phn bn phi dng k t b sau s , v


tng t h cho hng s h 16. Hng k l 1 t c vit trong cp v d a hoc 4,
MASM s thay bng gi tr s l m ASCII ca k t. Xu k t l dy cc k t c
bao bi cp nhy n hoc nhy kp
v d Mon tin hoc co so II, K47 khoa CN $
Trong cc lnh ca hp ng khi cn dng ti hng th bn ch cn ghi tn hng (nu
v tr c php s dng hng), MASM s thc hin vic thay vo v tr gi tr
ca hng (theo mode nh v a ch trc tip).
V d:
a equ 10011b
b equ 10
c equ 21h
Mov AL, a
Mov DL, b
Mov DH, c
Int 20h
Cc ch th:
Mov Al, a c chuyn thnh (m my B013) Mov AL,13 (13h =10011b)
Mov DL,b c chuyn thnh (m my B20A) Mov DL,0A (0Ah =10)
Mov DH,c c chuyn thnh (m my B621) Mov DH,21
Lu : bn khng th thay i gi tr ca nh thng qua tn hng

Khai bo v s dng bin


Mt bin c th c khai bo theo kiu byte(1 byte), word (2 byte), double word (2
word) hay kiu 10 byte (ten byte) bng cch s dng cc gi lnh tng ng l DB
(define byte), DW (define word), DD (define double word) v DT(define ten byte)
C php:
<Var_name> DB <Value>
<Var_name> DW <Value>
<Var_name> DD <Value>
<Var_name> DT <Value>
Trong <Var_name> l tn bin hp l theo quy tc v tn ca hp ng, <Value> l
gi tr khi u cho bin.
Khi gp cc khai bo dng trn, assemler s cp pht vng nh c kch thc ph hp
v gn a ch ca vng nh cho tn bin tng ng ng thi ghi gi tr <Value>
vo nh , trong chng trnh khi gp mt tn bin th assembler s thay th bng
mt truy xut nh qua a ch ca vng nh c cp pht gn vi bin .
V d:
X DB 18h ; gi s bin ny c cp pht ti nh c a ch offset l 103
...
Mov DL, X ; Chuyn gi tr ca X vo DL
Add BL, DL ; BL = BL +DL
Mov X, BL ; X =BL
hai lnh Mov trn s c chuyn thnh

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

Y DW 10 DUP (1234h); Y kiu DW, vng nh gn vi Y l 10*2=20

4. Cu trc chng trnh dng COM


Chng trnh dng .COM l chng trnh m n ch gm c 1 on bao gm c vng
m lnh, d liu, ngn xp c cu trc nh sau:
<Seg_name>
Segment
Assume CS:<Seg_name>[,DS:<Seg_name>][,ES:<Seg_name>] [,SS:<Seg_name>]

Org 100h
<entry>:
<thn chng trnh>
...
Int 20h
<Seg_name> EndS
End <entry>

ngha cc thnh phn


<Seg_name> Segment : khai bo on
Trc khi chng trnh c thc hin th h iu hnh phi np n vo b ti mt
on no , vi chng trnh COM tt c ch gi gn trong 1 on. xc nh
on chng ta s dng gi lnh Segment (y l ch dn cho trnh bin dch ch
khng phi l lnh cho b vi x l). Seg_name tn ca on do chng ta t theo
cch t tn ca hp ng.
<Seg_name> EndS: Kt thc on
Hai ch dn Segment v EndS phi i i vi nhau nh ngha 1 on, ch dn
ny ni on <Seg_name> ti y l ht
Assume CS:<Seg_name> [,DS:<Seg_name>][,ES:<Seg_name>][,SS:<Seg_name>]
Thit lp cc thanh ghi on
Khi chng trnh c np vo b nh thc hin th b vi x l phi xc nh
c i ch ca on m lnh, on d liu cng nh ngn xp t cc a ch
trong cc thanh ghi on tng ng. Gi lnh Assume ch dn h iu hnh thit
lp cc thanh ghi on tr ti on tng ng, trong trng hp ny CS, DS, SS, ES
c gi tr bng a ch ca on <Seg_name>, hay ta ni n cng tr ti 1 on. V

51

chng trnh ca ta l COM nn ch c 1 on nn cc thanh ghi DS, ES, SS c


xc nh ngm nh theo thanh ghi CS do vic xc lp DS, ES, SS c th chng
ta khng cn thit.
Org 100h: Chng trnh c t chc ti ia ch offset 100h
Chng trnh COM lun bt u ti offset 100h, ti sao khng phi l offset 0 ca
on? H thng dnh 256 (100h) byte u tin cho vng d liu c bit gi l PSP
(Program segment Prefix). Trong gio trnh ny chng ta khng cp ti vng
ny, bn c c th tra cu [4.PSP]
<entry> v End <entry> : Xc nh im vo ca chng trnh
Khi chng trnh c np vo b nh, trc khi thc hin chng trnh, h iu
hnh xc nh a ch ca lnh u tin c thc hin, bng cch xc lp gi tr
ca CS:IP, gi lnh End <entry> s ch dn t IP bng a ch theo nhn ny
hay y l a ch bt u thc hin chng trnh.
< thn ca chng trnh>
y l cc lnh ca hp ng hp ng theo mt trt t hay c php xc nh thc
hin cc cng vic theo yu cu ca bi ton. Mi lnh trn 1 dng. Cc t kho
hoc lnh, tn, v tn thanh ghi ca assemble c th dng ch hoa hay thng.
Int 20h: ngt 20h kt thc chng trnh dng COM.
Trong chng trnh bn c th ghi cc ch thch nhm gii thch chng trnh hoc cc
lnh, cc ch thch c tnh t sau du chm phy (;) cho ti ht dng.
V d 1: chng trnh dng .COM in 1 k t A ra mn hnh.
Gii: thc hin yu cu in 1 k t ra mang hnh chng ta dng hm 02 ca ngt
21h. Nh chng ta bit trong phn m t ngt 21h, hm 02 s in 1 k t c m trong DL
ra mn hnh ti v tr hin ti ca con tr, v vy trc khi gi ngt bn phi a m
chc nng (02) vo thanh ghi AH, m k t (A) vo thanh ghi DL.
INKT segment
assume CS:INKT
org 100h
main:
mov ah, 02; Hm 02 ngt 21h in 1 k t trong dl
mov dl, 'A'
int 21h
int 20h
INKT ends
End main
; im vo ca chng trnh
V d 1: Chng trnh In k t A ra mn hnh

52

Cc bn c th t hi: Vy d liu cn dng trong chng trnh v d nh 1 xu, mt


bin c khai bo u? cn cc thao tc nh PUSH, POP s t d liu vo v ly
d liu t stack, vy stack ca chng trnh COM c t chc nh th no?
Nh chng ta ni trn chng trnh COM ch c c 1 segment v c 3 vng d
liu, m lnh, v ngn xp cng ch c trong 1 on m thi. Khi h iu hnh thc
hin 1 chng trnh COM n s np chng trnh vo 1 on no (a ch on
c ghi trong CS), phn m lnh s c np bt u ti a ch offset 100h cho ti
ht phn m lnh, phn ngn xp cng trong on nhng vi nh stack bt u t
pha cui (phn a ch cao) ca on (SS=CS), SP =65534, d nhin chng c quy
nh bt buc phn d liu nu c th phi nm u trong on ny, v vy bn phi
t t chc ly. Thng thng bn c th t d liu( cc khai bo d liu: bin,
hng,..) 2 v tr hoc ti u ca vng m lnh (ti a ch offset 100h) hoc sau cc
lnh (nhng vn phi trong on tc l trc ch dn <seg_name> EndS). V chng
trnh COM lun bt u ti a ch 100h nn nu bn mun t d liu trc m lnh
th ti (a ch 100h - im vo chnh ca chng trnh) bn phi thc hin lnh
nhy qua vng d liu ti cc lnh ca chng trnh.
<seg_name> Segment
Assume CS: <seg_name>
org 100h
<entry>: Jmp <code>
<cc khai bo d liu>
<code>: ; bt u cc lnh
<Cc lnh ca chng trnh >
<seg_name> EndS
End <entry>

hoc bn c th t cc khai bo d liu sau m lnh


<seg_name> Segment
Assume CS: <seg_name>
org 100h
<entry>:
<Cc lnh ca chng trnh >
; ht cc lnh,
<cc khai bo d liu>
<seg_name> EndS
End <entry>
Vng nh ca chng trnh COM

53

V d 2: chng trnh COM in 1 xu k t Mon tin hoc co so ra mn hnh


Gii: Theo yu cu ca v d ny chng ta c 1 khai bo xu (dng ch dn DB) vi
ni dung l Mon tin hoc co so. in 1 xu k t ra mn hnh chng ta s dng hm
09 ngt 21h, vi a ch xu cn in xc nh bi DS:DX, xu phi kt thc bng k t $
(m 24h). Do chng trnh dng COM nn thanh ghi on d liu DS s c t ng
xc lp bng thanh ghi on m lnh CS v cng chnh l on cha xu k t cn
in, v vy chng ta s t DX = Offset ca xu cn in.
Ta c chng trnh nh sau:
INXAU segment
Assume CS: INXAU
ORG 100H
main: Jmp Begin
; nhy qua vng d liu
MSG DB 'Mon tin hoc co so$'
; khai bo MSG l 1 xu
Begin:
Mov DX,Offset MSG
; DX = a ch offset ca MSG
Mov AH, 09
; hm 09 ngt 21h in 1 xu ti DS:DX
Int 21h
Int 20h
; ngt 20h kt thc chng trnh COM
INXAU Ends
End main
V d 2: Chng trnh in xau k t

5. Cu trc chng trnh dng .EXE


Chng trnh EXE l chng trnh c th c t chc trn nhiu on, cc on m
lnh, on d liu, on ngn xp tch bit nhau, c php n gin nh sau:
1: <Stack_name>
Segment
Stack
<Xc nh kch thc ngn xp>
2: <Stack_name> EndS
3: <Datad_name>
Segment
<cc khai bo d liu ca chng trnh >
4: <Data_name> EndS
5: <Code_name>
Segment
6:
Assume CS:<Code_name>, DS:<Data_name>, SS:<Stack_name>
7:
8:
...

<entry>:
<cc lnh ca hp ng>

mov AH,4Ch
Int 21h
9: <Seg_name> EndS
10: End <entry>

54

; thn ca chng trnh

ngha cc thnh phn


Nh ni trn, trong chng trnh EXE chng ta phi nh ngha 3 on phn bit
l: on d liu, on m lnh v on ngn xp (stack).
khai bo cc on chng ta cng s dng ch dn Segment vi ngha nh trong
phn trn m t. Cc dng1: nh ngha on ngn xp vi tn c xc nh bi
tham s <stack_name> , dng 3: nh ngha on d liu vi tn <data_name>, dng
5: nh ngha on lnh c tn c xc nh bi <code_name>.
Cc tn on do chng ta t theo quy tc v tn ca hp ng, vi on d liu v
on lnh ch cn tn on l , vi on ngn xp chng ta phi xc nh tn chung
hay kiu ca n l Stack. ngha cc thnh phn khc ca ch dn Segment bn c
tham kho trong phn ch dn Segment.
Cc d liu(bin, hng,..) m chng ta s dng trong chng trnh u c khai bo
trong on d liu. Kch thc thc s ca on ngn xp l bao nhiu th tu thuc
vo chng trnh c th m ngi lp trnh nh gi sao cho ph hp. Cc thnh phn
khc c ngha tng t nh trong chng trnh COM.
v chng ta phi ch dn tng minh h thng gn a ch cc on cho cc thanh
ghi on tng ng bng ch dn assume dng 6:
V d 3: chng trnh dng EXE in xu k t Mon tin hoc co so ra mn hnh
stack segment stack
db 100 dup(0)
stack ends
data segment
msg db 'Mon tin hoc co so $'
data ends
Code Segment
Assume cs: code, ds: data, ss: stack
main:
Mov ax, data
Mov ds,ax
Mov ah, 09
Mov dX, OFFSET MSG
Int 21h
Mov ah, 4Ch
; kt thc chng trnh EXE
INT 21H
Code Ends
End main
By gi chng ta kho st vng b nh cho chng trnh trn (nhiu con s bn chp
nhn, sau ny bn s bit cch tnh chng). Gi s bn bit cch hp dch, lin kt
chng trnh ny v bn xem file MAP ca n (tham kho phn dch v lin kt)
Khi dch v lin kt chng trnh bn s thy:
on Stack di 64h byte (do ch dn db100 dup(0) = 100byte = 64h byte)
on d liu(data) di 13h byte ( di xu 'Mon tin hoc co so $')
55

on m lnh(code) di 10h byte (tng di cc lnh m my bn tha


nhn)
gi s by gi bn np chng trnh ny bng debug v xem cc thanh ghi bn
thy(con s ny l mt minh ho c th trn my, do vy c th thay i trn cc my
khc nhau v trong cc ln np khc nhau ): SS = 380F, DS = 3816, CS =3818
Nh vy cc on c xp lin k, trt t l Stack, Data, Code (nh th t chng ta
vit trong chng trnh ). Nhng chng ta li thy t on d liu ti stack l DS*16
SS*16 = 112 byte (=16*7) ch khng phi =100 byte theo di ca on stack, l
do cc on ca ta c cn l (align) theo para (tc l on stack chim 7 para), v
nh vy cc on phi bt u ti a ch nguyn ln 16, gi thch tng t cho on
code vi data, di on data l 13 h v n chim 2 para (CS-DS =2).

Cc vng nh ca chng trnh EXE


6. So snh c im ca chng trnh COM v EXE
chng trnh COM gii hn trong 1 on, nn kch thc khng qu 64 KB, trong
khi chng trnh EXE c th np trn nhiu on v kch thc c th vut qu
64 KB.
chng trnh COM np v thc hin nhanh hn chng trnh EXE
chng trnh COM ni chung khng truy xut c cc th tc hoc s liu
on khc, cn chng trnh EXE c th c
cc chng trnh thng tr truyn thng phi l COM
chng trnh trnh COM c th kt thc bi ngt 20h hoc hm 4Ch ngt 21h,
chng trnh EXE phi kt thc bi hm 4Ch ngt 21h.

7. Cc bc to chng trnh kh thi


(b1) Phn tch v thit k chng trnh: trong bc ny chng ta tm hiu yu cu,
phn tch bi ton, xc nh thut gii,..
(b2) Son tho chng trnh ngun: s dng mt trnh son tho vn bn chun no
vit chng trnh theo thut ton xc nh v ghi vo 1 file. Sau bc ny
bn c file chng trnh ngun, tn file chng trnh ngun do bn t tuy
nhin bn nn t c phn m rng l asm.
(b3) Hp dch chng trnh: Khi c chng trnh ngun, bc tip theo l bn dch
chng trnh ngun thnh chng trnh i tng (c phn m rng l obj) bng

56

cch s dng trnh bin dch MASM - i hi bn phi c MASM.EXE - theo c


php sau:
MASM <file_ct_ngun> [;]
Trong <file_ct_ngun> l tn file c th c ng dn cha chng trnh
ngun cn bin dch, nu phn m rng khng phi l asm th bn phi vit y
c phn m rng.
V d: gi s bn c file chng trnh INXAU.ASM th bn c th dch bng lnh
MASM INXAU
Bn s nhn c cc thng bo sau:
Microsoft (R) Macro Assembler Version 5.10
Copyright (C) Microsoft Corp 1981, 1988.All rights reserved.

Object filename [inxau.OBJ]:


Trong 2 dng u l phin bn v bn quyn ca trnh bin dch MASM. Dng
th 3 l thng bo i bn cung cp tn file i tng, nu bn mun mt tn file i
tng khc vi tn file ngun th bn c th g tn file mi t bn phm, cn nu
mun gi nguyn tn th bn g Enter. Tip theo MASM s ngh bn t tn cho
file listing ca chng trnh:
Source listing [NUL.LST]:
Ngm nh l khng to file listing, nu bn mun to file ny th bn cn phi cung
cp tn file, nu khng bn ch cn g Enter.
File listing bao gm ni dung ca file ngun v c chn thm mt s thng tin khc
nh: s th t dng, a ch offset ca lnh, m lnh tng ng vi tng lnh, cc
on v di thc s ca n, v mt s thng tin khc, ni dung file ny cc bn
c th c bng 1 trnh son tho vn bn.
Sau , cng tng t nh trn, MASM ngh bn xc nh c to file tham kho
cho hay khng bng thng bo:
Cross-reference [NUL.CRF]:
Nu c bn hy g tn file t bn phm, nu khng bn ch cn g Enter.
y l file cha s dng ti c k hiu c nh ngha v s hiu ca cc dng
khc c tham chiu ti k hiu ny.
Nu bn g ; sau tn file ngun th MASM s dng cc ngm nh cho 3 file nu
trn, tc l bn s khng tr li cho 3 thng bo nu trn.
Nu chng trnh ca bn khng c li c php th vic bin dch hon tt, bn s
nhn c thng bo:
0 Warning Errors
0 Severe Errors
Ngc li nu chng trnh cn li c php, MASM s thng bo mi li mt dng
thng bo (c th mt li thc s pht sinh nhiu thng bo li), mi dng gm: tn
file, s hiu dng gy ra li, m li, ni dung li, v cui cng l tng s li v cnh
bo. Trong trng hp ny chng ta phi tr li bc son tho hiu chnh li.
v d:
inxau.ASM(7):error A2105:Expected:instruction,directive, or label
48804 + 263223 Bytes symbol space free
0 Warning Errors
1 Severe Errors

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

Ty vo li sinh ra bc no m chng ta phi quay li sa t bc .


(b5)

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

5 vo DL, ta thy m ca cc k s t 0 ti 9 l lin tc v m ca 1 con s = gi tr


ca s cng vi m ca k s 0, do khi cn in 1 con s trong DL th ta ch cn tnh
DL = DL +0 v ta in k t trong DL.
Ta c chng trnh nh sau:
INSO

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

Gii cch 1: R rng l in mt s (c nhiu ch s) s ra mn hnh dng h m no


th chng ta phi in tng ch s ca s , tc l ta phi xc nh c cc ch s ca n,
hay ni cch khc l phi tm c biu din ca n trong h c s . Nh trong phn c
s cp xc nh cc ch s chng ta c th dng phng php chia s cho c
s v ly phn d. Cc s d ly theo th t ngc vi th t php chia l cc ch s cn
tm.
Vy trong bi ton ny chng ta cng thc hin chia AX lin tip cho (c s) 2, phn d
chng ta s ct vo ngn xp (Push), phn nguyn li trong AX, qu trnh chia ny lp
li cho ti khi AX = 0, mi ln thc hin php chia (v ct 1 s vo stack) nh vy chng
ta phi tng bin m (CX) thm 1. Khi kt thc cc php chia bn c cc s (c 1 ch
s) trong ngn xp, bn ch cn ln lt ly ra v in (s ln = CX)
{s khi }
INSONP
segment
;
Assume CS:INSONP
Org 100h
Main:
MOV
AX,435
MOV
CX,0
MOV
BX,2
non_zero:
XOR
DX,DX
DIV
BX
AX
PUSH
DX
INC
CX
OR
AX,AX
JNZ
non_zero
in1so:
POP
DX
ADD
DX,'0'
MOV
AH,02
INT
21H
LOOP in1so
Int 20h
INSONP Ends
End main

Chng trnh in s nh phn

; 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

14,...by gi bn hy thc hin a gi tr c nh vo DL v cng thm 0 bn s c m


ca ch s (0 hoc 1) cn in.
Cng vic ny bn dng php cng vi c nh ADC theo cc bc sau:
Mov DL,0
RCL AX,1
ADC DL,0
Sau bn in ch s c m trong DL, bn lp li 16 ln s thu c bu din nh phn.
INSONP2
segment
Assume CS:INSONP2
Org 100h
Main:
MOV AX,145
; v d s cn
in
Mov CX,16
; 16 ch s
lap1chu:
Xor DL,DL
RCL AX,1
ADC DL,'0'
push AX
Mov AH,02
Int 21h
POP AX
LOOP lap1chu
Int 20h
INSONP2 Ends
End main
V d 3 - In s nh phn bng phng php quay
Qua mt s v d trn chng ta hnh dung c mun in c 1 s trong hp ng th
phi l nh th no tuy rng cn n gin, chng ta c th t cu hi in cc s trong h
10, 16, 8, c tng t hay khng, c nht thit s cn in phi trong 1 thanh ghi no hay
c th trong thanh ghi khc, s m th in th no? vn l bi tp cho cc bn.
2. Nhp mt s
Trong phn a, chng ta ni ti in 1 s, vy s u, trong cc v d trn cc s
l c nh c t vo thanh ghi ti u chng trnh. Trong phn ny ta bn n cch
nhp mt s t 1 ti 4 ch s v minh ho bi cc v d.

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

thu c gi tr s cn nhp trong h 10 bn phi tr i m ca k s 0 ( y


chng ta khng tnh n kh nng ngi dng bm phm khng phi k s hp l).
V d
Mov AH, 01
Int 21h
Sub AL, 0
sau khi thc hin 3 lnh trn, nu bn bm 1 trong cc phm s (0,..,9) th trong AL
ang cha s bn nhp, tt nhin l s h 10.
Nu l h 16 th ngoi cc ch s t 0 ti 9 c x l nh va nu chng ta cn cc
ch s t A ti F, vi cc k t ny r rng l:
A c gi tr =10 = A 0 7
B c gi tr =11 = B 0 7,...
Vy chng ta c th thc hin nh sau:
Nhp 1 k s (0,1,...,9, A, B,..,F), m ghi vo AL
AL = AL 0
Nu AL >9 th AL=AL-7
Sau 3 bc trn bn c 1 ch s h 16 trong AL. Cc s trong h c s khc bn
cng lm tng t.
Nhp s c nhiu ch s
Khi thc hin nhp 1 s c n ch s vi c s X th chng ta phi lp n ln vic nhp 1
ch s t tri sang phi, vi 1 ch s th nht bn thc hin nh trn vo thanh ghi no
Y, t cc s th 2 tr i bn phi cng thm vo Y sau khi nhn Y vi X.
Cc bc nh sau:
Y=0
CX = <s ch s ti a>
nhap1chuso:
Nhp 1 ch s, m ghi vo AL
X l AL c s
Y = Y* X

; 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

V d 5: Vit chng trnh COM nhp 1 s h 16 ti a 4 ch s vo thanh ghi BX, vi


yu cu ngi dng c th nhp t 1 ti 4 ch s (0,..9), nu nhp 4 ch s hoc cha
nhng bm Enter th kt thc.
Gii: s khi

63

Theo chng ta c chng trnh nh sau:


VD6_5 SEGMENT
assume CS: VD6_5
org 100H
Main: JMP CODE
msg db 'Nhap so he 10, khong qua 4 chu so: $'
CODE:
MOV
DX, OFFSET MSG
MOV
AH,09
INT
21H
MOV CX,4
XOR BX,BX
NHAP1CHUSO:
MOV AH,01
INT 21H
cmp al,13
je kt
sub AL,'0'
XOR AH,AH
PUSH AX
XOR DX,DX
MOV AX,BX
MOV SI,10
Mul SI
POP BX
ADD BX,AX
LOOP NHAP1CHUSo
kt: Int 20h
VD6_5 EndS
End main

V d 5 nhp 1 s h 10 khng qu 4 ch s
3. Nhp v In xu k t

64

Trong phn ni v mt s chc nng ca ngt 21h chng ta ni ti chc nng 09 in 1 xu


k t, vic in mt xu rt n gin, bn ch cn c a ch ca xu trong DS:DX, vi yu
cu xu phi kt thc bi k t $ (c m ASCII l 24h). Hm 09 ngt 21h tun t in
cc k t t a ch offset l DX cho ti khi gp $, cc k t bnh thng c in ra mn
hnh, cn mt s c bit khng c in ra mn hnh l cc k t iu khin. Nh trong
v d 6.4, hai k t c m 0Ah v 0Dh u xu tbkq khng phi l k t bn nhn thy in
ra mn hnh, cp k t ny iu khin con tr mn hnh xung dng (0Ah LF : line feed)
v v u dng (0Dh - CR: carriage return), hoc k t m 7 iu khin pht 1 ting bp ra
loa,..
Nh vy in 1 xu bn thc hin:
DX = a ch offset ca xu
DS = a ch segment ca xu
AH = 09
Int 21h
Nhp mt xu th phc tp hn mt cht, chng ta s dng chc nng 0Ah ca ngt 21h
nhp mt xu. nhp 1 xu chng ta phi c 1 vng nh (buffer) lu ni dung
xu s nhp.
Trc khi gi ngt chng ta phi a a ch ca buffer vo DS:DX, v byte u tin ca
buffer phi ghi mt s nguyn dng l di ti a (max) ca xu, hm 0A ch nhn k
t cho ti khi hoc max-1 k t hoc gp k t Enter, v n t ng ghi k t ny (m
13) vo cui ca xu va nhp ng thi ghi vo byte th 2 ca buffer mt s l s k
t thc s ca xu (khng tnh k t Enter), ni dung xu s bt u t byte th 3, nh
vy di buffer phi ti thiu l max +2.
Gi s sau khi nhp t bn phm mt xu vo buffer bn mn s dng xu cho mc
ch no th ty vo yu cu ca cng vic sau m bn phi x l du kt thc xu cho
ph hp, v d nh bn dng xu l tn file (hoc th mc) cho muncc chc nng
m file, to th mc, .. th xu yu cu phi kt thc bi 0, hoc n gin bn mun in ra
chng hn th xu li phi kt thc bi $ (24h), tc l chng ta phi ghi vo byte cui
cng (byte cha k t m 13) k t $. V tr ca byte ny c th xc nh nh sau:
BX = offset buffer + <s k t> + 2 = offset buffer + buffer[1] +2
v ghi k t $ vo cui [BX]= $
cc lnh hp ng l:
Lea
Mov
Xor
ADD
ADD
Mov

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

V d 6: Chng trnh COM nhp 1 xu di khng qu 50 k t, ri in xu ra mn


hnh
Code_seg SEGMENT
assume CS: code_seg, DS : Code_seg
org 100H
start: JMP CODE
CODE:
Lea
dx, tbnhap
Mov
Ah,09
Int
21h
;--------------- nhap xau
Lea
DX, buffer
mov
ah,0ah
int
21h
;------- Xu ly dau ket thuc xau
Mov
BL, buffer[1]
Xor
BH,BH
Mov
buffer[BX +2],'$'
;--------------In xau ---Lea
dx, tbkq
Mov
Ah,09
Int
21h
Mov
dx,offset buffer
Add
dx,2
mov
ah,09h
int
21h
Int
20h
;---------- phn khai bo
tbnhap
DB
'Nhap mot xau: $'
tbkq
DB
0ah, 0dh, 'Xau vua nhap: $'
buffer
db
50,52 dup(0)
Code_seg ENDS
End start
V d 6 Nhp mt xu v in ni dung ca n

------------------------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

Bi tp 5: Vit chng trnh dng COM nhp 3 xu c di khng qu 30 k t, in mt


xu th k (k=1,2,3) theo yu cu ca ngi dng.
Bi tp 6: Vit chng trnh dng EXE nhp n (n <=10) xu c di mi xu khng
qu 30 k t, in cc xu ra mn hnh.

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

tr tr v) th trc khi thay i bn nn ct (PUSH) n vo ngn xp v trc khi kt thc


th tc (trc lnh ret) bn phi khi phc (POP) n. V ngn xp l vic theo c ch
LIFO (vo sau ra trc) nn bn phi khi phc cc thanh ghi theo trt t ngc vi trt t
bn ct, v c bit lu bn ct bao nhiu ln thanh ghi vo ngn xp th bn phi ly ra
khi ng by nhiu.
V d 1: Vit th tc In mt k t c m trong thanh ghi DL
Gii: chng ta c th t tn th tc l Write_char, chc nng ca n l in k t c m
trong DL, y l u vo ca th tc. Chng ta s dng hm 02 ngt 21h in nh vy
chng ta lm thay i thanh ghi AX, do u th tc ta ct AX vo ngn xp v trc
khi kt thc ta phi khi phc n.
Write_char

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

Th tc giao nhau (khng c


php)

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

VII.3. V tr ca th tc trong chng trnh


Cc th tc c nh ngha trong on m lnh ca chng trnh COM cng nh EXE
cng tng t
<Seg_name> Segment
Assume
CS:<Seg_name>
[,DS:<Seg_name>][,ES:<Seg_name>][,SS:<Seg_name>]
Org 100h
<entry>:
<cc lnh>
......
Call <P1>
........
Call <P2>
.....
Int 20h
<P1> Proc
.....
<P1> EndP
<P2> Proc
.....
<P2> EndP
<Seg_name> EndS
End <entry>
V d D_3: Vit chng trnh dng EXE gm :
Th tc Nhapso: nhp mt s h 10 khng qu 4 ch s vo thanh ghi BX
Th tc Inso : In mt s trong thanh ghi BX dng h 10
Chng trnh chnh: nhp 2 s, in ra tng ca chng
(trong chng trnh ny chng ta khng xt kh nng tng 2 s vt 1 thanh ghi)

70

stack segment stack


db 200 dup(0)
stack ends
data segment
b1 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
assume cs: code, ds: data, ss: stack
main:
Mov ax,data
Mov ds,ax
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
;--------------------Nhapso proc
Push AX
Push CX
Push SI
MOV CX,4
XOR BX,BX
NHAP1CHUSO:
MOV AH,01
INT 21H
cmp al,13
je kt1
sub AL,'0'
XOR AH,AH
PUSH AX

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

Nh phn trn ta ni khi gp li gi th tc Call assemble s ct a ch tr v (a ch


ca lnh sau lnh call) vo ngn xp, tuy nhin a ch ny l a ch offset hay c
segment : offset tc l 2 byte hay 4 byte th ty thuc vo a ch trong 1 on hay ra
ngoi on, iu c quyt nh bi kiu ca th tc c gi l near hay far.
Vi mt th tc l near th khi gp lnh Call CPU s ct gi tr offset ca a ch tr v
vo ngn xp. Nu th tc l Far th CPU s ct c segment v offset ca a ch tr v
vo ngn xp theo trt t segment ri ti offset.
Khi lnh Ret (trong th tc c gi) c thc hin th lnh ny s t ng khi phc
a ch tr v trong nh ca ngn xp, nu l th tc near th n khi phc 2 byte (a
71

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.

Chng trnh trn nhiu file

Trong cc phn trn chng ta c cc chng trnh c th chng cng s dng mt th


tc. Trong trng hp nh vy hp ng cho php chng ta xy dng mt hoc nhiu th
vin cha cc th tc dng chung , v mt chng trnh no cn s dng cc th tc
trong th vin th bn ch cn lin kt cc th vin l . Gi s rng bn cn xy dng
th vin TV.ASM (modul ph) trong c th tc P1 v P2, v chng trnh chnh
(modul chnh) MAIN.ASM, trong main bn cn s dng (gi) P1 v P2.
Cu trc ca MAIN hon ton nh chng trnh c mt file ngoi tr mt s thng tin
lin quan ti P1 v P2, do P1 v P2 c nh ngha trn file khc nn trong modul chnh
chng ta phi khai bo l EXTRN (ch dn extrn). Modul ph cng bao gm cc on v
nh ngha cc th tc hoc d liu, cc th tc hoc cc bin cn s dng chung phi
c khai bo l PUBLIC (ch dn public), v d trong trng hp ca ta l P1 v P2.
1. Cu trc modul ph ca chng trnh COM

Public <name_1>, <name_2> [,..]


<Seg_name> Segment public
Assume CS: <Seg_name> [ DS: <Seg_name>,...]
<cc nh ngha ca mdul ph>
<Seg_name> Ends
End
Trong modul ph ch c mt on (do chng trnh chng ta ang ni l COM), modul
ny s c lin kt vi modul chng trnh chnh do vy khng c ch dn ORG cng
nh ch dn End kt thc modul khng c nhn. on m lnh c tn l <seg_name> s
c kt hp vi on m lnh trong modul chnh do vy bn phi khai bo l Public v
cng tn vi on lnh trong chng trnh chnh.
Dng khai bo Public <name_1>, <name_2> ch dn cho assemble bit <name_1>,
<name_2> l nhng (tn) thnh phn c dng chung hay c th giao din vi bn
ngoi.
2. Cu trc modul chnh chng trnh COM

72

Extrn <name_1>: proc/near/far, <name_2>: proc/near/far [,..]


<Seg_name> Segment public
Assume CS: <Seg_name> [ DS: <Seg_name>,...]
ORG 100h
<entry>:
<cc nh ngha, cc lnh ca mdul chnh>
<Seg_name> Ends
End <entry>
Trong dng khai bo : Extrn <name_1>: proc/near/far, <name_2>: proc/near/far [,..]
bo cho assemble bit nhng ci tn <name_1>, <name_2> c nh ngha ni khc,
n l tn th tc (proc) hay nhn gn (near) hay xa (far). Trong thi gian bin dch, nu
gp nhng tn ny MASM khng tm cc nh ngha ca n m ch pht sinh c ch lin
kt chng khi lin kt chng trnh.
Cc thnh phn khc trong hai modul c ngha tng t nh trong trng hp chng
trnh trn mt file (tc l ch c modul chnh).
3. Cu trc modul ph ca chng trnh EXE
Public <name_1>, <name_2> [,..]
[<Stackseg_name> Segment Stack
<Khai bo stack>
<Stackseg_name> Ends]
[<Dataseg_name> Segment Stack
<Khai bo d liu>
<Dataseg_name> Ends]
<codeseg_name> Segment public
Assume CS: <codeSeg_name> ,DS: <DataSeg_name>, SS: <Stackseg_name>
<cc nh ngha ca mdul ph>
<codeseg_name> Ends
End

4. Cu trc modul chnh chng trnh EXE

73

Extrn <name_1>: proc/near/far, <name_2>: proc/near/far [,..]


<Stackseg_name> Segment Stack
<Khai bo stack>
<Stackseg_name> Ends
<Dataseg_name> Segment Stack
<Khai bo d liu>
<Dataseg_name> Ends
<codeseg_name> Segment public
Assume CS: <codeSeg_name> ,DS: <DataSeg_name>,
SS: <Stackseg_name>
<cc lnh/khai bo ca mdul chnh>
<codeseg_name> Ends
End <entry>

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

public Nhapso, Inso


code segment public
assume cs: code
hapso proc
Push AX
Push CX
Push SI
MOV CX,4
XOR BX,BX
NHAP1CHUSO:
MOV AH,01
INT 21H
cmp al,13
je kt1
sub AL,'0'
XOR AH,AH
PUSH AX
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
75
;--------------------code ends
End

Modul chnh (D_5_M.asm)


extrn nhapso:proc, inso:proc
code segment public
assume cs: code
org 100h
main: jmp begin
tb1 db 0Ah,0Dh,'Nhap so thu nhat : $'
tb2 db 0Ah,0Dh,'Nhap so thu hai : $'
tb3 db 0Ah,0Dh,'Tong hai so : $'
begin:
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

5. Hp dch tch bit v lin kt


By gi chng ta c cc modul(gm modul chnh v th vin) cng vic tip theo l
dch v lin kt chng li c chng trnh ch.
Bin dch: cc modul c bin dch c lp nh khi chng ta bin dch chng
trnh mt modul, bn c th thc hin theo trt t ty .
V d: MASM D_5_M;
MASM D_5_TV;
(D_5_M.ASM v D_5_TV.ASM l 2 modul chnh, ph trong v d D_5)

gi s bc ny thnh cng th chng ta c 2 file i tng l


D_5_M.OBJ v D5_TV.OBJ
Lin kt: Sau khi bin dch cc modul bn lin kt chng theo c php
Tlink <modul_chnh> <modul_ph_1> <modul_ph_2> ... [/t]
hoc Tlink <modul_chnh>+<modul_ph_1>+<modul_ph_2> + ... [/t]
V d : Tlink D_5_M D_5_TV /t
76

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

You might also like