程序编译,但启动后冻结。如果替换格式并包含 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)
您的堆栈未对齐 16 个字节,因为ABI 要求. 添加and rsp, -16到代码的开头,它将起作用。
关于评论中的这种交流:
Ruslan:拆解是什么样子的?
invoke宏是否按预期扩展?rancid_rot:不确定,cs 中有 MessageBox 而不是 ds。而 mov rcx,0 而不是 push 0。
我建议避免使用invoke和类似的宏,直到您了解它们应该扩展到什么为止。否则,您认为您是用汇编编写的,但实际上您是用一种仅类似于汇编的高级语言编写的,甚至不知道最终会得到什么代码——从而违背了使用汇编程序的全部目的。
要实际学习在 Win64 程序集中调用函数,请参阅有关 Win64 调用约定的文档。