Lệnh nhảy có điều kiện:

Một phần của tài liệu Tài liệu GIÁO TRÌNH LẬP TRÌNH HỆ THỐNG docx (Trang 67 - 70)

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

Một phần của tài liệu Tài liệu GIÁO TRÌNH LẬP TRÌNH HỆ THỐNG docx (Trang 67 - 70)