Blackfin系列DSP的栈特点
2007-04-02 10:13
260 查看
假定函数原型:
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处顺次得到。所有实参的占位均集中于调用函数的栈的最高位置(地址最低)。
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处顺次得到。所有实参的占位均集中于调用函数的栈的最高位置(地址最低)。
相关文章推荐
- Blackfin系列DSP的栈特点
- TI C6000系列DSP的片内总线架构、存储系统和外设
- Blackfin DSP(四):BF533 EBIU之SDRAM
- 写给TI 6000系列DSP初学者(原创)
- Blackfin DSP(七):用SPORT口模拟SPI
- TI C6000系列DSP之初始化变量
- 初见TIC66XX系列DSP——C6678
- Blackfin DSP(二):寄存器操作与GPIO
- blackfin DSP 处理器的事件(中断)管理
- TI DSP平台(Sitara系列ARM,ARM+DSP的Integra,Davinci DM系列)以及芯片应用手册开发指南
- TI C6000系列DSP的流水线介绍和软件流水优化
- 在stm32f1系列使用dsp库
- C6000系列之C6455DSP的GPIO模块
- TI-Davinci开发系列之四CCS5.2使用XDS560v2在线调试ARM/DSP程序
- CCS5连接调试C64X系列DSP核
- 写给TI 6000系列DSP初学者
- Blackfin DSP(三):BF533 的EBIU接口之flash
- Blackfin DSP(五):BF533的SPI接口
- TMS320C54x系列DSP的CPU与外设——第2章 TMS320C54x DSP体系结构总体介绍