DSP

Blackfin系列DSP的栈特点

2019-07-13 17:11发布

  假定函数原型:
  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处顺次得到。所有实参的占位均集中于调用函数的栈的最高位置(地址最低)。