[英]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.