我开始学习Windows上的x86汇编。我正在学习32位x86汇编。我使用nasm
和ld
来编译我的程序。我使用mingw32-make
makefile作为构建系统。我假设ld
MinGW附带了它,但是我不确定。我所知道的是它已经在我的计算机上。
我想编译一个非常简单的程序,只是为了确保一切正常,当然不是。运行我的可执行文件时,出现一个巨大的蓝色框,上面写着“此应用程序无法在您的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
用作入口点的。您的链接方式不包括C运行时。
在某些版本的Windows中,This app cant run on your pc
如果.rdata
在某些情况下没有(只读数据)部分,则与MinGW LD链接时可能会出现错误。一种情况似乎是带有标头未引用的.idata
节(导入目录)的可执行文件,并且不包含.rdata
节。当不使用C运行时时,MinGW LD链接器根据您的代码创建可执行文件时,情况就是这样。要解决此问题,请添加.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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句