深入探索函数调用中的栈使用与静态局部变量
1. 栈指针与局部变量区域
在系统调用中,系统V应用二进制接口规定栈指针必须处于16字节地址边界。编译器遵循此规则来分隔局部变量区域和参数保存区域。需要注意的是,红色区域是相对于栈指针 rsp 定义的,而变量和保存的参数则是相对于帧指针 rbp 进行访问。
2. 处理超过六个参数的情况
当调用函数需要向另一个函数传递超过六个参数时,前六个参数会按从左到右的顺序依次存放在 rdi 、 rsi 、 rdx 、 rcx 、 r8 和 r9 寄存器中,而超出的参数会被存放在调用栈上。这些额外的参数在调用之前会以8字节为单位从右到左压入栈中。由于子函数调用时返回地址会在参数之后压入栈,所以参数是直接从栈中读取,而不是弹出。
以下是一个示例代码,展示了如何传递九个参数给子函数:
/* sum9Ints.c
* Sums the integers 1 - 9.
*/
#include <stdio.h>
#include "addNine.h"
int main(void)
{
int total;
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int g =
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



