Так, я отчасти смущен рисованием стекового фрейма для моего ассемблерного кода. У меня есть чувство, что я начал неправильно.
Вот то, что я получил до сих пор, но поскольку Вы видите, что я смущен на шаге 5, потому что я думаю, что мое начальное расположение является неправильным.
Можно ли сказать мне, где я пошел не так, как надо?
Я бы начал с диаграммы, которая показывала некоторое (полу-) произвольное количество пустого пространства на «вершине» стека, и, вероятно, отобразите EBP и ESP слева со стрелками, указывающими, куда они указывают. Я использовал сплошные стрелки для «указывает на» и пунктирные для перемещения данных (оглядываясь назад, возможно, лучше было бы это изменить).
Расстояние между текущим ebp (после захвата из esp) и y в данном случае действительно составляет 8 байтов, как у вас возвращаемый eip и значение предыдущего ebp в стеке. Ваша диаграмма верна, насколько я могу судить, хотя адреса слева более запутаны:)
Вы правы со своей диаграммой. Компилятор использует некоторые приемы оптимизации: первый вызов «вполне нормальный», действительно, параметр «f» помещается поверх стека. Второй вызов откладывается после очистки локального контекста (инструкция «leave»), а параметр ir функции «h» «переработан», чтобы содержать «2». Затем второй «вызов» для «f» становится простым «jmp», поскольку это самая последняя строка в вызывающей функции «h» (контекст «h» уже был отброшен командой «leave»).
Пока!