2010-03-19 24 views
4

我有一個關於nasm及其與C++的鏈接的問題。我宣佈豆蔻測試功能nasm/yasm參數,與C++的鏈接

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

,我這樣稱呼它:

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++應用程序。在調試模式下,一切正常。該函數被調用幾次並按預期工作,而在釋放模式下該函數只工作一次,但隨後的編程操作失敗。在我看來,堆棧/幀指針是近/遠的,但我對這個主題很陌生,需要一點幫助。提前致謝! a。

回答

1

好吧,看來我必須通過push/pop保存ebx

0

可能會有所幫助:FLAC在彙編程序中使用了一些意圖由nasm編譯的源代碼。