27、深入探索函数调用中的栈使用与静态局部变量

深入探索函数调用中的栈使用与静态局部变量

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 = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值