我有以下装配线,我完全不明白:
...
AND EDX, 0x80000003
JGE SHORT prog.00401304
...
通常我在JGE
指令后总是看到CMP
指令。
使用CMP
我必须查看第一个操作数是大于还是等于第二个操作数。
但是和AND
,我不知道。
有人可以告诉我如何用AND
指令解释它吗?
我应该在AND
上使用值0x80000003执行EDX
操作吗?然后?
如何看待伪C代码语言?
答案 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 result
。 0x80000003
具有最高位设置,因此在AND
操作SF
获得EDX
的最高位(也称为符号位)之后。总而言之,如果是EDX >= 0
,则会采用分支,因为SF
= OF
= 0
。
答案 2 :(得分:0)
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指令不会影响标志。
我希望这会有所帮助。