Assembly 條件
在彙編語言中的條件執行是通過幾個循環和分支指令。這些指令可以改變在程序的控制流。有條件的執行過程中觀察到兩種情況:
SN
條件說明
1
無條件跳轉
這是通過JMP指令。有條件的執行往往涉及控制權移交給一個指令的地址不遵循當前執行的指令。控制轉移可能會執行一組新的指令或向後,以便重新執行相同的步驟。
2
條件跳轉
這是由一組跳轉指令Ĵ<條件>視條件而定。條件指令控制轉移,打破了連續流程,他們這樣做是通過改變IP中的偏移值。
讓我們來討論CMP指令在討論條件指令之前。
CMP 指令
CMP指令比較兩個操作數。它通常用於在條件執行。該指令基本上減去一個操作數進行比較的操作數是否等於或不從其他。它不干擾源或目的操作數。它是用來爲決策的條件跳轉指令。
語法
CMP destination, source
CMP比較兩個數字數據字段。目的操作數可以是寄存器或內存中。源操作數可以是一個常數(立即)數據,寄存器或內存。
例子:
CMP DX, 00 ; Compare the DX value with zero
JE L7 ; If yes, then jump to label L7 . . L7: ...
CMP往往是用於比較的計數器值是否已經達到了一個循環的時間的數量需要運行。考慮以下典型條件:
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
無條件跳轉
正如前面提到的,這是在JMP指令執行。有條件的執行往往涉及控制權移交給一個指令的地址不遵循當前執行的指令。控制轉移可能會執行一組新的指令或向後,以便重新執行相同的步驟。
語法:
JMP指令立即傳送控制流提供了一個標籤名稱。 JMP指令的語法是:
JMP label
實例:
下面的代碼片段說明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
有條件跳轉
如果某些指定的條件跳轉條件滿足時,控制流程轉移到目標指令。有多個條件跳轉指令,根據條件和數據。
以下是條件跳轉指令用於有符號數據用於算術運算:
Instruction
Description
Flags tested
JE/JZ
Jump Equal or Jump Zero
ZF
JNE/JNZ
Jump not Equal or Jump Not Zero
ZF
JG/JNLE
Jump Greater or Jump Not Less/Equal
OF, SF, ZF
JGE/JNL
Jump Greater or Jump Not Less
OF, SF
JL/JNGE
Jump Less or Jump Not Greater/Equal
OF, SF
JLE/JNG
Jump Less/Equal or Jump Not Greater
OF, SF, ZF
以下是條件跳轉指令用於無符號數據用於進行邏輯運算:
Instruction
Description
Flags tested
JE/JZ
Jump Equal or Jump Zero
ZF
JNE/JNZ
Jump not Equal or Jump Not Zero
ZF
JA/JNBE
Jump Above or Jump Not Below/Equal
CF, ZF
JAE/JNB
Jump Above/Equal or Jump Not Below
CF
JB/JNAE
Jump Below or Jump Not Above/Equal
CF
JBE/JNA
Jump Below/Equal or Jump Not Above
AF, CF
下列條件跳轉指令有特殊的用途及檢查的標誌值:
Instruction
Description
Flags tested
JXCZ
Jump if CX is Zero
none
JC
Jump If Carry
CF
JNC
Jump If No Carry
CF
JO
Jump If Overflow
OF
JNO
Jump If No Overflow
OF
JP/JPE
Jump Parity or Jump Parity Even
PF
JNP/JPO
Jump No Parity or Jump Parity Odd
PF
JS
Jump Sign (negative value)
SF
JNS
Jump No Sign (positive value)
SF
在J<條件>的指令集的語法:
例如,
CMP AL, BL
JE EQUAL
CMP AL, BH
JE EQUAL
CMP AL, CL
JE EQUAL
NON_EQUAL: ... EQUAL: ...
實例:
下面的程序顯示的最大的三個變量。的變量均以兩位數變量。這三個變量num1, num2 和num3值分別爲47,72和31:
section .text global _start ;must be declared for using gcc
_start: ;tell linker entry yiibai
mov ecx, [num1] cmp ecx, [num2] jg check_third_num
mov ecx, [num3] 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
上面的代碼編譯和執行時,它會產生以下結果:
The largest digit is:
47