2015-01-08 2 views
1

저는 C++과 nasm 어셈블리 atm의 간단한 조합을 쓰고 있는데 왜 결과가 "cout"의 내부와 외부와 다른지 이해하지 못합니다. 어쩌면 이것은 예외 일 수도 있지만 차이점을 알고 싶습니다. 도움이 필요합니다.C++에서 어셈블리로 인수를 전달합니다.

C++ PART

#include <iostream> 
#include <cstring> 
using namespace std; 
extern "C" unsigned int quot (unsigned int, unsigned int); 
extern "C" unsigned int remainder (unsigned int, unsigned int); 

int main() 
{ 
    unsigned int i=0, j=0, k=0; 
    cout << "Numbers 'x y'" << endl; 
    cin >> i >> j; 
    k = quot(i,j); 
    cout<< "Result: " <<k; 
    k = remainder(i,j); 
    cout <<" r. "<< k <<endl; 

    cout << "Result: "<<quot(i,j)<<" r. "<<remainder(i,j)<<endl; 

    return 0; 
} 

NASM quot 알림 기능과 거의 동일하다. 2 R : 유일한 차이점은

section .data 

section .text 
    global quot 

quot: 
    ; intro 
    push ebp   
    mov ebp,esp  

    xor edx, edx  
    mov eax, [ebp+8] 
    mov ebx,[ebp+12] 

    div ebx 

    ; DIFFERENCE: in remainder we have additionaly 
    ; mov eax, edx 

    mov esp,ebp 
    pop ebp 
    ret  

우리가 결과 기대 (12) (5) 입력의 결과 코드에 주석. 2 그러나 우리는 얻는다.

Result: 2 r. 2 
Result: 2 r. 5 

답변

1

당신은 당신의 ASM 기능 (http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl 참조) ebx의 값을 유지해야합니다. 호출 규칙을 위반하면 미묘한 충돌에서부터 충돌에 이르기까지 다양한 범위의 오류가 발생할 수 있습니다.

ebx 대신 ecx을 사용하거나 div dword ptr [ebp+12]을 시도하십시오.

관련 문제