64位Hello world编译后冻结

问题描述 投票:0回答:1

程序进行编译,但是启动后冻结。如果替换该格式并包含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'  
x86-64 fasm
1个回答
0
投票

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

关于此交流中的评论:

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

rancid_rot:不确定,cs中有MessageBox,而不是ds。而mov rcx,0则改为按0。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.