gpt4 book ai didi

assembly - 运行用 NASM 编写的 Win32 应用程序会导致 'This app cant run on your pc' 错误

转载 作者:行者123 更新时间:2023-12-05 09:36:01 25 4
gpt4 key购买 nike

我开始学习 Windows 上的 x86 程序集。我正在学习 32 位 x86 程序集。我使用 nasmld 来编译我的程序。我使用 mingw32-make makefile 作为我的构建系统。我假设 ld 包含在 MinGW 中,但我不确定。我所知道的是它已经在我的电脑上了。

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

这是我的程序:

global _main

_main:
mov eax, 1
ret

这是我的生成文件:

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

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

最佳答案

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

对于某些版本的 Windows,如果没有 .rdata(只读数据),则在与 MinGW LD 链接时可能会出现错误 This app cant on your pc某些情况下的部分。一种情况似乎是具有 .idata 部分 ( import directory ) 的可执行文件未被 header 引用并且不包含 .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 将生成一个具有适当 header 和部分的可执行文件,Windows 应该可以毫无问题地运行而无需添加 .rdata 部分。

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

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

关于assembly - 运行用 NASM 编写的 Win32 应用程序会导致 'This app cant run on your pc' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65440346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com