Встроенная сборка GCD не будет работать

Я писал простую программу на c ++, которая использует Assembly, чтобы взять GCD из 2 чисел и вывести их в качестве примера, используемого в учебнике, который я наблюдал. Я понимаю, что он делает, но я не понимаю, почему это не сработает.
РЕДАКТИРОВАТЬ: следует добавить, что когда он работает, он ничего не выводит вообще.

#include <iostream>
using namespace std;

int gcd(int a, int b)
{
int result;
_asm
{
push ebp
mov ebp, esp
mov eax, a
mov ebx, b
looptop:
cmp eax, 0
je goback
cmp eax, ebx
jge modulo
xchg eax, ebx
modulo:
idiv ebx
mov eax, edx
jmp looptop
goback:
mov eax, ebx
mov esp, ebp
pop ebp

mov result, edx
}

return result;
}

int main()
{
cout << gcd(46,90) << endl;
return 0;
}

Я использую его в 32-битной системе Windows, любая помощь будет признательна. При компиляции я получаю 4 ошибки:

warning C4731: 'gcd' : frame pointer register 'ebp' modified by inline assembly code
warning C4731: 'gcd' : frame pointer register 'ebp' modified by inline assembly code
warning C4731: 'main' : frame pointer register 'ebp' modified by inline assembly code
warning C4731: 'main' : frame pointer register 'ebp' modified by inline assembly code

3

Решение

Компилятор вставит вам эти или эквивалентные инструкции в начале и конце функции:

push ebp
mov ebp, esp
...
mov esp, ebp
pop ebp

Если вы добавите их вручную, вы не сможете получить доступ к параметрам функции через ebpИменно поэтому компилятор выдает предупреждения.

Удалите эти 4 инструкции.

Также начните использовать отладчик. Сегодня.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector