Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 有一个为WindowsAPI编写的汇编代码,如何在Linux上编译它并使用Wine运行_Winapi_Assembly_X86 64_Nasm_Masm - Fatal编程技术网

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

Winapi 有一个为WindowsAPI编写的汇编代码,如何在Linux上编译它并使用Wine运行,winapi,assembly,x86-64,nasm,masm,Winapi,Assembly,X86 64,Nasm,Masm,中有一个示例代码,如下所示: ; 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 PR

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

; 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编译它,而且我也不知道NASM选项中有哪些与MASM选项等效。有人能帮我吗?

你应该能找到一个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

您应该能够找到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

尽管包名因Linux发行版而异,但您可以按照您的建议安装(或从源代码构建)一个mingw-w64工具链和程序。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运行。尽管包名因Linux发行版而异,但您可以通过安装(或从源代码构建)mingw-w64工具链和程序来执行建议。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运行,您应该能够找到nasm语法hello world。我建议您阅读其他一些汇编教程。顺便说一句,请参阅并阅读@BasileStarynkevitch,我已将这些链接添加到书签中。我要研究它们。谢谢。你应该可以找到一个nasm语法hello world。我建议你阅读一些其他的汇编教程。顺便说一句,请参阅并阅读@BasileStarynkevitch,我已将这些链接添加到书签中。我要研究它们。谢谢。我希望我能接受不止一个答案。谢谢,你的回答很有帮助。我希望我能接受不止一个答案。谢谢,你的回答很有帮助。相关:。它打印到其
标准输出(即在终端上),而不是调用GUI消息框函数,使用本机Linux系统调用,无需WINE。它有大量的评论,并且有单独的段落描述它是如何工作的。我为SO文档编写了它,然后在SO文档关闭时将其移植到合适的答案中。相关:。它打印到其
标准输出(即在终端上),而不是调用GUI消息框函数,使用本机Linux系统调用,无需WINE。它有大量的评论,并且有单独的段落描述它是如何工作的。我为SO文档编写了它,然后在SO文档关闭时将它移植到一个合适的答案中。