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