windows - Fasm x64 消息框

标签 windows assembly windows-10 64-bit fasm

我想使用 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'

关于windows - Fasm x64 消息框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61622739/

相关文章:

multithreading - 关于 Keras fit_generator() 中的多处理和工作人员与 spyder 中的 Windows 10 的混淆

windows - 如何允许在 Delphi 中为特定控件拖动文件

windows - Qt:父/子链中的多个窗口,父不关闭子?

c - 为什么gcc生成 "leal -8240(%ebp), %eax; cmpl $1, %eax; ja XXX"而不是jmp指令?

performance - go 中 ASM 函数调用的开销

c - 除了原始机器指令外,可执行文件中还有什么?

c++ - 如何为我的进程更新 PROC_THREAD_ATTRIBUTE_LIST?

Docker 桌面 (Windows 10 Pro) — 为什么设置->资源中没有高级选项卡?

c++ - DLL 中的 Windows 消息队列处理

php - Windows 上的 Apache/PHP 禁用 OpenSSL 支持