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

标签 assembly x86 mingw nasm ld

我开始在 Windows 上学习 x86 汇编。我正在学习 32 位 x86 汇编。我用 nasmld为了编译我的程序。我用的是 mingw32-make makefile 作为我的构建系统。我假设 ld包含在 MinGW 中,但我不确定。我只知道它已经在我的电脑上。
我想编译一个非常简单的程序,以确保一切正常,当然,它没有。运行我的可执行文件时,出现一个巨大的蓝色框并显示“此应用程序无法在您的电脑上运行”,关闭通知后,出现 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 的可执行文件。部分 ( import directory ) 未被标题引用且不包含 .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 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/67306406/

相关文章:

c - %p 在 printf 中的用法?

c - GDB 打印值相对于寄存器

multithreading - TLS 可变查找速度

c - 从 CreateProcess 获取 PROCESS_INFORMATION

c - 在 MinGW 3.4.5 中使用 -ansi 开关的问题

permissions - 使用 minGW 和 MSYS 在 Windows 上构建 libav 时出错

c - Linux下实现窗口函数InterlockedExchange

linux - 为什么运行一个空程序需要这么多指令?

linux nasm 将 AL 中的值移动到 AX

c++ - 尝试使用 gcc 工具链构建 Boost