程序进行编译,但是启动后冻结。如果替换该格式并包含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:拆卸是什么样的?
invoke
宏是否按预期扩展了?rancid_rot:不确定,cs中有MessageBox,而不是ds。而mov rcx,0则改为按0。
我建议避免使用invoke
和类似的宏,直到您了解它们应该扩展为什么为止。否则,您会认为您是用汇编语言编写的,但实际上您只是用类似于汇编语言的高级语言编写的,甚至不知道最终会得到什么代码,因此违背了使用汇编语言的全部目的。
要实际学习在Win64程序集中调用函数,请参见documentation on Win64 calling conventions。>>