У меня есть вопрос о стеке - PullRequest
2 голосов
/ 02 сентября 2010

У меня есть задание для расчета GCD двух нет.используя фрейм стека и я пишу код для этого -

.text 

GCD:
     push ebp
     mov ebp,esp

1:   cmp ebx,eax
     je  3f

      ja 2f

      sub ebx,eax
      jmp 1b

2:    sub eax,ebx
      jmp 1b

3:    leave
      ret

Я получил ответ этого кода, но у меня есть вопрос, не занимая место в памяти, как [ebp+8] как программа работает или как эта программа выполняется?

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Используя соглашение о вызовах __fastcall, вы можете запросить параметры, передаваемые в регистрах. Это должно сделать даже ваши пролог функции (push ebp и т. Д.) И эпилог (оставить) избыточными, если только вы не создадите основанные на стеке переменные для использования позже.

Visual C ++ имеет одну реализацию __fastcall, но GCC также обрабатывает ее. См. этот документ для получения информации о соглашении о вызовах.

Только примечание - если назначение запрашивает у вас использование стекового фрейма, вам нужно будет использовать соглашения о вызовах __cdecl или __stdcall, чтобы получить параметры для расчета GCD из.

0 голосов
/ 02 сентября 2010

Ну, ваша функция на самом деле принимает аргументы в eax и ebx, а не использует аргументы, помещенные в стек. Если это не то, что вы хотите, поместите эти две инструкции после mov ebp, esp:

mov eax, [ebp + 8]
mov ebx, [ebp + 12]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...