在匯編語言中的條件執(zhí)行是通過幾個循環(huán)和分支指令。這些指令可以改變在程序的控制流。有條件的執(zhí)行過程中觀察到兩種情況:
SN | 條件說明 |
---|---|
1 |
無條件跳轉(zhuǎn) 這是通過JMP指令。有條件的執(zhí)行往往涉及控制權(quán)移交給一個指令的地址不遵循當前執(zhí)行的指令。控制轉(zhuǎn)移可能會執(zhí)行一組新的指令或向后,以便重新執(zhí)行相同的步驟。 |
2 |
條件跳轉(zhuǎn) 這是由一組跳轉(zhuǎn)指令?<條件>視條件而定。條件指令控制轉(zhuǎn)移,打破了連續(xù)流程,他們這樣做是通過改變IP中的偏移值。 |
讓我們來討論CMP指令在討論條件指令之前。
CMP指令比較兩個操作數(shù)。它通常用于在條件執(zhí)行。該指令基本上減去一個操作數(shù)進行比較的操作數(shù)是否等于或不從其他。它不干擾源或目的操作數(shù)。它是用來為決策的條件跳轉(zhuǎn)指令。
CMP destination, source
CMP比較兩個數(shù)字數(shù)據(jù)字段。目的操作數(shù)可以是寄存器或內(nèi)存中。源操作數(shù)可以是一個常數(shù)(立即)數(shù)據(jù),寄存器或內(nèi)存。
CMP DX, 00 ; Compare the DX value with zero JE L7 ; If yes, then jump to label L7 . . L7: ...
CMP往往是用于比較的計數(shù)器值是否已經(jīng)達到了一個循環(huán)的時間的數(shù)量需要運行??紤]以下典型條件:
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指令執(zhí)行。有條件的執(zhí)行往往涉及控制權(quán)移交給一個指令的地址不遵循當前執(zhí)行的指令??刂妻D(zhuǎn)移可能會執(zhí)行一組新的指令或向后,以便重新執(zhí)行相同的步驟。
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
如果某些指定的條件跳轉(zhuǎn)條件滿足時,控制流程轉(zhuǎn)移到目標指令。有多個條件跳轉(zhuǎn)指令,根據(jù)條件和數(shù)據(jù)。
以下是條件跳轉(zhuǎn)指令用于有符號數(shù)據(jù)用于算術(shù)運算:
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 |
以下是條件跳轉(zhuǎn)指令用于無符號數(shù)據(jù)用于進行邏輯運算:
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 |
下列條件跳轉(zhuǎn)指令有特殊的用途及檢查的標志值:
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: ...
下面的程序顯示的最大的三個變量。的變量均以兩位數(shù)變量。這三個變量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
上面的代碼編譯和執(zhí)行時,它會產(chǎn)生以下結(jié)果:
The largest digit is: 47