【问题标题】:nasm application crash after printfprintf 后 nasm 应用程序崩溃
【发布时间】:2023-12-27 06:29:02
【问题描述】:

非常简单的带有 nasm 的 Hello World。我成功地将它与nasm.exe main.asm -f win32 -o main.obj 组装在一起并将其与gcc.exe -fno-use-linker-plugin -o main.obj output.exe 链接起来
它运行正常,它在屏幕上打印,然后程序崩溃(output.exe has stopped working)。似乎我在堆栈上做了一些东西,但我找不到错误。如果我在堆栈上传递参数(stdcall)可以吗?它应该,因为它打印正常但是..

这是代码

section .data
    msg db "Hello, world!", 0

section .text
    global _main
    extern _printf
_main:

    push msg
    call _printf

    xor eax, eax
    ret

平台:win8.1 x64,Intel CPU,NASM 2.11,GCC 最新版本

【问题讨论】:

    标签: assembly crash printf nasm


    【解决方案1】:

    printf 是一个 C 函数,它不是 stdcall,它是 cdecl。因此,调用者(您)需要在调用后释放参数。使用add esp, 4

    【讨论】:

    • 谢谢 :) 我需要释放任何 cdecl 调用函数的调用吗?
    • 是的,适用于所有 cdecl 函数。