Lệnh nhảy có điều kiện sẽ thực hiện việc nhảy đến nhãn hay không tùy thuộc vào điều kiện của lệnh nhảy. Lệnh nhảy có điều kiện chỉ nhảy trong phạm vi 128 byte. Muốn nhảy xa hơn, phải kết hợp với lệnh JMP.
Cú pháp tổng quát: Jxx Đích ; xx là các ký tự mô tả điều kiện
Đích: Immed, Reg, Mem
Ý nghĩa: Nếu điều kiện đúng thì nhảy tới thực hiện lệnh do toán hạng Đích, ngược lại
thì tiếp tục thi hành lệnh ngay sau lệnh nhảy.
Các lệnh nhảy có điều kiện được tạo ra bằng cách ghép chữ J (JUMP) với các chữ cái mô tả điều kiện để nhảy. Các điều kiện này thường được thiết lập thông qua trạng thái thanh ghi cờ. Bảng 6.1 trình bày các lệnh nhảy thường dùng.
Ví dụ: Lệnh JNE (Jump if Not Zero), nhảy nếu không bằng, điều kiện này đúng khi ZF = 0 (gọi là NZ).
Như vậy, giá trị các cờ trạng thái hiện tại là điều kiện để lệnh nhảy xem xét khi thi hành. Thông thường, lệnh so sánh (CMP) hay lệnh TEST được sử dụng để thiết lập điều kiện lệnh nhảy.
Lệnh so sánh:
Cú pháp: CMP Trái, Phải ; Cờ ← Trái – Phải
Nếu Trái > Phải ⇒ Trái - Phải > 0 : CF = 0 và ZF = 0 Nếu Trái < Phải ⇒ Trái - Phải < 0 : CF = 1 và ZF = 0 Nếu Trái = Phải ⇒ Trái - Phải = 0 : CF = 0 và ZF = 1
Trái, Phải: Immed, Reg, Mem
Bản chất của lệnh CMP là lệnh SUB (thực hiện phép tính Đích – Nguồn) nhưng kết quả của phép tính không được lưu vào Đích như trong lệnh SUB mà tính chất của kết quả được thể hiện thông qua cờ
Ví dụ: so sánh hai số nguyên dương
MOV AH, 1 ; AH ← 1 MOV AL, 2 ; AL ← 2
CMP AH, AL ; CF ← 1, ZF ← 0 vì AH < AL
Sau khi thực hiện các lệnh trên, cờ Carry bật (CF=1) nghĩa là AH < AL
Ví dụ: kiểm tra hai bit cuối cùng của AL
TEST AL, 3 ; 3h = 00000011b
Nếu cờ Zero bật (ZF=1), có nghĩa là hai bit 0 và 1 của AL đều bằng 0
Lệnh Ý Nghĩa Điều Kiện
JB JNAE JC
Nhảy nếu nhỏ hơn (Jump if Below) Nhảy nếu không lớn hơn hoặc bằng Nhảy nếu có nhớ
CF = 1 JAE
JNB JNC
Nhảy nếu lớn hơn hoặc bằng (Jump if Above or Equal) Nhảy nếu không nhỏ hơn
Nhảy nếu không có nhớ
CF = 0 JBE
JNA
Nhảy nếu nhỏ hơn hoặc bằng (Jump if Below or Equal)
Nhảy nếu không lớn hơn CF = 1 hay ZF = 1 JA
JNBE
Nhảy nếu lớn hơn (Jump if Above)
Nhảy nếu không nhỏ hơn hoặc bằng CF = 0 và ZF = 0 JE
JZ
Nhảy nếu bằng (Jump if Equal)
Nhảy nếu bằng (Jump if Zero) ZF = 1 JNE
JNZ
Nhảy nếu không bằng (Jump if Not Equal)
Nhảy nếu không bằng (Jump if Not Zero) ZF = 0 JL
JNGE
Nhảy nếu nhỏ hơn
Nhảy nếu không lớn hơn hoặc bằng SF ≠ OF JGE
JNL
Nhảy nếu lớn hơn
Nhảy nếu không nhỏ hơn SF = OF JLE
JNG
Nhảy nếu nhỏ hơn hay bằng
Nhảy nếu không lớn hơn ZF=1 và SF ≠ OF JG
JNLE
Nhảy nếu lớn hơn
Nhảy nếu không nhỏ hơn hay bằng ZF=0 và SF = OF JP
JPE
Nhảy nếu có bít kiểm chẳn lẽ
Nhảy nếu kiểm tra chẳn PF = 1
JNP JPO
Nhảy nếu không có bít kiểm chẳn lẽ
Nhảy nếu kiểm tra lẻ PF = 0
JS JNS JO JNO
Nhảy nếu có dấu
Nhảy nếu không có dấu Nhảy nếu có tràn
Nhảy nếu không có tràn
SF = 1 SF = 0 OF = 1 OF = 0
JCXZ Nhảy nếu CX = 0 CX = 0
Bảng 5.1: Các lệnh nhảy có điều kiện Ví dụ : MOV AX, 1000h ; AX=1000h
JZ NH ; Nếu AX=200h thì nhảy đến nhãn NH MOV CX, BX ; Nếu AX ≠ 200h thì thi hành các lệnh khác
NH: ADD AX, BX ; Vị trí nhảy đến được gắn nhãn NH
Khi sử dụng lệnh nhảy có điều kiện sau khi thực hiện phép so sánh, phải đặc biệt lưu ý toán hạng trong phép so sánh là số có dấu (signed) hay không có dấu (unsigned) để lựa chọn lệnh cho phù hợp.
Ví dụ: MOV AH, AL ; Giả sử AL = 128 CMP AH, 1
JGE Greater ; AH > 1 nhưng không nhảy ???? . . .
Greater: …….
Ví dụ: nếu AL là số nguyên không dấu thì đoạn chương trình ở trên phải sửa lại như
sau: MOV AH,AL CMP AH,1 JAE Greater . . . Greater: . . .
Ví dụ 5-1: Viết chương trình nhận 1 ký tự từ bàn phím, sau đó:
- Nếu ký tự nhận được là ‘C’ thì in ra: “Welcome to C!”
- Nếu ký tự nhận được là ‘A’ thì in ra: “Welcome to Assembly!” - Nếu là ký tự khác thì thoát khỏi chương trình.
DSEG SEGMENT
msg DB 10, 13, “Hay nhap 1 ky tu: $” msgC DB 10, 13, “Welcome to C!$”
msgA DB 10, 13, “Welcome to Assembly!$” DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG start: MOV AX, DSEG
MOV DS, AX MOV AH, 09h LEA DX, msg INT 21h MOV AH, 01h INT 21h CMP AL, ‘C’ JE in_C CMP AL, ‘A’ JE in_A JMP exit
in_C: MOV AH, 09h
LEA DX, msgC AL=‘C’? Nhận ký tự In msgA start Khởi động DS In msg ra MH in_C S S AL=‘A’? In msgC exit in_A Đ Đ
INT 21h JMP start
in_A: MOV AH, 09h
LEA DX, msgA
INT 21h
JMP start exit: MOV AH, 4Ch
INT 21h
CSEG ENDS
END start