在windowsxp中用NASM编程
我有以下代码,可以在Windows XP 32位、2.09.08 NASM上正常编译和运行:在windowsxp中用NASM编程,windows,nasm,winmain,Windows,Nasm,Winmain,我有以下代码,可以在Windows XP 32位、2.09.08 NASM上正常编译和运行: ; how to compile: nasm -f elf test.asm ; how to link: ld -o test.exe test.o section .data section .text ;global _WinMain@16 ;_WinMain@16: ;global _start _start: mov ax,4 jmp $ 根据
; how to compile: nasm -f elf test.asm
; how to link: ld -o test.exe test.o
section .data
section .text
;global _WinMain@16
;_WinMain@16:
;global _start
_start:
mov ax,4
jmp $
根据NASM的许多教程,asm文件需要包含以下内容:
global _WinMain@16
_WinMain@16:
...
正如您所看到的,我的asm文件中没有这个。(它被注释掉了,它只有_start)。那么,所有这些教程都提到了全球变暖的必要性,这是怎么回事呢_WinMain@16当我的汇编程序没有这些东西并且可以工作的时候
这是用于组装的命令:nasm-f elf test.asm这是链接:ld-o test.exe test.o的命令。Windows上有几种类型的应用程序,它们的入口点不同,具体取决于它们是哪种类型。按link.exe选项:
-需要/SUBSYSTEM:CONSOLE
并链接到main
。这些应用程序在控制台窗口中运行;如果您没有运行cmd.exe的实例,将打开一个实例msvcrXX.dll
-/SUBSYSTEM:WINDOWS
是起点。看见通常在C语言中,这些WinMain
#包括
,并直接链接到
。这些是gui应用程序,几乎肯定与kernel32.dll
链接,也可能与user32.dll
链接advapi32.dll
-这里有两种类型的应用程序;驱动程序和应用程序。本机NT应用程序在windows启动期间运行,需要/SUBSYSTEM:NATIVE
作为入口点。本机应用程序中没有libc。司机又不一样了NTProcessStartup
link.exe
提供了受支持的windows子系统的完整列表
\u start
是windows实际启动代码运行的符号。通常,libc
或类似的程序实际上处理\u start
并进行一些初始设置,因此您的程序实际上不是在\u main
上启动的。如果要链接到libc
,则会出现问题,因为libc库中的符号会发生冲突。但是,如果您不打算调用任何属于C或C++标准库的函数,那么使用<代码>
编辑我刚刚注意到:
; 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
,对于dosnasm-f coff
编辑2只是为了检查一下,我组装了代码并再次将其反汇编。我也用了mingw。不管怎样,我得到了:
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
对于要汇编的每个文件。必要时用win64
替换win32
ld
可以很好地进行链接
只是一个想法-我从未解释过
@16
部分。这些函数在Windows上是16字节对齐的,而正如您所看到的,数据只有4字节对齐。有关原因,请参阅。我没有使用link.exe链接我的程序。我用的是身份证。我测试了一个新的起点:_starthere请:。。。它也可以毫无问题地进行汇编、链接和执行。如果我使用的是裸骨组件(没有C、C++或其他LIB),那么我可以让我的起始符号做任何事情吗?不,我一直用这个命令来组装它:NASM -F ELF Test.ASM。还一直在使用链接命令:ld-o test.exe test.o。它适合我的窗户box@TheFuzz是的,您可以,使用ld--entry=\u starthere请@Ninefingers我在使用ld时没有指定入口点,我也没有问题。我应该只在与Microsoft的链接器链接时使用-f win32选项,对吗?