在VDSP中使用FP取得函数的调用堆栈

来源:互联网 发布:局域网桌面监视软件 编辑:程序博客网 时间:2024/05/16 00:29
 
   
本文开发环境:VDSP 5.0, bf561
在GCC中有一个内建函数__builtin_return_address (LEVEL),用于向上取得调用函数的返回地址。在VDSP中无此函数,但是可以用FP指针来达到相同的目的。
在VDSP的C函数中,通常第一条汇编指令就是
LINK 0x0; // 此处数字可变
这条指令做了如下工作:
[--SP] = RETS;
[--SP] = FP;
FP = SP;
SP += -n;
也就是说,在每个函数的开头,首先都保存了本函数的返回地址,同时还保存了上一个调用函数的FP指针。实际上就相当于把函数的返回地址用一个单链表链接起来,只要顺着这个链表往上找,自然就可以找出调用函数的返回地址了。
示例:
 
#define LEVEL 3
 
void s3(void)
{
       unsigned int fp, rts;
       int i;
       asm("%0 = FP;" : "=d"(fp));
       for(i = 0; i < LEVEL; i++)
       {
              rts = *(unsigned int*)(fp + 4);
              fp = *(unsigned int*)fp;
       }
       printf("rts: 0x%x", rts);
}
 
void s2(void)
{
       s3();
}
 
 
void s1(void)
{
       s2();
}
 
 
int main( int argc, char *argv[] )
{
       s1();
       return 0;
}
输出的结果为:
rts: 0xffa014ba
也就是指向main函数中的s1()调用的下一条语句。
 
原创粉丝点击