gpt4 book ai didi

c - 你怎么能告诉计算机它正在添加而没有 addl 在程序集中

转载 作者:行者123 更新时间:2023-12-05 09:28:00 25 4
gpt4 key购买 nike

我对 Assembly 略知一二。那么我先介绍一下代码,再说说我的思路。

#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;
}

好吧,首先让我震惊的是我们没有将变量 a 和 b 用作 a + b。所以它们是不必要的,我们直接对整数求和。然而,如果计算机能够理解这一点,我想那将是非常可怕的。所以,我的问题是:这段汇编代码在没有任何 addl 或类似命令的情况下是如何工作的?我们直接将立即数(或常量)整数 5 移动到 eax 寄存器。

另外,快速提问。那么最后两行之后的 a 和 b 变量会发生什么变化呢?由于我们使用 malloc + free,它们在堆栈中的位置(或者我们可以称它们用作内存位置的“注册商”)现在是空闲的。这是真的还是至少是合乎逻辑的? popq %rbp 我猜是关闭堆栈的命令。

正如我所说,我不是 Assembly 专家。所以这些想法大部分都只是在想。谢谢!

最佳答案

编译器发现您将两个数字相加 2 + 3。编译器计算出 2+3=5 并将 5 放入汇编代码中。这称为“不断折叠”。

我猜你在编译器中关闭了优化,因为它没有删除无用的变量 ab。但是常量折叠对于编译器来说非常容易(与其他类型的优化不同)并且很有用,因此即使您没有打开优化,编译器似乎也在这样做。

如您所见,汇编代码不会将 2 和 3 相加,因为没有 addl 或类似的命令。它只是 return 5;

关于c - 你怎么能告诉计算机它正在添加而没有 addl 在程序集中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71831622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com