我已经阅读了有关调用栈的信息,因此,作为测试,我试图运行一个打印当前程序的调用栈的程序。但是我无法理解某些价值观。在下面可以看到我的小型测试程序。
#include <stdio.h>
void foo(unsigned long *last_out_of_stack){
unsigned long first_out_of_stack = 0x3;
unsigned long *i;
int j = 1;
printf("Line: Address Value \n");
for(i = &first_out_of_stack; i <= last_out_of_stack; i++){
printf("%d: %p 0x%lx\n", j, i, *i);
j++;
}
}
int main(){
unsigned long p = 0x1;
foo(&p);
back:
printf("\n p: %p \n", &p);
printf(" back: %p \n", &&back);
return 0;
}
执行时将打印以下内容:
Line: Address Value
1: 0x7fffffffdd68 0x3
2: 0x7fffffffdd70 0x7fffffffdd70
3: 0x7fffffffdd78 0x1ac4447e35ba0000
4: 0x7fffffffdd80 0x7fffffffdda0
5: 0x7fffffffdd88 0x5555555547b0
6: 0x7fffffffdd90 0x1
p: 0x7fffffffdd90
back: 0x5555555547b0
行实际上意味着它以什么顺序存储在堆栈中。
第1行是first_out_of_stack
变量的数据,第4行是从我理解的上一个堆栈基指针(EBP)开始,第5行是从foo返回的地址,第6行是从我理解了变量{{ 1}}。
我的假设正确吗?第2行和第3行是什么意思?