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文档关闭时将它移植到一个合适的答案中。