运行 用 NASM 编写的 Win32 应用程序导致 'This app cant run on your pc' 错误
Running a Win32 app written in NASM results in 'This app cant run on your pc' error
我在 Windows 开始学习 x86 汇编。我正在学习 32 位 x86 程序集。我使用 nasm
和 ld
来编译我的程序。我使用 mingw32-make
makefile 作为我的构建系统。我假设 ld
包含在 MinGW 中,但我不确定。我只知道它已经在我的电脑上了。
我想编译一个非常简单的程序来确保一切正常,当然,事实并非如此。当 运行 我的可执行文件时,出现一个巨大的蓝色框并显示 'This app cant run on your pc' 并在关闭通知后,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
作为入口点的问题。您 linking 的方式不包括 C 运行时。
对于 Windows 的某些版本,如果 link 使用 MinGW LD 时,如果下面没有 .rdata
(只读数据)部分,您可能会收到错误 This app cant run on your pc
一些情况。一种情况似乎是 .idata
部分 (import directory) 未被 header 引用且不包含 .rdata
部分的可执行文件。当 MinGW LD linker 在不使用 C 运行时从您的代码创建可执行文件时,情况似乎就是这样。要解决此问题,请添加一个至少包含一个字节数据的 .rdata
部分。这应该有效:
global _start
section .rdata
db 0
section .text
_start:
mov eax, 1
ret
您还需要将代码放在 .text
部分,否则您可能会遇到其他问题。然后,您可以 assemble 和 link 与:
nasm -fwin32 learn.asm -o learn.obj
ld -o learn.obj -o learn.exe
如果您想使用 _main
并打算使用 C 运行时,那么您不需要创建 .rdata
部分,但是您将 assemble 和 link 与:
nasm -fwin32 learn.asm -o learn.obj
gcc -m32 learn.obj -o learn.exe
我的链接推荐
或者,您可以使用与 LD 不同的 linker。 GoLink 特别应该从您使用的代码生成可执行文件。您可以通过以下方式创建具有 _start
入口点的 Win32 控制台应用程序:
nasm -fwin32 learn.asm -o learn.obj
golink /console /entry _start learn.obj
GoLink 将生成具有适当 headers 和部分的可执行文件,Windows 应该没有问题 运行 而无需添加 .rdata
部分。
如果您安装了 MSVC/C++,您还可以使用 Microsoft linker:
nasm -fwin32 learn.asm -o learn.obj
link learn.obj /entry:start /subsystem:console
我在 Windows 开始学习 x86 汇编。我正在学习 32 位 x86 程序集。我使用 nasm
和 ld
来编译我的程序。我使用 mingw32-make
makefile 作为我的构建系统。我假设 ld
包含在 MinGW 中,但我不确定。我只知道它已经在我的电脑上了。
我想编译一个非常简单的程序来确保一切正常,当然,事实并非如此。当 运行 我的可执行文件时,出现一个巨大的蓝色框并显示 'This app cant run on your pc' 并在关闭通知后,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
作为入口点的问题。您 linking 的方式不包括 C 运行时。
对于 Windows 的某些版本,如果 link 使用 MinGW LD 时,如果下面没有 .rdata
(只读数据)部分,您可能会收到错误 This app cant run on your pc
一些情况。一种情况似乎是 .idata
部分 (import directory) 未被 header 引用且不包含 .rdata
部分的可执行文件。当 MinGW LD linker 在不使用 C 运行时从您的代码创建可执行文件时,情况似乎就是这样。要解决此问题,请添加一个至少包含一个字节数据的 .rdata
部分。这应该有效:
global _start
section .rdata
db 0
section .text
_start:
mov eax, 1
ret
您还需要将代码放在 .text
部分,否则您可能会遇到其他问题。然后,您可以 assemble 和 link 与:
nasm -fwin32 learn.asm -o learn.obj
ld -o learn.obj -o learn.exe
如果您想使用 _main
并打算使用 C 运行时,那么您不需要创建 .rdata
部分,但是您将 assemble 和 link 与:
nasm -fwin32 learn.asm -o learn.obj
gcc -m32 learn.obj -o learn.exe
我的链接推荐
或者,您可以使用与 LD 不同的 linker。 GoLink 特别应该从您使用的代码生成可执行文件。您可以通过以下方式创建具有 _start
入口点的 Win32 控制台应用程序:
nasm -fwin32 learn.asm -o learn.obj
golink /console /entry _start learn.obj
GoLink 将生成具有适当 headers 和部分的可执行文件,Windows 应该没有问题 运行 而无需添加 .rdata
部分。
如果您安装了 MSVC/C++,您还可以使用 Microsoft linker:
nasm -fwin32 learn.asm -o learn.obj
link learn.obj /entry:start /subsystem:console