我想使用NASM编译Win32可执行文件,但我不知道该如何操作。是否有必要的头文件来告诉Windows此文件是可执行文件?
此外,有人可以告诉我Windows如何知道这是一个窗体应用程序还是控制台应用程序吗?
此外,有人可以告诉我Windows如何知道这是一个窗体应用程序还是控制台应用程序吗?
问题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下载源代码。