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 . FFFEh. Nu coi ây là s không du thì AX = 65 534 , không có hin tng tràn, c CF = 0. Nhng nu coi ây là s có du thì AX = -2 (32 767 + 32 767 = -2 !), phép cng ã không còn chính xác do kt. 30 h ;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 30 h Kí. 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 = 32 767 Sau khi thc hin