我已经学习了几个月的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中执行它?