我对汇编语言编程非常陌生,我目前正在尝试阅读从二进制文件生成的汇编语言.我跑过去了
test %eax,%eax
Run Code Online (Sandbox Code Playgroud)
或者test %rdi, %rdi等等.我很困惑这是做什么的.这些价值不%eax, %eax一样吗?什么是测试?我在某处读到它正在进行AND操作.....但由于它们是相同的值,它不会只返回%eax吗?
以下是我发现此用法的一个实例:
400e6e: 85 c0 test %eax,%eax
400e70: 74 05 je 400e77 <phase_1+0x23>
Run Code Online (Sandbox Code Playgroud)
je如果被比较的两个值相等,我认为跳跃......好吧,因为 %eax很好,本身,在什么情况下我们不会跳?
我是一般的编程初学者,所以如果有人能向我解释这一点,我会非常感激.谢谢!
我想了解一些装配.
汇编如下,我对该testl行感兴趣:
000319df 8b4508 movl 0x08(%ebp), %eax
000319e2 8b4004 movl 0x04(%eax), %eax
000319e5 85c0 testl %eax, %eax
000319e7 7407 je 0x000319f0
Run Code Online (Sandbox Code Playgroud)
我想了解的那点testl之间的%eax和%eax?我认为这段代码的具体内容并不重要,我只是试图用自己来理解测试 - 这种价值总是不正确吗?
使用以下代码是否存在任何执行速度差异:
cmp al, 0
je done
Run Code Online (Sandbox Code Playgroud)
以下内容:
or al, al
jz done
Run Code Online (Sandbox Code Playgroud)
我知道JE和JZ指令是相同的,并且使用OR可以提供一个字节的大小改进.但是,我也关心代码速度.逻辑运算符似乎比SUB或CMP更快,但我只是想确定.这可能是规模和速度之间的权衡,或双赢(当然代码将更加不透明).