iha*_*tec 2 c assembly x86-64 compiler-optimization
我对汇编有一点了解。那么我先介绍一下代码,然后解释一下我的思路。
#This is the Assembly version.
pushq %rbp
movq %rsp, %rbp
movl $2, -4(%rbp)
movl $3, -8(%rbp)
movl $5, %eax
popq %rbp
ret
#This is the C version.
int twothree() {
int a = 2;
int b = 3;
return 2 + 3;
}
Run Code Online (Sandbox Code Playgroud)
好吧,首先让我吃惊的是我们没有将变量 a 和 b 用作 a + b。所以它们是不必要的,我们直接将整数相加。然而,如果计算机能够理解这一点,我想那将是非常可怕的。所以,我的问题是:在没有任何 addl 或类似命令的情况下,这个汇编代码是如何工作的?我们直接将立即数(或常量)整数 5 移至 eax 注册器。
另外,快速提问。那么最后两行之后的 a 和 b 变量会发生什么情况呢?它们在堆栈中的位置(或者也许我们可以将它们用作内存位置的“注册器”称为“注册器”)现在是空闲的,因为我们使用 malloc + free。这是真的还是至少合乎逻辑?我猜 popq %rbp 是关闭堆栈的命令。
正如我所说,我不是汇编专家。所以这些想法大部分都只是思考。谢谢!
编译器发现您正在添加两个数字2 + 3。编译器计算出2+3=5,并将5放入汇编代码中。这称为“不断折叠”。
我猜你已经在编译器中关闭了优化,因为它没有删除无用的变量a和b. 但是常量折叠对于编译器来说非常容易(与其他类型的优化不同)并且很有用,因此即使您没有打开优化,编译器似乎也会这样做。
正如您所发现的,汇编代码不会添加 2 和 3,因为没有addl或类似的命令。它只是return 5;
| 归档时间: |
|
| 查看次数: |
178 次 |
| 最近记录: |