Я пишу отчет для суммирования стека. Если вы нажмете на мой профиль, вы увидите, что я делал это некоторое время. Прямо сейчас у меня есть некоторые проблемы, потому что на GDB это показывает мне нечто иное, чем на визуальной студии.
В результате я не слишком уверен в своем понимании базового указателя и указателя стека, и я надеюсь, что кто-то может привести меня в правильном направлении, если я ошибаюсь.
Для компьютера с архитектурой x86 стек обычно имеет тенденцию к снижению (с более высокого адреса памяти на более низкий).
Итак, когда начинается программа, мы вызывали основную функцию.
Как правило, при входе каждого вызова функции в текущем местоположении esp создается стек, и это то, что мы назвали «вершиной стека». Это правильно?
Когда старый ebp помещается в стек, он помещается туда, где был впервые указан esp?
После этого esp опустится вниз, чтобы указать на пустую ячейку памяти, это правильно?
Наконец, esp всегда меняется, перемещаясь вниз, указывая на следующий доступный объем памяти. Это правильно?
ESP перемещается на байт или на 4 байта вниз?
Я знаю, что есть много вопросов. Но спасибо за ваше время!
Спасибо за ответ, сэр!
@ iSciurus
Я запутался, как все определяют esp, указывая на самую последнюю запись, которая была помещена в стек.
Для x86, поскольку стек растет вниз, по вашему объяснению, esp сначала укажет на самый низкий адрес стека. Когда я смотрю на код сборки, у нас есть
0x080483f4 <+0>: push %ebp
0x080483f5 <+1>: mov %esp,%ebp
0x080483f7 <+3>: sub $0x10,%esp
Таким образом, esp уменьшается на 16 байтов. Так что это размер стека этого вызова функции. Локальные переменные появляются сразу после адреса возврата (ebp-4, ebp-8 и т. Д.). Так какова общая цель ESP здесь? Из того, что я понимаю, переполнение стека происходит, когда мы пытаемся получить доступ к адресу, который меньше этого.
Последнее: когда мы говорим о вершине стека, мы ссылаемся на самый низкий адрес (для x86).
Это картинка, которую я имею в виду (растет вниз)
[Parameter n ]
...
[Parameter 2 ]
[Parameter 1 ]
[Return Address ] 0x002CF744
[Previous EBP ] 0x002CF740 (current ebp)
[Local Variables ]
-- ESP
Извините за эти длинные вопросы. Но я очень ценю вашу помощь.