Как esp регистр двигаться?

У меня есть такой кусок кода:

#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).

Я неправильно понимаю стек?


person user173717    schedule 15.02.2016    source источник
comment
Возможный дубликат x86, где указывает указатель стека?   -  person Cody Gray    schedule 30.12.2016