Bài ging hp ng Chng III: Các lnh nhy
24
CHNG III: CÁC LNH NHY
3.1 Thanh ghi c và các c trng thái
Thanh ghi c dài 16 bít, mi bít c gi là mt c và có công dng riêng. Di ây là
trí ca các c:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
Ta thy b vi x lý 8086 mi s dng 9 bít ca thanh ghi c, sau ây là tên và chc
ng ca các c:
Bit Tên c Kí hiu
0 C nh (Carry Flag) CF
2 C chn l (Parity Flag) PF
4 C nh ph (Auxiliary Flag) AF
6 C Zero (Zero Flag) ZF
7 C du (Sign Flag) SF
11 C tràn (OverFlow Flag) OF
8 C by (Trap Flag) TF
9 C ngt (Interrupt Flag) IF
10 Cnh hng (Direction Flag) DF
Các c chia làm hai nhóm khác nhau: Nhóm c trng thái (gm 6 c: CF, PF, AF, ZF,
SF, OF) và nhóm cu khin (gm 3 c: TF, IF, DF). Trong chng này ta s tp trung
tìm hiu các c trng thái, còn các cu khin s trình bày sau.
Mi khi môt lnh trong chng trình c thc hin thì trng thái ca b vi x lý li
thay i, s thay i này c phn ánh trong các c trng thái. hiu rõ hn vn
này ta s xem xét mt vài c trng thái hay dùng nht.
3.1.1 C nh CF
Ví d: xét các lnh sau ây:
MOV AX, 0FFFFh
ADD AX, 1
Trc khi thc hin lnh ADD thì AX = FFFFh = 1111 1111 1111 1111b = 65535
Sau khi thc hin phép cng vi 1 thì AX bng bao nhiêu?
1111 1111 1111 1111b
+ 1
1 0000 0000 0000 0000b
Thanh ghi AX dài 16 bit nên sau lnh ADD thì AX = 0! Phép cng ã không còn chính
xác do kt qu vt quá phm vi cha ca AX (gi là hin tng tràn khi cng s không
u). Khi ó c CF c thit lp bng 1.
Nh vy, c CF sc thit lp khi thc hin phép cng có nh bít Msb hoc khi
thc hin phép tr có vay bít Msb.
3.1.2 C Zero ZF
Ví d: xét các lnh sau ây:
Bài ging hp ng Chng III: Các lnh nhy
25
MOV CX, 2Ah
SUB CX, 2Ah
Sau khi thc hin lnh SUB thì CX = 0, c ZF c thit lp bng 1.
Nh vy, c ZF sc thit lp khi kt qu ca lnh va thc hin bng 0.
3.1.3 C tràn OF
Ví d: xét các lnh sau ây:
MOV AX, 7FFFh
ADD AX, 7FFFh
Trc khi thc hin lnh ADD thì AX = 7FFFh = 0111 1111 1111 1111b = 32767
Sau khi thc hin phép cng thì AX bng bao nhiêu?
0111 1111 1111 1111b
+ 0111 1111 1111 1111b
1111 1111 1111 1110b
Sau lnh ADD thì AX = FFFEh. Nu coi ây là s không du thì AX = 65534, không
có hin tng tràn, c CF = 0. Nhng nu coi ây là s có du thì AX = -2 (32767 +
32767 = -2!), phép cng ã không còn chính xác do kt qu vt quá phm vi cha ca
AX (gi là hin tng tràn khi cng s có du). Khi ó c OF c thit lp bng 1.
Nh vy, c OF sc thit lp khi xut hin hin tng tràn trong phép tính vi s
có du.
3.2 Các lnh nhy có u kin
3.2.1 Ví d
Xét chng trình hp ng sau:
TITLE Lenh nhay
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
NHAPLAI:
MOV AH, 1 ;Chc nng s 1: Nhp 1 kí t
INT 21h
CMP AL, ;Kim tra kí t va nhp
JZ NHAPLAI
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
Gii thích:
Chng trình trên s nhp mt kí t t bàn phím, kim tra xem ó có phi là kí t
khong trng ‘ ’ hay không, nu úng thì tin hành nhp li. Quá trình ó c thc hin
nh lnh so sánh CMP và lnh nhy JZ.
Bài ging hp ng Chng III: Các lnh nhy
26
a) Lnh CMP (Compare)
Cú pháp lnh:
CMP <ích>, <Ngun>
Lnh này có tác dng tng t lnh SUB, nó thc hin phép tr gia ích và Ngun.
khác bit là ch: ích không b thay i sau phép tr, ch có các c là thay i.
Ví d:
CMP AL, ‘ ’
Lnh trên s ly ni dung ca AL tr cho 20h (mã ASCII ca kí t khong trng). Nu
t qu mà bng 0, tc là AL = 20h (AL = ‘ ‘), thì c ZF sc thit lp bng 1. Trng
thái ca các c sc s dng làm u kin cho các lnh nhy.
b) Lnh nhy JZ
Lnh JZ là lnh nhy khi c ZF = 1 (Jump if Zero).
Cú pháp lnh:
JZ <Nhãn>
Trong chng trình trên, lnh JZ s kim tra c ZF, nu ZF = 1 thì s nhy ti nhãn
NHAPLAI, ngha là thc hin li các lnh nhp d liu.
3.2.2 Mt s lnh nhy
Có nhiu lnh nhy khác nhau ng vi trng thái khác nhau ca các c:
nh Chc nng u kin nhy
JC
JNC
JO
JNO
JS
JNS
Nhy nu có nh (Jump if Carry)
Nhy nu không nh (Jump if Not Carry)
Nhy nu tràn có du (Jump if OverFlow)
Nhy nu không tràn (Jump if Not OverFlow)
Nhy nu du âm (Jump if Sign)
Nhy nu du dng (Jump if Not Sign)
CF = 1
CF = 0
OF = 1
OF = 0
SF = 1
SF = 0
Vic kim tra trng thái ca các c khi s dng lnh nhy gây rt nhiu khó khn cho
ngi lp trình (do có quá nhiu lnh nhy, khó nh, không hp vi t duy thông
thng ). khc phc u này, ngi ta thng s dng các lnh nhy kèm vi lnh
CMP theo quy tc sau:
CMP <ích>, <Ngun>
u kin nhy nh nhy không du Lnh nhy có du
ích > Ngun
ích < Ngun
ích = Ngun
ích Ngun
ích Ngun
ích Ngun
JA/ JNBE
JB/ JNAE
JE/ JZ
JAE/ JNB
JBE/ JNA
JNE/ JNZ
JG/ JNLE
JL/ JNGE
JE/ JZ
JGE/ JNL
JLE/ JNG
JNE/ JNZ
t s t vit tt:
A: Above (ln hn) = G: Greater than
B: Below (nh hn) = L: Less than
E: Equal (bng)
Bài ging hp ng Chng III: Các lnh nhy
27
N: Not (không)
Ví d:
JNA: Jump if Not Above = JBE: Jump if Below - Equal
Gii thích:
Trc mi lnh nhy cn dùng mt lnh CMP to u kin nhy. Ngi lp trình
cn c vào quan h gia <ích> và <Ngun> la chn lnh nhy thích hp.
Ví d:
CMP AL, 5Ah
JA KetThuc ;Nu AL > 5Ah thì nhy ti nhãn KetThuc
Nu ích > Ngun: Ta có th s dng lnh nhy JA hoc JNBE (trong trng hp
ích và Ngun là s không du). Hai lnh này có tác dng ging ht nhau. Nu coi ích
và ngun là các s có du thì phi s dng lnh JG hoc JNLE.
3.3 Lnh nhy không u kin JMP
Các lnh nhy có u kin mà ta ã nghiên cu có mt nhc m là không th nhy
quá xa. Các lnh ó ch có th nhy ti mt nhãn ng trc nó không quá 126 byte hoc
ng sau không quá 127 byte.
khc phc u này có th s dng lnh nhy không u kin JMP. Cú pháp lnh
nh sau:
JMP <Nhãn>
trí ca <Nhãn> phi nm cùng mt n nh vi lnh nhy JMP.
Ví d: Xét n lnh sau:
MOV AH, 1 ;Nhp mt kí t
INT 21h
CMP AL, ‘Z’ ;So sánh kí t va nhp vi ‘Z’
JA KetThuc ;Nu AL > ‘Z’ thì nhy ti nhãn KetThuc
;Các lnh khác
KetThuc:
MOV AH, 4Ch
INT 21h
n lnh trên ch thc hin c khi khong cách gia lnh JA và v trí t nhãn
KetThuc không quá 127 byte. Tuy nhiên, nu khong cách ó vt quá gii hn cho phép
thì ta có th khc phc bng phng pháp “nhy hai bc” nh lnh JMP (u tiên nhy
i mt “Nhãn trung gian”, sau ó mi nhy ti nhãn KetThuc):
MOV AH, 1 ;Nhp mt kí t
INT 21h
CMP AL, ‘Z’ ;So sánh kí t va nhp vi ‘Z’
JA NhanTrungGian ;Nu AL > ‘Z’ thì nhy ti NhanTrungGian
JMP TiepTuc
Bài ging hp ng Chng III: Các lnh nhy
28
NhanTrungGian:
JMP KetThuc
TiepTuc:
;Các lnh khác
KetThuc:
MOV AH, 4Ch
INT 21h
3.4 Mt sng dng ca lnh nhy
Khi lp trình vi các ngôn ng bc cao, ta ã rt quen thuc vi các cu trúc lnh r
nhánh (If, Case) và các cu trúc lp (For, While). Phn tip theo s trình bày cách thc s
ng lnh nhy gi lp các cu trúc bc cao ó.
3.4.1 Cu trúc r nhánh If
i vi cu trúc r nhánh thì v trí ca nhãn sng sau lnh nhy:
<Lnh nhy>
<Nhãn>
Ví d:
Nhp mt kí t t bàn phím, nu là kí t in thng thì i sang in hoa. Hin kí t ra
màn hình.
Thut toán nh sau:
• Nhp mt kí t KT
• IF (KT ‘z’) AND (KT ‘a’) THEN i KT sang in hoa
• Hin KT ra màn hình
Gii:
TITLE DOI KI TU
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AH, 1 ;Nhp mt kí t
INT 21h
CMP AL,
JA HienChu ;Nu AL > thì hin kí t ra màn hình
CMP AL,
JB HienChu ;Nu AL < thì hin kí t ra màn hình
SUB AL, 20h ;i kí t sang in hoa
HienChu:
Bài ging hp ng Chng III: Các lnh nhy
29
MOV AH, 2 ;Chc nng s 2: Hin kí t
MOV DL, AL
INT 21h
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
3.4.2 Cu trúc lp
a) Lp không bit trc s ln lp (While, Repeat)
i vi các cu trúc lp nói chung thì v trí ca nhãn sng trc lnh nhy:
<Nhãn>
<Lnh nhy>
Ví d:
Nhp mt kí t s t bàn phím (‘0’, ‘1’, , ‘9’), i nó sang s thp phân tng ng.
Thut toán nh sau:
REPEAT
Nhp mt kí t KT
UNTIL (KT ‘0’) AND (KT ‘9’)
i KT sang s thp phân
Gii:
TITLE VI DU LAP
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
NhapLai:
MOV AH, 1 ;Nhp mt kí t
INT 21h
CMP AL,
JB NhapLai ;Nu AL < thì nhp li
CMP AL,
JA NhapLai ;Nu AL > thì nhp li
SUB AL, 30h ;i sang s thp phân tng ng
;Các lnh khác
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
Bài ging hp ng Chng III: Các lnh nhy
30
END MAIN
Gii thích:
Kí t ‘0’ có mã ASCII bng 30h
Kí t ‘1’ có mã ASCII bng 31h
Kí t ‘9’ có mã ASCII bng 39h
i kí t s sang s thp phân tng ng, ta ly mã ASCII ca nó em tr cho 30h.
b) Lp vi s ln lp bit trc (For)
Ví d:
Hin ra màn hình 10 s nguyên theo th t: 0, 1, 2, 3, , 9.
Thut toán nh sau:
FOR I = 0 TO 9 DO <Hin I ra màn hình>
Gii:
TITLE VI DU LAP FOR
.MODEL SMALL
.STACK 100H
.DATA
I DB 0 ;Khi to giá tr bin I bng 0
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
Lap:
MOV DL, I
ADD DL,30h ;i s nguyên sang kí t s tng ng
MOV AH, 2 ;Chc nng s 2: Hin kí t
INT 21h
INC I ;Tng bin I lên 1
CMP I, 10
JNZ Lap ;Nu I 10 thì lp li
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
c) Lnh lp LOOP
ây là cu trúc lnh có sn trong hp ng thc hin các vòng lp bit trc s ln
p. Cách vit lnh nh sau:
MOV CX, <S ln lp>
NHANLAP:
Bài ging hp ng Chng III: Các lnh nhy
31
;Các lnh cn lp
LOOP NHANLAP
ln lp c t vào thanh ghi CX, sau mi ln lp thì CX c tng gim i 1.
Ta s s dng lnh này vit li chng trình trong phn b:
TITLE VI DU LAP LOOP
.MODEL SMALL
.STACK 100H
.DATA
I DB 0 ;Khi to giá tr bin I bng 0
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV CX, 10 ;S ln lp
Lap:
MOV DL, I
ADD DL,30h ;i s nguyên sang kí t s tng ng
MOV AH, 2 ;Chc nng s 2: Hin kí t
INT 21h
INC I ;Tng bin I lên 1
LOOP Lap
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN