有一个为Windows API编写的汇编代码,如何在Linux上编译它并使用Wine运行

use*_*291 1 assembly winapi x86-64 masm nasm

本简介中有一个示例代码,如下所示:

; 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
Run Code Online (Sandbox Code Playgroud)

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

ml64 hello.asm /link /subsystem:windows /defaultlib:kernel32.lib /defaultlib:user32.lib /entry:Start
Run Code Online (Sandbox Code Playgroud)

我无法访问Windows和MASM,因为我在Linux上并使用NASM.我想如果我在Linux上编译代码,我就可以运行它Wine.但是,我无法弄清楚如何在Linux上使用NASM编译它,而且我也不知道哪些NASM选项等同于MASM选项.有谁能够帮我?

Jes*_*ter 6

您应该能够找到一个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
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*tch 5

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

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

apt-get install mingw-w64-x86-64-dev binutils-mingw-w64-x86-64 jwasm
Run Code Online (Sandbox Code Playgroud)

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

然后,您应该可以使用以下方式进行组装和链接:

jwasm -win64 hello.asm
x86_64-w64-mingw32-ld hello.o -lkernel32 -luser32 -o hello.exe
Run Code Online (Sandbox Code Playgroud)

可执行文件应使用以下命令运行 wine64