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