AND和JGE在汇编中的组合

问题描述 投票:0回答:3

我有以下装配线,但我不太理解:

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

通常我总是在

JGE
指令之后看到
CMP
指令。
使用
CMP
我必须查看第一个操作数是否大于或等于第二个操作数。但对于和
AND
,我不知道。

有人可以告诉我如何用

AND
指令来解释它吗?
我应该对值为 0x80000003 的
AND
执行
EDX
操作吗?然后呢?
它在伪 C 代码语言中看起来怎么样?

assembly x86 eflags
3个回答
2
投票

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
同义。请参阅英特尔 x86 JUMP 快速参考

由于

OF
(溢出标志)总是在
and
之后被清除(设置为零),并且当(SF=OF)时
jge
跳转,当
jge
设置为零时,
and
跳转后的
SF
,即当结果的最高位(这里
edx
设置为零)时,表示带符号的结果为零或正整数(0..2147483647)。


1
投票

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 指令不会影响标志。

我希望这有帮助。


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 result
0x80000003
设置了最高位,因此在
AND
操作之后,
SF
得到
EDX
的最高位(也称为符号位)。总而言之,如果
EDX >= 0
则取分支,因为那么
SF
=
OF
=
0

© www.soinside.com 2019 - 2024. All rights reserved.