繁体   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