有在Windows几种类型的应用程序的不同取决于它们的类型。通过LINK.EXE选项:
/SUBSYSTEM:CONSOLE
- 需要main
与msvcrXX.dll
链接。这些应用程序在控制台窗口运行如果您未运行cmd.exe实例,则会打开一个实例。
/SUBSYSTEM:WINDOWS
- WinMain
是出发点。见here。通常在C中,这些#include <windows.h>
并直接链接到kernel32.dll
。这些gui应用程序几乎肯定与user32.dll
以及可能的advapi32.dll
连接。
/SUBSYSTEM:NATIVE
- 这里有两种类型的应用程序;司机和应用程序。原生NT应用程序在Windows启动时运行,并要求NtProcessSStartup
作为入口点。本地应用程序中没有libc。司机又是不同的。
link.exe
支持的Windows子系统的完整列表可用here。
_start
是符号窗口实际上会启动您的代码运行在。通常,libc
或类似的东西实际上处理_start
并进行一些初始设置,所以您的程序实际上并不完全从_main
开始。如果你想链接libc
,你会遇到问题,因为你与libc库有冲突的符号。但是,如果您从未打算调用属于C或C++标准库的任何函数,则可以使用_start
。
编辑亚克西我刚刚注意到这一点:
; how to compile: nasm -f elf test.asm
; how to link: ld -o test.exe test.o
我假设你没有使用-f elf
之一。 ELF(可执行和可链接格式)是可执行文件的linux格式; Windows需要可执行的可执行(PE)映像。 nasm选项是-f win32
,或者对于dos nasm -f coff
。
编辑2只是为了检查,我组装的代码,并再次拆卸它。我也用明明。反正,我:
SECTION .text align=16 execute ; section number 1, code
Entry_point:; Function begin
; Note: Length-changing prefix causes delay on Intel processors
mov ax, 4 ; 00401000 _ 66: B8, 0004
?_001: jmp ?_001 ; 00401004 _ EB, FE
; Entry_point End of function
; Note: Length-changing prefix causes delay on Intel processors
mov ax, 4 ; 00401006 _ 66: B8, 0004
?_002: jmp ?_002 ; 0040100A _ EB, FE
头的其余部分似乎是一个有效的PE格式的可执行没有切入点规范。因此,我相信代码只是“落伍”到开始的第一个汇编代码。我不会建议这种行为,特别是在链接多个对象时,我不知道会发生什么。请使用-entry
。
拆卸ELF目标文件我得到这个:
SECTION .data align=4 noexecute ; section number 1, data
SECTION .text align=16 execute ; section number 2, code
_start_here:; Local function
; Note: Length-changing prefix causes delay on Intel processors
mov ax, 4 ; 0000 _ 66: B8, 0004
?_001: jmp ?_001 ; 0004 _ EB, FE
_another_symbol:; Local function
; Note: Length-changing prefix causes delay on Intel processors
mov ax, 4 ; 0006 _ 66: B8, 0004
?_002: jmp ?_002
换句话说,没有在任何特定的ELF格式的头。我相信你会为这一件幸运的;开始导入或试图与其他代码模块链接,事情会变得更加棘手。
对于Windows/MinGW的,你想:
nasm -f win32 file.asm
您要组装的每个文件。在需要时用win32
代替win64
。 ld
将适用于链接。
只是一个念头 - 我从来没有解释过@16
部分。这些函数在Windows上是16字节对齐的,而如您所见,数据只有四字节对齐。为什么请参阅this explanation。
我没有使用link.exe来链接我的程序。我正在使用ld。我测试了一个新的起点:_startHerePlease:...它也组装并链接并执行而没有问题。如果我使用裸骨骼装配(没有C,C++或其他库),那么我可以让我的起始符号变成什么样子? – TheFuzz
不,我一直在使用该命令来组装它:nasm -f elf test.asm。也一直在使用链接命令:ld -o test.exe test.o.它工作正常,我的窗口框 – TheFuzz
@TheFuzz是的,你可以用'ld --entry = _startHerePlease'。 – 2011-06-23 23:12:45