2012-10-16 4 views
3

저는 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 
+0

이들은 오류가 아니며 경고입니다. 하지만 당신이 뭘하는지 알지 못한다면 ebp/esp을 사용해서는 안됩니다. 두 레지스터를 다루는 줄을 제거하십시오. (기술적으로, ['__declspec (naked)'] (http://msdn.microsoft.com/en-us/library/h5w10wxs.aspx)를 대신 함수 선언에 추가 할 수는 있지만 그렇게하지 마십시오. 고급.) – DCoder

+0

오, 왜 그것이 실행되지 않습니다 설명하지 않습니다. – user1749737

+0

코드가'edx'를'0'으로 만들거나'a'를 0으로 시작하는 경우에만'goback'에 도달합니다 (이 경우에는'edx'를 0으로 초기화해야합니다.), 항상 0을 반환합니다 – DCoder

답변

3
는 함수의 시작과 끝에 당신이 또는 이에 상응하는 지침을 삽입합니다 컴파일러

:

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

당신이 수동으로 추가하는 경우, 당신은 '원 컴파일러가 경고를 발행하는 이유는 ebp을 통해 함수의 매개 변수에 액세스 할 수 있어야합니다.

이 4 가지 지침을 제거하십시오.

또한 디버거를 사용하십시오. 오늘.

+0

시도해 보니 gcdTest.exe의 "0x0040153b에서 처리되지 않은 예외가 발생했습니다 : 0xC0000095 : 정수 오버플로" 오류. – user1749737

+1

디버거를 사용하십시오. –

+0

제 생각에'edx'는'idiv' 전에 초기화되지 않았고 초기화하려면'cdx' 명령으로'eax'를'edx'로 부호 확장해야합니다. –

관련 문제