Значение стека вызовов в простой программе - PullRequest
1 голос
/ 04 апреля 2019

Я читал о стеке вызовов, поэтому в качестве теста я попытался запустить программу, которая печатает стек вызовов текущей программы.Но я не могу понять некоторые ценности.Ниже вы можете увидеть мою маленькую тестовую программу.

#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 - из моего понимания данных из переменной p.

Верны ли мои предположения и что означают строки 2 и 3?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...