gpt4 book ai didi

c - 此汇编代码中的 "2+2"在哪里(由 gcc 从 C 翻译而来)

转载 作者:太空狗 更新时间:2023-10-29 15:09:57 24 4
gpt4 key购买 nike

我写了这个简单的 C 代码

int main()
{
int calc = 2+2;
return 0;
}

我想看看它在汇编中的样子,所以我使用 gcc

编译了它
$ gcc -S -o asm.s test.c

结果是大约 65 行(Mac OS X 10.8.3),我只发现这些是相关的:

enter image description here

在这段代码中,我在哪里可以找到我的 2+2

编辑:

问题的一部分没有得到解决。

如果 %rbp, %rsp, %eax 是变量,在这种情况下它们的值是多少?

最佳答案

你得到的几乎所有代码都只是无用的堆栈操作。通过对 (gcc -S -O2 test.c) 的优化,您将得到类似于

main:
.LFB0:
.cfi_startproc
xorl %eax, %eax
ret
.cfi_endproc
.LFE0:

忽略以点开头或以冒号结尾的每一行:只有两条汇编指令:

    xorl %eax, %eax
ret

并且它们编码return 0;。 (将寄存器与自身进行异或运算将其设置为全零。函数返回值根据 x86 ABI 进入寄存器 %eax。)与 int calc = 2+2 相关的一切; 已被丢弃为未使用。

如果您将代码更改为

int main(void) { return 2+2; }

你会得到

    movl $4, %eax
ret

其中 4 来自编译器本身进行加法运算,而不是让生成的程序进行加法运算(这称为 constant folding)。

也许更有趣的是,如果您将代码更改为

int main(int argc, char **argv) { return argc + 2; }

然后你得到

    leal    2(%rdi), %eax
ret

它在运行时做一些真正的工作!在 64 位 ELF ABI 中,%rdi 保存函数的第一个参数,在本例中为 argcleal 2(%rdi), %eax 是“%eax = %edi + 2”的 x86 汇编语言,这样做主要是因为更熟悉的 add 指令只有两个参数,所以你不能用它把 2 加到 %rdi 并将结果放入 %eax 全部在一条指令中. (暂时忽略 %rdi%edi 之间的区别。)

关于c - 此汇编代码中的 "2+2"在哪里(由 gcc 从 C 翻译而来),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18833862/

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