gpt4 book ai didi

c - 这些无用的 assembly 线从何而来?

转载 作者:行者123 更新时间:2023-11-30 14:31:46 25 4
gpt4 key购买 nike

我开始学习汇编,所以我使用命令 gcc -S file.c获取我的 C 代码的汇编版本。

一切工作正常,但我注意到当我输入一个简单的代码时,例如:

void    ft_return_strlen(char *str)
{
int a;

a = strlen(str);
return (a);
}

gcc -S file.c命令给了我这个:

_ft_return_strlen:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
movq %rdi, -8(%rbp)
movq -8(%rbp), %rdi
callq _ft_strlen
movl %eax, -12(%rbp)
movl -12(%rbp), %eax
addq $16, %rsp
popq %rbp
retq

即使这个函数没有用,为什么 gcc 给我这些行?

    movq    %rdi, -8(%rbp)
movq -8(%rbp), %rdi

它们不是没用吗?如果这些行真的没用,它们是来 self 的代码还是来自 gcc?有没有办法改善这个问题?

最佳答案

未优化时,编译器为变量 str 分配空间,即 -8(%rbp)。顶部的所有代码都是在寄存器 rbp 和 rsp 之间的堆栈上为局部变量留出一个空间。

函数调用将其放入寄存器 rdi 中,但调试器需要在名为 str 的变量中查看它。如果在调试器中您要更改变量 str,则需要将该新值作为 strlen 的参数复制回来。

同样的情况也发生在变量 a,-12(%rbp) 上,它必须从返回寄存器 rax 复制,然后复制回来以返回,以防万一您对其进行编辑在调试器中。

通过优化,变量将被完全丢弃,但调试器知道等效项位于寄存器中。在最大程度的优化下,整个函数可以被删除,或者用 jmp to strlen 替换,但是这样你就根本无法调试它了!

关于c - 这些无用的 assembly 线从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60119921/

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