Рисование стекового фрейма для сборки x86 - PullRequest
11 голосов
/ 18 марта 2010

Итак, я немного растерялся из-за рисования стекового фрейма для моего кода сборки. У меня такое чувство, что я начал неправильно.

Вот что я получил до сих пор, но, как вы можете видеть, я запутался на шаге 5, потому что я думаю, что мой первоначальный макет неправильный.

enter image description here enter image description here

Можете ли вы сказать мне, где я ошибся?

Ответы [ 4 ]

25 голосов
/ 18 марта 2010

Я думаю, что я бы начал с диаграммы, которая показала некоторое (полу) произвольное количество пустого пространства в верхней части стека, и, вероятно, показала бы EBP и ESP слева, со стрелками, чтобы показать, где они указываем на. Я использовал сплошные стрелки для «указывает на» и пунктир для перемещения данных (в ретроспективе, может быть, лучше изменить это).

alt text

2 голосов
/ 18 марта 2010

Расстояние между текущим ebp (как только оно получено из esp) и y в этом случае действительно составляет 8 байт, поскольку у вас есть возвращаемый eip и значение предыдущего ebp в стеке. Ваша диаграмма верна из того, что я могу сказать, хотя адреса левой руки более запутанны:)

1 голос
/ 30 ноября 2012

На диаграмме показаны параметры под адресом возврата, что на самом деле неверно.

Предполагая, что стек увеличивается по направлению к более низким адресам, если необходимо поместить параметры в стек, они располагаются по более высоким адресам по сравнению с обратным адресом.

0 голосов
/ 18 марта 2010

Вы правы со своей диаграммой. Компилятор использует некоторые приемы оптимизации: первый вызов «вполне нормальный», действительно, параметр «f» помещается поверх стека. Второй вызов откладывается после очистки локального контекста (инструкция «покинуть»), а параметр функции «h» ir «рециркулируется», чтобы содержать «2». Чем второй «вызов» в «f» становится простым «jmp», так как это самая последняя строка в вызывающей функции «h» (контекст «h» уже был отброшен «exit»). *

Bye!

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