装配中AND和JGE的组合

时间:2014-08-30 22:17:32

标签: assembly x86

我有以下装配线,我完全不明白:

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

通常我在JGE指令后总是看到CMP指令。 使用CMP我必须查看第一个操作数是大于还是等于第二个操作数。 但是和AND,我不知道。 有人可以告诉我如何用AND指令解释它吗? 我应该在AND上使用值0x80000003执行EDX操作吗?然后? 如何看待伪C代码语言?

3 个答案:

答案 0 :(得分:2)

and通过以下方式修改flags(请参阅英特尔®64和IA-32架构软件开发人员手册合并卷:1,2A,2B,2C,3A,3B和3C):< / p>

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 quick reference

OF之后始终清除(溢出标志){溢出标志}({1}},and在({SF = OF)之后跳过jge jge之后and 1}}当SF设置为零时跳转,也就是说,当结果的最高位(此处edx设置为零)时,这意味着有符号结果为零或正整数( 0..2147483647)。

答案 1 :(得分:0)

您应该参考指令集参考。

JGE基于标志位运行,即:Jump if greater or equal (SF=OF)。 好的,现在你需要弄清楚那些标志的价值。转到描述AND指令操作的页面,请参阅:The OF and CF flags are cleared; the SF, ZF, and PF flags are set according to the result0x80000003具有最高位设置,因此在AND操作SF获得EDX的最高位(也称为符号位)之后。总而言之,如果是EDX >= 0,则会采用分支,因为SF = OF = 0

答案 2 :(得分: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指令不会影响标志。

我希望这会有所帮助。