Assembly - Điều kiện

Việc thực thi có điều kiện trong hợp ngữ được thực hiện bằng một số lệnh lặp và rẽ nhánh. Các hướng dẫn này có thể thay đổi luồng điều khiển trong một chương trình. Thực hiện có điều kiện được quan sát trong hai tình huống:

Sr.No. Hướng dẫn có điều kiện
1

Unconditional jump

Điều này được thực hiện bởi lệnh JMP. Thực thi có điều kiện thường liên quan đến việc chuyển quyền điều khiển đến địa chỉ của một lệnh không tuân theo lệnh đang thực thi. Việc chuyển giao quyền kiểm soát có thể được chuyển tiếp, để thực hiện một bộ hướng dẫn mới hoặc lùi lại, để thực hiện lại các bước tương tự.

2

Conditional jump

Điều này được thực hiện bởi một tập hợp các lệnh nhảy j <điều kiện> tùy thuộc vào điều kiện. Các lệnh có điều kiện chuyển điều khiển bằng cách ngắt dòng tuần tự và chúng thực hiện bằng cách thay đổi giá trị bù trong IP.

Chúng ta hãy thảo luận về lệnh CMP trước khi thảo luận về các lệnh có điều kiện.

Hướng dẫn CMP

Lệnh CMP so sánh hai toán hạng. Nó thường được sử dụng trong thực thi có điều kiện. Hướng dẫn này về cơ bản trừ một toán hạng với toán hạng kia để so sánh xem các toán hạng có bằng nhau hay không. Nó không làm phiền toán hạng đích hoặc nguồn. Nó được sử dụng cùng với lệnh nhảy có điều kiện để ra quyết định.

Cú pháp

CMP destination, source

CMP so sánh hai trường dữ liệu số. Toán hạng đích có thể nằm trong thanh ghi hoặc trong bộ nhớ. Toán hạng nguồn có thể là một dữ liệu, thanh ghi hoặc bộ nhớ không đổi (tức thời).

Thí dụ

CMP DX,	00  ; Compare the DX value with zero
JE  L7      ; If yes, then jump to label L7
.
.
L7: ...

CMP thường được sử dụng để so sánh xem giá trị bộ đếm có đạt đến số lần một vòng lặp cần được chạy hay không. Hãy xem xét điều kiện điển hình sau:

INC	EDX
CMP	EDX, 10	; Compares whether the counter has reached 10
JLE	LP1     ; If it is less than or equal to 10, then jump to LP1

Nhảy vô điều kiện

Như đã đề cập trước đó, điều này được thực hiện bởi lệnh JMP. Thực thi có điều kiện thường liên quan đến việc chuyển quyền điều khiển đến địa chỉ của một lệnh không tuân theo lệnh đang thực thi. Việc chuyển giao quyền kiểm soát có thể được chuyển tiếp, để thực hiện một bộ hướng dẫn mới hoặc lùi lại, để thực hiện lại các bước tương tự.

Cú pháp

Lệnh JMP cung cấp tên nhãn mà luồng điều khiển được chuyển ngay lập tức. Cú pháp của lệnh JMP là:

JMP	label

Thí dụ

Đoạn mã sau minh họa hướng dẫn JMP:

MOV  AX, 00    ; Initializing AX to 0
MOV  BX, 00    ; Initializing BX to 0
MOV  CX, 01    ; Initializing CX to 1
L20:
ADD  AX, 01    ; Increment AX
ADD  BX, AX    ; Add AX to BX
SHL  CX, 1     ; shift left CX, this in turn doubles the CX value
JMP  L20       ; repeats the statements

Nhảy có điều kiện

Nếu một số điều kiện cụ thể được thỏa mãn trong bước nhảy có điều kiện, thì luồng điều khiển được chuyển đến một lệnh đích. Có rất nhiều lệnh nhảy có điều kiện tùy thuộc vào điều kiện và dữ liệu.

Sau đây là các hướng dẫn nhảy có điều kiện được sử dụng trên dữ liệu có dấu được sử dụng cho các phép toán số học:

Chỉ dẫn Sự miêu tả Cờ đã được kiểm tra
JE / JZ Nhảy bằng hoặc nhảy bằng không ZF
JNE / JNZ Nhảy không bằng hoặc nhảy không bằng 0 ZF
JG / JNLE Nhảy lớn hơn hoặc nhảy không ít / bằng OF, SF, ZF
JGE / JNL Nhảy lớn hơn / bằng hoặc nhảy không ít OF, SF
JL / JNGE Nhảy ít hơn hoặc nhảy không lớn hơn / bằng OF, SF
JLE / JNG Nhảy ít hơn / bằng hoặc nhảy không lớn hơn OF, SF, ZF

Sau đây là các hướng dẫn nhảy có điều kiện được sử dụng trên dữ liệu không dấu được sử dụng cho các phép toán logic:

Chỉ dẫn Sự miêu tả Cờ đã được kiểm tra
JE / JZ Nhảy bằng hoặc nhảy bằng không ZF
JNE / JNZ Nhảy không bằng hoặc nhảy không bằng 0 ZF
JA / JNBE Nhảy lên trên hoặc nhảy không xuống dưới / Bằng CF, ZF
JAE / JNB Nhảy lên trên / bằng hoặc không nhảy xuống dưới CF
JB / JNAE Nhảy xuống dưới hoặc Nhảy không trên / Bằng CF
JBE / JNA Nhảy xuống dưới / Bằng hoặc Nhảy không lên trên AF, CF

Các lệnh nhảy có điều kiện sau đây có công dụng đặc biệt và kiểm tra giá trị của các cờ:

Chỉ dẫn Sự miêu tả Cờ đã được kiểm tra
JXCZ Nhảy nếu CX bằng 0 không ai
JC Nhảy nếu mang CF
JNC Nhảy nếu không mang CF
JO Nhảy nếu tràn CỦA
JNO Nhảy nếu không có tràn CỦA
JP / JPE Nhảy chẵn lẻ hoặc nhảy chẵn lẻ PF
JNP / JPO Nhảy không chẵn lẻ hoặc nhảy chẵn lẻ lẻ PF
JS Dấu nhảy (giá trị âm) SF
JNS Nhảy không có dấu (giá trị dương) SF

Cú pháp cho tập lệnh J <condition> -

Thí dụ,

CMP	AL, BL
JE	EQUAL
CMP	AL, BH
JE	EQUAL
CMP	AL, CL
JE	EQUAL
NON_EQUAL: ...
EQUAL: ...

Thí dụ

Chương trình sau đây hiển thị biến lớn nhất trong ba biến. Các biến là các biến có hai chữ số. Ba biến num1, num2 và num3 lần lượt có các giá trị 47, 22 và 31 -

section	.text
   global _start         ;must be declared for using gcc

_start:	                 ;tell linker entry point
   mov   ecx, [num1]
   cmp   ecx, [num2]
   jg    check_third_num
   mov   ecx, [num2]
   
	check_third_num:

   cmp   ecx, [num3]
   jg    _exit
   mov   ecx, [num3]
   
	_exit:
   
   mov   [largest], ecx
   mov   ecx,msg
   mov   edx, len
   mov   ebx,1	;file descriptor (stdout)
   mov   eax,4	;system call number (sys_write)
   int   0x80	;call kernel
	
   mov   ecx,largest
   mov   edx, 2
   mov   ebx,1	;file descriptor (stdout)
   mov   eax,4	;system call number (sys_write)
   int   0x80	;call kernel
    
   mov   eax, 1
   int   80h

section	.data
   
   msg db "The largest digit is: ", 0xA,0xD 
   len equ $- msg 
   num1 dd '47'
   num2 dd '22'
   num3 dd '31'

segment .bss
   largest resb 2

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

The largest digit is: 
47