在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()调用的下一条语句。
- 在VDSP中使用FP取得函数的调用堆栈
- VDSP函数调用时的参数传递
- Throwable的使用--取得方法的调用堆栈
- 函数调用中堆栈
- C++ 中函数调用的堆栈过程
- 函数的调用堆栈
- 为什么要使用堆栈? sp和fp的解释
- 在linux代码中打印函数调用的堆栈的方法
- 在linux代码中打印函数调用的堆栈的方法
- 在linux kernel中打印函数调用的堆栈的方法
- 在Linux中打印函数调用堆栈(一)
- 问题:调用函数时,相关参数在堆栈中是如何存放的?
- 在VDSP中编译uclinux(1):不可能的任务?
- 在VDSP中编译uclinux(3):编译器的差异
- 在bfd中添加处理vdsp文件的target
- 在windows下使用eclipse编译VDSP工程的方法
- 在.NET中调用PL/SQL返回游标的取得
- 函数的调用及堆栈
- window.document.execCommand("SaveAs",false,id+".xls"); 在IE7下的问题
- 测试11111
- 机会比实力重要---但实力不够的时候,肯定会流失机会!
- 插入代码
- 方文山------周杰伦御用作词
- 在VDSP中使用FP取得函数的调用堆栈
- 扫雷游戏程序及源代码--c#
- vc7中的ClassWizard
- 年初12大热门技术 年底走势如何
- 基于 WindowsXP 的计算机和基于 Windows Server 2003 计算机上使用 ExecCommand 函数
- RemObject 服务器端自调用的方法
- 周杰伦《青花瓷》歌词欣赏-----方文山作词,周杰伦谱曲
- 大型软件开发与ORM构架
- 打印log