Я читал о стеке вызовов, поэтому в качестве теста я попытался запустить программу, которая печатает стек вызовов текущей программы.Но я не могу понять некоторые ценности.Ниже вы можете увидеть мою маленькую тестовую программу.
#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?