2010-03-19 2 views
4

nasm과 C++에 대한 연결에 관한 질문이 있습니다. 나는nasm/yasm 인수, C++과의 연결

extern "C" void __cdecl myTest(byte i1, byte i2, int stride, int *width);

로 litte 테스트 함수를 선언하고 난 다음과 같이 호출 :

byte i1 = 1, i2 = 2; 
int stride = 3, width = 4; 
myTest(i1, i2, stride, &width); 

방법은 디버그 어셈블리에 역할을하고 스택 포인터를 가져 오는 데 사용되는 방법을 살펴 가지고 인수들. 그 이상으로 포인터 인자 값은 어떻게 작동하는지 알아 내기 위해 7로 설정되어야한다. 이것은 다음과 같이 구현됩니다

global _myTest 

_myTest: 
    mov  eax, [esp+4]  ; 1 
    mov  ebx, [esp+8]  ; 2 
    mov  ecx, dword [esp+16] ; width 
    mov  edx, dword [esp+12] ; stride 

    mov eax, dword [esp+16] 
    mov dword [eax], 7 

    ret 

컴파일

yasm -f win32 -g cv8 -m x86 -o "$(IntDir)\$(InputName).obj" "$(InputPath)" 

를 통해, 다음 C++ 응용 프로그램에 연결. 디버그 모드에서는 모든 것이 잘 동작합니다. 이 함수는 두 번 호출되며 예상대로 작동하지만 릴리스 모드에서는 함수가 한 번 작동하지만 이후의 programm 작업은 실패합니다. near/far라고하는 스택/프레임 포인터에 문제가있는 것처럼 보입니다.하지만이 주제에 익숙하지 않아 조금 도움이 필요합니다. 미리 감사드립니다! a.

답변

1

글쎄, 푸시/팝을 통해 ebx을 보존해야하는 것 같습니다.

0

이 내용이 도움이 될 수 있습니다. FLAC은 어셈블러에서 nasm에 의해 컴파일되도록 의도 된 일부 소스를 사용합니다.