ASM和重复条件检查,为什么?

时间:2014-03-04 20:27:05

标签: assembly x86 disassembly

我已经反汇编了我的测试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

基本上,这就是我的理解:

  1. 检查eax是否等于1,如果是,则返回0
  2. 如果0,请跳至00401240,如果没有,请继续
  3. 测试==因此我已经知道它将返回1因为eax不能等于0,因为它会跳到00401146我想知道我为什么要打电话给test。为什么我不能简单地将test jne替换为单jmp(非条件跳转),只有eax等于无论如何1
  4. 如果不是0(因此1),请跳至004011F4 - 这将始终发生
  5. 从这一点开始,我们永远不会达到00401154(我们可以假定必须有调用/跳转)代码中的某个位置,这会将我们导航到00401154
  6. 这是正确的还是我还没有正确理解的东西?

1 个答案:

答案 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