Assembly ASM和重复条件检查,为什么?
我已经反汇编了我的测试C程序,这是代码的一部分,我不确定我是否理解正确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
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
我想知道为什么我要称之为测试
。为什么我不能简单地用一个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