上次做lab2的时候看到了
test %eax,%eax
je 400ef7
第一次看到这个代码的时候我下意识以为这就是jmp了,毕竟eax和eax比较当然相等辣。后来想想,编译器既然会生成这种代码肯定是有原因的。
我先在 Intel® 64 and IA-32 Architectures Software Developer’s Manual 中查到了这几个指令: je:
74 cb JE: Jump short if equal (ZF=1).
jne:
75 cb JNE: Jump short if not equal (ZF=0).
test:
Operation: TEMP ← SRC1 AND SRC2; SF ← MSB(TEMP); IF TEMP = 0 THEN ZF ← 1; ELSE ZF ← 0; FI: PF ← BitwiseXNOR(TEMP[0:7]); CF ← 0; OF ← 0; (* AF is undefined *)
可以看出test %eax %eax之后,ZF=(SRC1&SRC2==0)
由于SRC1和SRC2都是同一个eax,那么当eax==0时,ZF=1,触发JE;当eax!=0的时候,ZF=0,触发JNE。
所以这一段其实是等价于if(!eax) jmp 0x400ef7;
,而不是无条件跳转。