2011-06-23 66 views
1

我有下面的代码是组装和Windows XP 32位运行正常,08年2月9日NASM:编程与NASM在Windows XP

; how to compile: nasm -f elf test.asm 
; how to link: ld -o test.exe test.o 

section .data 

section .text 

;global [email protected] 
;[email protected]: 

;global _start 
_start: 
    mov ax,4   

    jmp $ 

据对NASM很多教程在汇编文件中需要在以下它:

global [email protected] 
[email protected]: 
... 

正如你可以看到我的asm文件没有它。 (它已被注释掉,它只有_start)。那么当我的汇编程序没有这些功能并且工作时,所有这些教程都提到了全局_WinMain @ 16东西的必要性。

这是组装的命令:NASM -f精灵TEST.ASM
这是命令链接:LD -o test.exe的test.o

回答

2

有在Windows几种类型的应用程序的不同取决于它们的类型。通过LINK.EXE选项:

  • /SUBSYSTEM:CONSOLE - 需要mainmsvcrXX.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代替win64ld将适用于链接。

只是一个念头 - 我从来没有解释过@16部分。这些函数在Windows上是16字节对齐的,而如您所见,数据只有四字节对齐。为什么请参阅this explanation

+0

我没有使用link.exe来链接我的程序。我正在使用ld。我测试了一个新的起点:_startHerePlease:...它也组装并链接并执行而没有问题。如果我使用裸骨骼装配(没有C,C++或其他库),那么我可以让我的起始符号变成什么样子? – TheFuzz

+0

不,我一直在使用该命令来组装它:nasm -f elf test.asm。也一直在使用链接命令:ld -o test.exe test.o.它工作正常,我的窗口框 – TheFuzz

+0

@TheFuzz是的,你可以用'ld --entry = _startHerePlease'。 – 2011-06-23 23:12:45