Чтобы освободить место для двух переменных типа int.
Компилятору не нужно использовать стек для локальных переменных. В некоторых случаях он может даже полностью оптимизировать использование стека и хранить локальные переменные в регистрах.
Я помещаю в стек две локальные переменные: push dword ptr [n]. Но не должно ли это быть возможно, только если я использую инструкцию ввода, как это: введите 8,0.
Инструкция enter
делает полностью противоположной тому, что вы думаете, она делает:
Он не выделяет (стек) памяти, которая может использоваться push
инструкциями, но он использует (стек) памяти так же, как инструкция push
:
enter 80,0
работает как сначала enter 0,0
, а затем выполняет push
10 раз с 10 случайными значениями. Это полезно для «создания» 10 неинициализированных локальных переменных в стеке.
Как уже написано enter 0,0
, будет только push
и инициализируется регистр ebp
. Используя настоящий компилятор C с включенной оптимизацией, вы, вероятно, не получите инструкцию enter
в этом случае.
Если я пытаюсь это сделать, я получаю исключение StackOverflow.
Сложно сказать, почему:
Если вы вызываете свою функцию для большого числа, вашей функции потребуется много стека. Используя enter 8,0
вместо enter 0,0
, вам потребуется 8*n
байт стека для аргумента функции n
.
Если ваш стек уже почти "заполнен" при использовании enter 0,0
, он обязательно будет заполнен при использовании enter 8,0
.
Во-вторых, ваша разборка не завершена:
- Очевидно, компилятор C добавил некоторую оболочку с именем
_fibonacci2
(с подчеркиванием), расположенную по адресу 0C413BBh
.
- Разборка не показывает
n
как ebp+8
, но как n
.
Возможно, ошибка не видна в опубликованном вами коде:
- Может находиться в упаковке по адресу
0C413BBh
- или
n
не был правильно заменен (ebp+8
)