【问题标题】:Fasm x64 MsgBoxFasm x64 消息框
【发布时间】:2020-05-05 20:45:13
【问题描述】:

我想使用 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: нарушение прав доступа при исполнении по адресу 0x000000

如果翻译:

program.exe 中地址 0x0000000000001108 处的异常:0xC0000005:执行地址 0x0000000000001108 时发生访问冲突。

【问题讨论】:

  • 也许invoke 做的不对。也许它出于某种原因假设为 32 位。也许它假设堆栈对齐。尝试在main 中添加push rbp 的第一件事。无论如何,在开始使用宏之前,您应该学会手动编写代码,甚至要确定每个宏的实际作用。

标签: windows assembly windows-10 64-bit fasm


【解决方案1】:

我将此标记为社区 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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    相关资源
    最近更新 更多