在线二区人妖系列_国产亚洲欧美日韩在线一区_国产一级婬片视频免费看_精品少妇一区二区三区在线

鍍金池/ 教程/ Java/ Assembly 條件
Assembly 變量聲明
Assembly匯編 STOS指令
Assembly 條件
Assembly 尋址模式和MOV指令
Assembly匯編教程
Assembly - 什么是匯編語(yǔ)言
Assembly 循環(huán)
Assembly 內(nèi)存段
Assembly匯編 宏
Assembly 寄存器
Assembly匯編 遞歸
Assembly匯編 CMPS指令
Assembly匯編 內(nèi)存管理
Assembly匯編 LODS指令
Assembly 基本語(yǔ)法
Assembly匯編 過(guò)程
Assembly匯編 文件管理
Assembly匯編 數(shù)組
Assembly匯編 SCAS指令
Assembly 算術(shù)指令
Assembly 環(huán)境設(shè)置
Assembly匯編 字符串處理
Assembly 數(shù)字
Assembly 常量
Assembly匯編 MOVS指令
Assembly 邏輯指令
Assembly 系統(tǒng)調(diào)用

Assembly 條件

在匯編語(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 指令

CMP指令比較兩個(gè)操作數(shù)。它通常用于在條件執(zhí)行。該指令基本上減去一個(gè)操作數(shù)進(jìn)行比較的操作數(shù)是否等于或不從其他。它不干擾源或目的操作數(shù)。它是用來(lái)為決策的條件跳轉(zhuǎn)指令。

語(yǔ)法

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

無(wú)條件跳轉(zhuǎn)

正如前面提到的,這是在JMP指令執(zhí)行。有條件的執(zhí)行往往涉及控制權(quán)移交給一個(gè)指令的地址不遵循當(dāng)前執(zhí)行的指令??刂妻D(zhuǎn)移可能會(huì)執(zhí)行一組新的指令或向后,以便重新執(zhí)行相同的步驟。

語(yǔ)法:

JMP指令立即傳送控制流提供了一個(gè)標(biāo)簽名稱。 JMP指令的語(yǔ)法是:

JMP	label

實(shí)例:

下面的代碼片段說(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)

如果某些指定的條件跳轉(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: ...

實(shí)例:

下面的程序顯示的最大的三個(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