调用堆栈的获得:
54:进入函数时,会调用 link a6 指令,将A6压栈,再将栈顶指针存入A6,退出函数做相反操作。
VC(debug):进入函数时,会调用 push ebp ;mov ebp, esp,同54原理。退出函数做相反操作。
以 VC 为例,说明调用堆栈的获得。
ebp-+ +--------------------+
| | . . . . . . |
| +--------------------+
+--- | sp1 |---+
+--------------------+ |
| pc1 | |
+--------------------+ |
| . . . . . . | |
+--------------------+ |
+--- | sp2 |---+
| +--------------------+
| | pc2 |
| +--------------------+
| | . . . . . . |
获得 pc 指针的操作:
1 void GetCallStack()
2 {
3 unsigned int reg_bp;
4 unsigned int pc;
5 __asm{
6 mov [reg_bp],ebp
7 };
8 unsigned int *pbp = (unsigned int *)reg_bp;
9 printf("Call stack:\n");
10 do{
11 pbp = (unsigned int *)(*pbp);
12 pc = *(pbp+1);
13 printf("\t 0x%08x\n",pc);
14 }while(pc);
15 }
若想得到函数名需要反查调试信息表。