64 位 Hello world 编译后冻结

64bit Hello world freezes after compiling

程序编译,但在启动后冻结。如果替换格式并包含 32 位版本或注释掉 MessageBox,则一切正常。

format PE64 GUI

include 'E:\Fresh\include\win64a.inc'

entry start

section '.data' data readable writeable

        text db 'Hello world!',0

section '.text' code readable executable
start:
        invoke MessageBox,0,text,text,0
        invoke ExitProcess,0

section '.idata' import data readable writeable

        library kernel32,'KERNEL32.DLL', user32, 'USER32.DLL'
        import kernel32, ExitProcess, 'ExitProcess'
        import user32, MessageBox, 'MessageBoxA'  

您的堆栈未对齐到 16 字节,如 ABI requires。将 and rsp, -16 添加到代码的开头,它将起作用。

关于本次交流的评论:

Ruslan: What does the disassembly look like? Are invoke macros expanded as expected?

rancid_rot: Not sure, there is MessageBox in cs instead of ds. And mov rcx,0 instead push 0.

我建议避免使用 invoke 和类似的宏,直到您了解它们应该扩展到什么为止。否则你以为你是用汇编写的,但实际上你写的只是类似汇编的高级语言,甚至不知道最后会得到什么代码——这违背了使用汇编程序的全部目的。

要实际学习在 Win64 程序集中调用函数,请参阅 documentation on Win64 calling conventions