調用堆棧的獲得:
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 }
若想得到函數名需要反查調試信息表。