运行用NASM编写的Win32应用程序会导致“此应用程序无法在您的电脑上运行”错误

我开始在 Windows 上学习 x86 汇编。我正在学习 32 位 x86 汇编。我使用nasmandld来编译我的程序。我使用mingw32-makemakefile 作为我的构建系统。我假设ldMinGW 包含在内,但我不确定。我只知道它已经在我的电脑上。

我想编译一个非常简单的程序,以确保一切正常,当然,事实并非如此。运行我的可执行文件时,一个巨大的蓝色框出现并说“此应用程序无法在您的电脑上运行”,关闭通知后,这些文字会Access is denied打印到我的终端上。

这是我的程序:

global _main

_main:
  mov eax, 1
  ret

这是我的makefile:

main: learn.asm
    nasm -f win32 learn.asm -o learn.o
    ld learn.o -o learn.exe

有人可以帮我解决这个问题吗?

回答

最初您的问题是关于_start用作入口点的问题。您链接的方式不包括C运行时。

对于某些版本的 Windows,This app cant run on your pc如果.rdata在某些情况下没有(只读数据)部分,则在与 MinGW LD 链接时可能会出现错误。一种情况似乎是一个可执行文件,其中有一个.idata部分(导入目录)没有被标题引用并且不包含一个.rdata部分。当 MinGW LD 链接器在不使用C运行时从您的代码创建可执行文件时,似乎就是这种情况。要解决此问题,请添加一个.rdata至少包含一个字节数据的部分。这应该有效:

global _start

section .rdata
db 0

section .text
_start:
    mov eax, 1
    ret 

您还需要将您的代码放在该.text部分中,否则您可能会遇到其他问题。然后,您可以组装并链接:

nasm -fwin32 learn.asm -o learn.obj
ld -o learn.obj -o learn.exe

如果您想使用_main并打算使用C运行时,那么您不需要创建一个.rdata部分,但是您可以组装和链接:

nasm -fwin32 learn.asm -o learn.obj
gcc -m32 learn.obj -o learn.exe

我的链接建议

或者,您可以使用与 LD 不同的链接器。GoLink尤其应该从您使用的代码生成可执行文件。您可以通过以下方式创建带有_start入口点的 Win32 控制台应用程序:

nasm -fwin32 learn.asm -o learn.obj
golink /console /entry _start learn.obj

GoLink 将生成一个具有适当标题和部分的可执行文件,Windows 无需添加.rdata部分即可运行该文件。

如果您安装了 MSVC/C++,您还可以使用Microsoft 链接器:

nasm -fwin32 learn.asm -o learn.obj
link learn.obj /entry:start /subsystem:console


以上是运行用NASM编写的Win32应用程序会导致“此应用程序无法在您的电脑上运行”错误的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>