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