【问题标题】:There is an assembly code written for Windows API, how to compile it on Linux and run with Wine有一个为 Windows API 编写的汇编代码,如何在 Linux 上编译并使用 Wine 运行
【发布时间】:2018-08-21 21:21:11
【问题描述】:

this introduction中有一个示例代码,如下所示:

; Sample x64 Assembly Program
; Chris Lomont 2009 www.lomont.org
extrn ExitProcess: PROC   ; external functions in system libraries
extrn MessageBoxA: PROC
.data
caption db '64-bit hello!', 0
message db 'Hello World!', 0
.code
Start PROC
  sub    rsp,28h      ; shadow space, aligns stack
  mov    rcx, 0       ; hWnd = HWND_DESKTOP
  lea    rdx, message ; LPCSTR lpText
  lea    r8,  caption ; LPCSTR lpCaption
  mov    r9d, 0       ; uType = MB_OK
  call   MessageBoxA  ; call MessageBox API function
  mov    ecx, eax     ; uExitCode = MessageBox(...)
  call ExitProcess
Start ENDP
End

上面的代码在hello.asm里面,在Windows上可以编译:

ml64 hello.asm /link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib /entry:Start

我无法访问 Windows 和 MASM,因为我在 Linux 上使用 NASM。我想如果我在 Linux 上编译代码,我可以用Wine 运行它。但是,我无法弄清楚如何在 Linux 上使用 NASM 编译它,而且我也无法弄清楚与 MASM 等效的 NASM 选项是什么。有人可以帮帮我吗?

【问题讨论】:

  • 你应该可以找到一个nasm语法hello world。
  • 我推荐阅读一些其他的汇编教程。顺便说一句,另请参阅 Assembler HowTo 并阅读 syscalls(2)
  • @BasileStarynkevitch 我为这些链接添加了书签。我要研究它们。谢谢。

标签: winapi assembly x86-64 nasm masm


【解决方案1】:

尽管软件包名称因 Linux 发行版而异,但您可以通过安装(或从源代码构建)mingw-w64 工具链和程序 JWASM 来执行您的建议。 JWASM 是一个与 MASM 大部分兼容的汇编程序。

在基于 Debian 的发行版(包括 Ubuntu)上,您应该能够通过以下方式安装先决条件:

apt-get install mingw-w64-x86-64-dev binutils-mingw-w64-x86-64 jwasm

对于基于 Ubuntu 的系统,您需要在上面的命令前面加上 sudo

然后您应该能够使用以下内容进行组装和链接:

jwasm -win64 hello.asm
x86_64-w64-mingw32-ld hello.o -lkernel32 -luser32 -o hello.exe

可执行文件应该可以使用wine64运行

【讨论】:

  • 我希望我能接受多个答案。谢谢,你的回答很有帮助。
【解决方案2】:

你应该已经能够找到一个 nasm 语法 hello world。无论如何,这是一个快速转录:

extern ExitProcess
extern MessageBoxA
section .data
caption db '64-bit hello!', 0
message db 'Hello World!', 0
section .text
  sub    rsp,28h        ; shadow space, aligns stack
  mov    rcx, 0         ; hWnd = HWND_DESKTOP
  lea    rdx, [message] ; LPCSTR lpText
  lea    r8,  [caption] ; LPCSTR lpCaption
  mov    r9d, 0         ; uType = MB_OK
  call   MessageBoxA    ; call MessageBox API function
  mov    ecx, eax       ; uExitCode = MessageBox(...)
  call ExitProcess

使用nasm -f win64 hello.asm 组装。您还需要一个链接器,我使用 mingw 端口作为 ld hello.obj -lkernel32 -luser32(让我强调这不是原生的 ld

【讨论】:

  • 相关:a 32-bit NASM hello world with a Linux sys_write system call。它打印到其stdout(即在终端上)而不是调用 GUI 消息框函数,使用本机 Linux 系统调用,不需要 WINE。它被大量评论,并有单独的段落描述它是如何工作的。我为 SO 文档编写了它,然后将其移植到 SO 文档关闭时适合的答案。
猜你喜欢
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多