又名:过程活动记录
一个栈帧,表示了一个函数的活动记录,可能包括该函数的 参数
返回地址
被保存的寄存器
局部变量
参数构造区
注:
(%rdi, %rsi, %rdx, %rcx, %r8, %r9)
%rdi
并不一定是第一个参数,原因在于,如果第一个参数是浮点数,那么使用的将是 %xmm0
寄存器,这样第二个参数才会顺延地使用 %rdi
寄存器。同理,%rsi
也不一定是第二个参数&
用于保存的寄存器:
%rsp
%rbp
%rsp
共同决定这个函数中的不定长栈帧的长度,因为如果只有 %rsp
的话,如果函数中有一个不定长数组 int a[n]
,那么无法知道这个变长数组的顶部在哪,除非有 %rbp
这个帧指针标记着如图所示:
对于栈操作 push pop 的等价操作:
下面引用了一篇csdn文章中的内容:
指令 | 效果 | 描述 |
---|---|---|
pushq S | %rsp ← %rsp - 8 | 将四字压入栈 |
(%rsp) ← S | ||
popq D | D ← (%rsp) | 将四字弹出栈 |
%rsp ← %rsp + 8 |
需要注意的点
subq $8, %rsp
与movq %rbp, (%rsp)
两条指令的合效果。movq (%rsp), %rax
与addq $8, %rsp
两条指令的合效果。