Tải bản đầy đủ (.pdf) (8 trang)

Bài giảng hợp ngữ - Chương 3 pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (103.17 KB, 8 trang )

Bài ging hp ng Chng III: Các lnh nhy
24
CHNG III: CÁC LNH NHY
3.1 Thanh ghi c và các c trng thái
Thanh ghi c dài 16 bít, mi bít c gi là mt c và có công dng riêng. Di ây là
 trí ca 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 thy b vi x lý 8086 mi s dng 9 bít ca thanh ghi c, sau ây là tên và chc
ng ca các c:
Bit Tên c Kí hiu
0 C nh (Carry Flag) CF
2 C chn l (Parity Flag) PF
4 C nh ph (Auxiliary Flag) AF
6 C Zero (Zero Flag) ZF
7 C du (Sign Flag) SF
11 C tràn (OverFlow Flag) OF
8 C by (Trap Flag) TF
9 C ngt (Interrupt Flag) IF
10 Cnh hng (Direction Flag) DF
Các c chia làm hai nhóm khác nhau: Nhóm c trng thái (gm 6 c: CF, PF, AF, ZF,
SF, OF) và nhóm cu khin (gm 3 c: TF, IF, DF). Trong chng này ta s tp trung
tìm hiu các c trng thái, còn các cu khin s trình bày sau.
Mi khi môt lnh trong chng trình c thc hin thì trng thái ca b vi x lý li
thay i, s thay i này c phn ánh trong các c trng thái.  hiu rõ hn vn 
này ta s xem xét mt vài c trng thái hay dùng nht.
3.1.1 C nh CF
Ví d: xét các lnh sau ây:
MOV AX, 0FFFFh
ADD AX, 1
Trc khi thc hin lnh ADD thì AX = FFFFh = 1111 1111 1111 1111b = 65535


Sau khi thc hin phép cng vi 1 thì AX bng bao nhiêu?
1111 1111 1111 1111b
+ 1
1 0000 0000 0000 0000b
Thanh ghi AX dài 16 bit nên sau lnh ADD thì AX = 0! Phép cng ã không còn chính
xác do kt qu vt quá phm vi cha ca AX (gi là hin tng tràn khi cng s không
u). Khi ó c CF c thit lp bng 1.
Nh vy, c CF sc thit lp khi thc hin phép cng có nh bít Msb hoc khi
thc hin phép tr có vay  bít Msb.
3.1.2 C Zero ZF
Ví d: xét các lnh sau ây:
Bài ging hp ng Chng III: Các lnh nhy
25
MOV CX, 2Ah
SUB CX, 2Ah
Sau khi thc hin lnh SUB thì CX = 0, c ZF c thit lp bng 1.
Nh vy, c ZF sc thit lp khi kt qu ca lnh va thc hin bng 0.
3.1.3 C tràn OF
Ví d: xét các lnh sau ây:
MOV AX, 7FFFh
ADD AX, 7FFFh
Trc khi thc hin lnh ADD thì AX = 7FFFh = 0111 1111 1111 1111b = 32767
Sau khi thc hin phép cng thì AX bng bao nhiêu?
0111 1111 1111 1111b
+ 0111 1111 1111 1111b
1111 1111 1111 1110b
Sau lnh ADD thì AX = FFFEh. Nu coi ây là s không du thì AX = 65534, không
có hin tng tràn, c CF = 0. Nhng nu coi ây là s có du thì AX = -2 (32767 +
32767 = -2!), phép cng ã không còn chính xác do kt qu vt quá phm vi cha ca
AX (gi là hin tng tràn khi cng s có du). Khi ó c OF c thit lp bng 1.

Nh vy, c OF sc thit lp khi xut hin hin tng tràn trong phép tính vi s
có du.
3.2 Các lnh nhy có u kin
3.2.1 Ví d
Xét chng trình hp ng sau:
TITLE Lenh nhay
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
NHAPLAI:
MOV AH, 1 ;Chc nng s 1: Nhp 1 kí t
INT 21h
CMP AL,  ;Kim tra kí t va nhp
JZ NHAPLAI

MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
Gii thích:
Chng trình trên s nhp mt kí t t bàn phím, kim tra xem ó có phi là kí t
khong trng ‘ ’ hay không, nu úng thì tin hành nhp li. Quá trình ó c thc hin
nh lnh so sánh CMP và lnh nhy JZ.
Bài ging hp ng Chng III: Các lnh nhy
26
a) Lnh CMP (Compare)
Cú pháp lnh:
CMP <ích>, <Ngun>
Lnh này có tác dng tng t lnh SUB, nó thc hin phép tr gia ích và Ngun.

 khác bit là  ch: ích không b thay i sau phép tr, ch có các c là thay i.
Ví d:
CMP AL, ‘ ’
Lnh trên s ly ni dung ca AL tr cho 20h (mã ASCII ca kí t khong trng). Nu
t qu mà bng 0, tc là AL = 20h (AL = ‘ ‘), thì c ZF sc thit lp bng 1. Trng
thái ca các c sc s dng làm u kin cho các lnh nhy.
b) Lnh nhy JZ
Lnh JZ là lnh nhy khi c ZF = 1 (Jump if Zero).
Cú pháp lnh:
JZ <Nhãn>
Trong chng trình trên, lnh JZ s kim tra c ZF, nu ZF = 1 thì s nhy ti nhãn
NHAPLAI, ngha là thc hin li các lnh nhp d liu.
3.2.2 Mt s lnh nhy
Có nhiu lnh nhy khác nhau ng vi trng thái khác nhau ca các c:
nh Chc nng u kin nhy
JC
JNC
JO
JNO
JS
JNS

Nhy nu có nh (Jump if Carry)
Nhy nu không nh (Jump if Not Carry)
Nhy nu tràn có du (Jump if OverFlow)
Nhy nu không tràn (Jump if Not OverFlow)
Nhy nu du âm (Jump if Sign)
Nhy nu du dng (Jump if Not Sign)

CF = 1

CF = 0
OF = 1
OF = 0
SF = 1
SF = 0

Vic kim tra trng thái ca các c khi s dng lnh nhy gây rt nhiu khó khn cho
ngi lp trình (do có quá nhiu lnh nhy, khó nh, không hp vi t duy thông
thng ).  khc phc u này, ngi ta thng s dng các lnh nhy kèm vi lnh
CMP theo quy tc sau:
CMP <ích>, <Ngun>
u kin nhy nh nhy không du Lnh nhy có du
ích > Ngun
ích < Ngun
ích = Ngun
ích  Ngun
ích  Ngun
ích  Ngun
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 vit tt:
A: Above (ln hn) = G: Greater than
B: Below (nh hn) = L: Less than
E: Equal (bng)
Bài ging hp ng Chng III: Các lnh nhy
27
N: Not (không)
Ví d:
JNA: Jump if Not Above = JBE: Jump if Below - Equal
Gii thích:
Trc mi lnh nhy cn dùng mt lnh CMP  to u kin nhy. Ngi lp trình
 cn c vào quan h gia <ích> và <Ngun>  la chn lnh nhy thích hp.
Ví d:
CMP AL, 5Ah
JA KetThuc ;Nu AL > 5Ah thì nhy ti nhãn KetThuc
Nu ích > Ngun: Ta có th s dng lnh nhy JA hoc JNBE (trong trng hp
ích và Ngun là s không du). Hai lnh này có tác dng ging ht nhau. Nu coi ích
và ngun là các s có du thì phi s dng lnh JG hoc JNLE.
3.3 Lnh nhy không u kin JMP
Các lnh nhy có u kin mà ta ã nghiên cu có mt nhc m là không th nhy
quá xa. Các lnh ó ch có th nhy ti mt nhãn ng trc nó không quá 126 byte hoc
ng sau không quá 127 byte.
 khc phc u này có th s dng lnh nhy không u kin JMP. Cú pháp lnh
nh sau:
JMP <Nhãn>
 trí ca <Nhãn> phi nm cùng mt n nh vi lnh nhy JMP.
Ví d: Xét n lnh sau:
MOV AH, 1 ;Nhp mt kí t
INT 21h
CMP AL, ‘Z’ ;So sánh kí t va nhp vi ‘Z’

JA KetThuc ;Nu AL > ‘Z’ thì nhy ti nhãn KetThuc
;Các lnh khác
KetThuc:
MOV AH, 4Ch
INT 21h
n lnh trên ch thc hin c khi khong cách gia lnh JA và v trí t nhãn
KetThuc không quá 127 byte. Tuy nhiên, nu khong cách ó vt quá gii hn cho phép
thì ta có th khc phc bng phng pháp “nhy hai bc” nh lnh JMP (u tiên nhy
i mt “Nhãn trung gian”, sau ó mi nhy ti nhãn KetThuc):
MOV AH, 1 ;Nhp mt kí t
INT 21h
CMP AL, ‘Z’ ;So sánh kí t va nhp vi ‘Z’
JA NhanTrungGian ;Nu AL > ‘Z’ thì nhy ti NhanTrungGian
JMP TiepTuc
Bài ging hp ng Chng III: Các lnh nhy
28
NhanTrungGian:
JMP KetThuc
TiepTuc:
;Các lnh khác
KetThuc:
MOV AH, 4Ch
INT 21h
3.4 Mt sng dng ca lnh nhy
Khi lp trình vi các ngôn ng bc cao, ta ã rt quen thuc vi các cu trúc lnh r
nhánh (If, Case) và các cu trúc lp (For, While). Phn tip theo s trình bày cách thc s
ng lnh nhy  gi lp các cu trúc bc cao ó.
3.4.1 Cu trúc r nhánh If
i vi cu trúc r nhánh thì v trí ca nhãn sng  sau lnh nhy:
<Lnh nhy>


<Nhãn>
Ví d:
Nhp mt kí t t bàn phím, nu là kí t in thng thì i sang in hoa. Hin kí t ra
màn hình.
Thut toán nh sau:
• Nhp mt kí t KT
• IF (KT  ‘z’) AND (KT  ‘a’) THEN i KT sang in hoa
• Hin KT ra màn hình
Gii:
TITLE DOI KI TU
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AH, 1 ;Nhp mt kí t
INT 21h
CMP AL, 
JA HienChu ;Nu AL >  thì hin kí t ra màn hình
CMP AL, 
JB HienChu ;Nu AL <  thì hin kí t ra màn hình
SUB AL, 20h ;i kí t sang in hoa
HienChu:
Bài ging hp ng Chng III: Các lnh nhy
29
MOV AH, 2 ;Chc nng s 2: Hin kí t
MOV DL, AL
INT 21h
MOV AH, 4Ch ;Kt thúc
INT 21h

MAIN ENDP
END MAIN
3.4.2 Cu trúc lp
a) Lp không bit trc s ln lp (While, Repeat)
i vi các cu trúc lp nói chung thì v trí ca nhãn sng  trc lnh nhy:
<Nhãn>

<Lnh nhy>
Ví d:
Nhp mt kí t s t bàn phím (‘0’, ‘1’, , ‘9’), i nó sang s thp phân tng ng.
Thut toán nh sau:
REPEAT
Nhp mt kí t KT
UNTIL (KT  ‘0’) AND (KT  ‘9’)
i KT sang s thp phân
Gii:
TITLE VI DU LAP
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
NhapLai:
MOV AH, 1 ;Nhp mt kí t
INT 21h
CMP AL, 
JB NhapLai ;Nu AL <  thì nhp li
CMP AL, 
JA NhapLai ;Nu AL >  thì nhp li
SUB AL, 30h ;i sang s thp phân tng ng
;Các lnh khác

MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
Bài ging hp ng Chng III: Các lnh nhy
30
END MAIN
Gii thích:
Kí t ‘0’ có mã ASCII bng 30h
Kí t ‘1’ có mã ASCII bng 31h

Kí t ‘9’ có mã ASCII bng 39h
i kí t s sang s thp phân tng ng, ta ly mã ASCII ca nó em tr cho 30h.
b) Lp vi s ln lp bit trc (For)
Ví d:
Hin ra màn hình 10 s nguyên theo th t: 0, 1, 2, 3, , 9.
Thut toán nh sau:
FOR I = 0 TO 9 DO <Hin I ra màn hình>
Gii:
TITLE VI DU LAP FOR
.MODEL SMALL
.STACK 100H
.DATA
I DB 0 ;Khi to giá tr bin I bng 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 tng ng

MOV AH, 2 ;Chc nng s 2: Hin kí t
INT 21h
INC I ;Tng bin I lên 1
CMP I, 10
JNZ Lap ;Nu I  10 thì lp li
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN
c) Lnh lp LOOP
ây là cu trúc lnh có sn trong hp ng thc hin các vòng lp bit trc s ln
p. Cách vit lnh nh sau:
MOV CX, <S ln lp>
NHANLAP:
Bài ging hp ng Chng III: Các lnh nhy
31
;Các lnh cn lp
LOOP NHANLAP
 ln lp c t vào thanh ghi CX, sau mi ln lp thì CX c tng gim i 1.
Ta s s dng lnh này  vit li chng trình trong phn b:
TITLE VI DU LAP LOOP
.MODEL SMALL
.STACK 100H
.DATA
I DB 0 ;Khi to giá tr bin I bng 0
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
MOV CX, 10 ;S ln lp

Lap:
MOV DL, I
ADD DL,30h ;i s nguyên sang kí t s tng ng
MOV AH, 2 ;Chc nng s 2: Hin kí t
INT 21h
INC I ;Tng bin I lên 1
LOOP Lap
MOV AH, 4Ch ;Kt thúc
INT 21h
MAIN ENDP
END MAIN

×