Я писал простую программу на 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
Компилятор вставит вам эти или эквивалентные инструкции в начале и конце функции:
push ebp
mov ebp, esp
...
mov esp, ebp
pop ebp
Если вы добавите их вручную, вы не сможете получить доступ к параметрам функции через ebp
Именно поэтому компилятор выдает предупреждения.
Удалите эти 4 инструкции.
Также начните использовать отладчик. Сегодня.
Других решений пока нет …