Fasm x64 消息框

Fasm x64 MsgBox

我想使用 Fasm 通过简单 MsgBox 编译 x64 应用程序。我已经编写了代码,它编译成功,但是当我 运行 它没有显示任何内容,程序就结束了。怎么了?

format PE64 GUI 4.0
entry main

include 'win64a.inc'

main:
  invoke MessageBox,NULL,'Hello, World!','Fasm message box:',MB_OK
  invoke ExitProcess,0

library kernel32,'kernel32.dll',\
        user32,'user32.dll'

include 'api/kernel32.inc'
include 'api/user32.inc'

如果尝试在 VS2017 中调试,我会得到一个异常:

Вызвано исключение по адресу 0x0000000000001108 в program.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x0000000000001108.

如果翻译:

Exception at address 0x0000000000001108 in program.exe: 0xC0000005: access violation when executing address 0x0000000000001108.

我将其标记为社区 wiki,以便其他人可以填写其工作原理的描述。值得注意的是:

  • .idata 进口部分
  • .text 可执行部分
  • sub rsp, 8(或类似 push rbp 的等效项)用于根据 Windows x86-64 调用约定进行堆栈对齐。

代码:

include 'win64a.inc'

format PE64 GUI 4.0
entry main

section '.text' code readable executable
main:
  sub rsp, 8
  invoke MessageBox,NULL,'Hello, World!','Fasm message box:',MB_OK
  invoke ExitProcess,0

;section '.data' data readable writeable
; Data here

section '.idata' import data readable
library kernel32,'kernel32.dll',\
        user32,'user32.dll'

include 'api/kernel32.inc'
include 'api/user32.inc'