本文开发环境: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()调用的下一条语句。