c++ - nasm/yasm 参数,与 C++ 的链接

标签 c++ external nasm calling-convention

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

最佳答案

好吧,看来我必须通过 push/pop 来保存 ebx

关于c++ - nasm/yasm 参数,与 C++ 的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2480322/

相关文章:

excel中的sql查询

c - 用汇编语言打印数组元素

assembly - FASM - 压缩 "buffer db 0, 0, 0, 0, 0, 0, ..."

c++ - Windows C/C++ 套接字编程

c++ - C 中的字符串连接问题

c++ - 您如何构造一个可能引发异常的对象?

具有多个环境的 Grails 外部配置(数据源)

grails - 名称为 “${appname}.log”的外部log4j的Grails无效

linux - 汇编代码程序发生段错误

c++ - 什么是连续数组?