使用NASM编译Windows可执行文件

3
我想使用NASM编译Win32可执行文件,但我不知道该如何操作。是否有必要的头文件来告诉Windows此文件是可执行文件?
此外,有人可以告诉我Windows如何知道这是一个窗体应用程序还是控制台应用程序吗?

1
你有没有查看文档 - 500 - Internal Server Error
不,这太长了,读起来太累 :) - David Xu
1
而且,“nasm win32教程”太长了,无法在搜索引擎中输入? - Michael
1个回答

8

问题1:

我想使用NASM编译Win32可执行文件,但我不知道该怎么做。

编译:

nasm -f win32 test.asm -o test.o

ld test.o -o test.exe

来源: http://ccm.net/faq/1559-compiling-an-assembly-program-with-nasm

问题2:

有必要的头文件告诉Windows这个文件是可执行的吗?

文件扩展名指示了一个可执行文件。通过读取该文件的PE文件结构,“Windows”能够获取所有它需要正确加载和执行该文件的信息。

问题3:

此外,有人能告诉我Windows如何知道这是窗体应用程序还是控制台应用程序吗?

请阅读以下内容:

更加技术性地说,控制台和Windows可执行文件之间唯一的区别是exe文件PE头中的一个字节。手动切换此字节(例如使用十六进制编辑器)即可转换应用程序类型。这是一个广为流传的黑客技巧,用于在VB6中创建控制台应用程序(该类型应用程序并未得到明确支持)。

要确定和更改应用程序的子系统类型,需要阅读PE头的部分内容。子系统数据的地址不是固定的,因为它是可选文件头的一部分,其位置由存储在DOS文件头中的地址确定(在成员e_lfanew中)。该地址实际上指向_IMAGE_NT_HEADERS记录,后者又包括IMAGE_OPTIONAL_HEADER32结构。其中有一个int16^1成员称为Subsystem。对于Windows应用程序,该成员的值为2,对于控制台应用程序,则为3。还存在其他子系统(特别是POSIX和内核)。我编写了一个小的VB6应用程序来更改应用程序的子系统,可以从ActiveVB下载源代码。

来源: Windows和控制台应用程序之间的区别


我已经从链接中下载了NASM 2.11.06和2.14.02版本,链接是www.nasm.com。但我在那里甚至找不到ld.ex文件。我找到了ldrdf.exe代替。但是当我使用ldrdf test.o -o test.exe时,它无法工作。我使用了你提供的链接中的代码示例。 - AirCraft Lover
这个是否能在64位的Windows环境下运行,像nasm -f win64-o ArraySum.o ArraySum.asm这样的操作? - rinilnath
@AirCraftLover - 我也遇到了同样的问题。你需要下载MinGW安装管理器并安装mingw32-binutils。这将为你获取ld可执行文件。 - Guru Pasupathy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接