编译后 64 位 Hello world 冻结

ran*_*rot 1 x86-64 fasm

程序编译,但启动后冻结。如果替换格式并包含 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'  
Run Code Online (Sandbox Code Playgroud)

Rus*_*lan 5

您的堆栈未对齐 16 个字节,因为ABI 要求. 添加and rsp, -16到代码的开头,它将起作用。

关于评论中的这种交流:

Ruslan:拆解是什么样子的?invoke宏是否按预期扩展?

rancid_rot:不确定,cs 中有 MessageBox 而不是 ds。而 mov rcx,0 而不是 push 0。

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

要实际学习在 Win64 程序集中调用函数,请参阅有关 Win64 调用约定文档