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。
程序编译,但在启动后冻结。如果替换格式并包含 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。