简单程序中调用堆栈的含义

时间:2019-04-03 21:34:40

标签: c

我已经阅读了有关调用栈的信息,因此,作为测试,我试图运行一个打印当前程序的调用栈的程序。但是我无法理解某些价值观。在下面可以看到我的小型测试程序。

#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行是什么意思?

0 个答案:

没有答案