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

Assembly ASM和重复条件检查,为什么?,assembly,x86,disassembly,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

我已经反汇编了我的测试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
    ,否则,继续
  • Test==因此我已经知道它将返回
    1
    ,因为eax不可能等于
    0
    ,因为它会跳到
    00401146
    我想知道为什么我要称之为
    测试
    。为什么我不能简单地用一个
    jmp
    (无条件跳转)替换
    test
    jne
    ,而只有当
    eax
    等于
    1
    时,我们才能达到这个目的
  • 如果不是
    0
    (因此
    1
    ),则跳转到
    004011F4
    ——这将始终发生
  • 我们永远不会从这一点到达
    00401154
    (我们可以假设,在代码中一定有调用/跳转),这将引导我们到达
    00401154

  • 这是正确的还是有什么我没有正确理解的?

    这可能只是编译器对代码进行了糟糕的优化,但为了解释它所做的工作,在进行彻底检查时,它添加了按位“测试”,以查找除最初查找的1之外的任何其他值

    编译器已生成代码来评估EAX是0还是1,严格来说,没有其他值

    if(a==1){...}
    else if(a<>0){...}
    

    je
    如果
    eax=1
    ,然后
    test
    将给您一个
    eax>1
    true或
    eax==0
    false,然后用于
    jne
    或fall-through。。。此反汇编的C代码是什么样子的?如果eax==1,则序列cmp eax,1 | je 401240将跳转。除非代码中的其他地方跳转到401154,否则不需要xor eax,eax,因为唯一的方法是在文本eax,eax | jne 4011F4序列中的eax==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