在組合語言中的條件執行是通過幾個迴圈和分支指令。這些指令可以改變在程式的控制流。有條件的執行過程中觀察到兩種情況:
SN | 條件說明 |
---|---|
1 |
無條件跳轉 這是通過JMP指令。有條件的執行往往涉及控制權移交給一個指令的地址不遵循當前執行的指令。控制轉移可能會執行一組新的指令或向後,以便重新執行相同的步驟。 |
2 |
條件跳轉 這是由一組跳轉指令?<條件>視條件而定。條件指令控制轉移,打破了連續流程,他們這樣做是通過改變IP中的偏移值。 |
讓我們來討論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