1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

8 273 1

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 8
Dung lượng 103,17 KB

Nội dung

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 . FFFEh. Nu coi ây là s không du thì AX = 65 534 , 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 (32 767 + 32 767 = -2 !), phép cng ã không còn chính xác do kt. 30 h ;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 30 h Kí. 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 = 32 767 Sau khi thc hin

Ngày đăng: 21/07/2014, 17:20

TỪ KHÓA LIÊN QUAN

w