如果C文件只有一个函数,为什么pushq和movq仍然存在于开头?

问题描述 投票:0回答:1

我已经学习了几个月的AT&T程序集,我发现很难在我的.s文件中包含一些重复的指令。特别是,

main:
pushq %rbp
movq %rsp, %rbp

从我是using的书中,我得出结论,pushq将调用函数的64位地址推送到调用堆栈,或保存它;而movq将%rsp寄存器中的值(我想它的地址)复制到%rbp寄存器。也就是说,它们都包含堆栈基址的地址。

此外,其他来源(感谢Govind)也很好地解释了这个问题:What is the purpose of the RBP register in x86_64 assembler?

我明白了,我已经知道pushq%rbp会保存调用者的帧指针或保存前一个堆栈帧的地址,但如果这是我在C程序中调用的唯一函数,那么“之前的堆栈帧”是什么呢?比如,在我的主函数调用之前存储在%rbp中的是什么?

例如,如果我的main函数调用一个名为foo()的函数,那么我的.S文件中的asm代码将是这样的:

foo:

pushq %rbp
movq %rsp, %rbp

#whatever instruction

ret

在这种情况下,我知道什么被推入%rbp(main中的调用指令的地址)。然后保存它是有意义的,因为我们需要返回主函数(w / ret)。但是,如果main是C中唯一的函数,为什么我们必须在main中执行它?

c x86-64 att
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.