Blackfin系列DSP的栈特点

本文详细解析了函数调用过程中参数传递的方式及栈内存管理机制。介绍如何使用寄存器R0-R2来传递前三个参数,并说明了剩余参数如何在栈中布局。此外,还解释了CALL和LINK指令在子程序调用中的作用。

  假定函数原型:
  int test (int r0, int r1, int r2, int ext1);
  发生函数调用时,如:
  // ...
  test(a, b, c, d);
  // ...
  编译器会将局部变量a,b,c在函数调用附近分别处理到寄存器R0,R1,R2中,而更高的参量,如ext1,则顺次从字节地址SP+0xC位置开始存放。在执行CALL指令调用子程序的时候,堆栈寄存器FP和SP仍不发生变化,直到,执行LINK指令,寄存器将发生如下变化:
  1. [--SP] = RETS;
  2. [--SP] = FP;
  3. FP = SP;  // FP+0保存原FP,FP+4保存返回地址。
  4. SP += -n;  // 其中n为LINK指令的操作数,表示子程序栈的初始分配(用于局部变量)。
  在LINK指令之后可显式加入对寄存器保护性压栈的代码。局部变量的访问则通过SP或FP加相应偏移实现。
  这样,在子程序中,对前3个实参的访问,即通过寄存器进行,但在调用函数的栈中有占位(是调用函数侧的SP+0到SP+8,或被调用函数侧的FP+8到FP+0x10);而对其他实参,则从它的FP+0x14处顺次得到。所有实参的占位均集中于调用函数的栈的最高位置(地址最低)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值