저는 Assembly를 사용하여 2 자리 숫자의 GCD를 취하여 내가 본 튜토리얼에서 사용한 예제로 출력하는 간단한 C++ 프로그램을 작성했습니다. 나는 그것이 무엇을 하는지를 이해하지만 그것이 왜 효과가 없는지 이해하지 못합니다. EDIT : 실행시 아무 것도 출력하지 않습니다.인라인 어셈블리 GCD가 작동하지 않습니다.
#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
이들은 오류가 아니며 경고입니다. 하지만 당신이 뭘하는지 알지 못한다면 ebp/esp을 사용해서는 안됩니다. 두 레지스터를 다루는 줄을 제거하십시오. (기술적으로, ['__declspec (naked)'] (http://msdn.microsoft.com/en-us/library/h5w10wxs.aspx)를 대신 함수 선언에 추가 할 수는 있지만 그렇게하지 마십시오. 고급.) – DCoder
오, 왜 그것이 실행되지 않습니다 설명하지 않습니다. – user1749737
코드가'edx'를'0'으로 만들거나'a'를 0으로 시작하는 경우에만'goback'에 도달합니다 (이 경우에는'edx'를 0으로 초기화해야합니다.), 항상 0을 반환합니다 – DCoder