У меня есть такой кусок кода:
#include<stdio.h>
main()
{
xxx(1234);
}
int xxx(int b)
{
int c;
c=b;
return c;
}
Я использую gdb, чтобы показать, какое значение регистра ESP и как оно работает, установив точки останова в строках xxx(1234);
и c=b;
.
Запустите программу и остановитесь на первой точке останова, используйте i r esp
и x/x $esp
. Он показывает, что esp указывает, например: 0xbbbbefff, и этот адрес содержит разное значение, например: 0xbb33bb33. Перейдите ко второй точке останова. Я повторяю две команды выше, чтобы проверить, какое значение по адресу 0xbbbbefff показывает 0x000004d2 (1234 в десятичном виде).
Я знаю, что ESP указывает на вершину стека, тогда, если мы поместим значение в стек, оно переместится на нижний адрес и поместит значение в память по этому адресу. Например, если в первой точке останова ESP указывает на адрес 0xbbbbefff, то во второй точке останова ESP должен указывать где-то, например, на 0xbbbbefff-4=0xbbbbeffa и содержать 0x000004d2, в то время как память на 0xbbbbefff все еще содержит 0xbb33bb33. Но я увидел в gdb, что значение 0x000004d2 содержится в 0xbbbbefff (предыдущий верхний стек перед вызовом функции xxx).
Я неправильно понимаю стек?