我已经反汇编了我的测试C程序,这是代码的一部分我不确定我是否理解正确。
00401143: 83 F8 01 cmp eax,1
00401146: 0F 84 F4 00 00 00 je 00401240
0040114C: 85 C0 test eax,eax
0040114E: 0F 85 A0 00 00 00 jne 004011F4
00401154: 31 C0 xor eax,eax
基本上,这就是我的理解:
eax
是否等于1
,如果是,则返回0
0
,请跳至00401240
,如果没有,请继续1
因为eax不能等于0
,因为它会跳到00401146
。 我想知道我为什么要打电话给test
。为什么我不能简单地将test
和 jne
替换为单jmp
(非条件跳转),只有eax
等于无论如何1
。0
(因此1
),请跳至004011F4
- 这将始终发生00401154
(我们可以假定必须有调用/跳转)代码中的某个位置,这会将我们导航到00401154
这是正确的还是我还没有正确理解的东西?
答案 0 :(得分:0)
这很可能只是编译器对代码进行了严格优化的代码,但为了解释它所做的事情,在彻底的时候,它添加了按位“测试”来寻找除了你最初寻找的1之外的任何其他值。
编译器生成的代码用于评估EAX是0还是1,严格来说没有其他值。
if(a==1){...}
else if(a<>0){...}
...
00401143: 83 F8 01 cmp eax,1 ...EAX is 1?
00401146: 0F 84 F4 00 00 00 je 00401240 ...EAX is 1...
0040114C: 85 C0 test eax,eax ...EAX is strictly 0? (eax & eax)
0040114E: 0F 85 A0 00 00 00 jne 004011F4 ...EAX is another value