我有以下装配线,但我不太理解:
...
AND EDX, 0x80000003
JGE SHORT prog.00401304
...
通常我总是在
JGE
指令之后看到 CMP
指令。CMP
我必须查看第一个操作数是否大于或等于第二个操作数。但对于和AND
,我不知道。
有人可以告诉我如何用
AND
指令来解释它吗?AND
执行 EDX
操作吗?然后呢?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)。
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 指令不会影响标志。
我希望这有帮助。
您应该查阅指令集参考。
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
。