4

我有一个关于 nasm 及其与 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++ 应用程序。在调试模式下,一切正常。该函数被调用了几次并按预期工作,而在发布模式下该函数工作一次,但随后的程序操作失败。在我看来,近/远的堆栈/帧指针有问题,但我对这个主题很陌生,需要一点帮助。提前致谢!一个。

4

2 回答 2

1

好吧,看来我必须ebx通过推送/弹出来保存。

于 2010-03-19T21:05:59.580 回答
0

这可能会有所帮助:FLAC在汇编程序中使用了一些旨在由 nasm 编译的源代码。

于 2010-03-19T21:46:18.997 回答