2010-03-19 25 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编译的源代码。