簡體   English   中英

組裝中AND和JGE的組合

[英]Combination of AND and JGE in assembly

我有以下我不完全了解的裝配線:

...
AND EDX, 0x80000003
JGE SHORT prog.00401304
...

通常,我總是在CMP指令之后看到JGE指令。 對於CMP我必須查看第一個操作數是否大於或等於第二個操作數。 但是,使用AND ,我不知道。 有人可以告訴我如何使用AND指令解釋它嗎? 我應該在EDX上執行AND運算,值為0x80000003嗎? 接着? 偽C代碼語言的外觀如何?

and以以下方式修改flags (請參閱《英特爾®64和IA-32體系結構軟件開發人員手冊》合卷:1、2A,2B,2C,3A,3B和3C):

Flags Affected
The OF and CF flags are cleared; the SF, ZF, and PF flags are set according to
the result. The state of the AF flag is undefined.

jge意思是“如果大於或等於(SF = OF),則跳轉”,它與jnl同義。 請參閱Intel x86 JUMP快速參考

OF (溢出標志)始終清零(設置為零)之后and ,和jge跳躍時(SF = OF), jge之后and當跳躍SF被設置為零,即,當結果的最高位(這里edx設置為零),這意味着有符號結果為零或正整數(0..2147483647)。

您應該已經查閱了指令集參考。

JGE基於標志位進行操作,即: Jump if greater or equal (SF=OF) 好的,現在您需要弄清楚這些標志的值。 您轉到描述AND指令的操作的頁面AND然后看到: The OF and CF flags are cleared; the SF, ZF, and PF flags are set according to the result The OF and CF flags are cleared; the SF, ZF, and PF flags are set according to the result 0x80000003設置了最高位,因此在“ AND運算之后AND SF獲得了EDX的最高位(也稱為符號位)。 總而言之,如果EDX >= 0 ,則采用分支,因為SF = OF = 0

NRZ解釋說可以。 我將在該代碼中添加JGE等效於JNS。 產生這些匯編指令的一小段C代碼是:

test( ) {
    int i;
    i &= 0x80000003;
    if( i < 0 ) i = -i;
}

如果用

cl /c /FAs test.c

列表(部分)是:

; 2    :    int i;
; 3    :    i &= 0x80000003;
mov eax, DWORD PTR _i$[ebp]
and eax, -2147483645            ; 80000003H
mov DWORD PTR _i$[ebp], eax
; 4    :    if( i < 0 ) i = -i;
jge SHORT $LN2@test
mov ecx, DWORD PTR _i$[ebp]
neg ecx
mov DWORD PTR _i$[ebp], ecx

$LN2@test:

請記住,AND之后的MOV指令不會影響標志。

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM