如何解决在Windows XP中使用NASM编程
| 我有以下代码,它们可以在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 $
根据许多有关NASM的教程,asm文件需要以下内容:
global _WinMain@16
_WinMain@16:
...
如您所见,我的asm文件中没有该文件。 (已注释掉,它只有_start)。那么,所有这些教程中都提到了当我的汇编程序没有全局_WinMain @ 16东西时,需要全局_WinMain @ 16的东西吗?
这是要汇编的命令:nasm -f elf test.asm
这是链接的命令:ld -o test.exe test.o
解决方法
Windows上有几种类型的应用程序,根据它们是哪种类型,它们具有不同的入口点。通过link.exe选项:
/SUBSYSTEM:CONSOLE
-需要main
并与msvcrXX.dll
链接。这些应用程序在控制台窗口中运行。如果您没有运行cmd.exe实例,则将打开一个实例。
/SUBSYSTEM:WINDOWS
-WinMain
是起点。看这里。通常在C中,这些#include <windows.h>
都直接链接到kernel32.dll
。这些gui应用程序几乎可以肯定地与user32.dll
链接,也可能与advapi32.dll
链接。
/SUBSYSTEM:NATIVE
-这里有两种类型的申请;驱动程序和应用程序。本机NT应用程序在Windows启动期间运行,并且需要12英镑作为入口点。本机应用程序中没有libc。驱动程序再次不同。
此处提供ѭ13支持的Windows子系统的完整列表。
_start
是符号窗口实际上将在其中开始运行代码。通常,ѭ15之类的东西实际上会处理_start
并进行一些初始设置,因此您的程序实际上并不是从_main
开始的。如果您想与ѭ15链接,则会遇到问题,因为libc库中的符号冲突。但是,如果您从不打算调用C或C ++标准库中的任何函数,则可以使用_start
。
编辑yike,我刚刚注意到了这一点:
; how to compile: nasm -f elf test.asm
; how to link: ld -o test.exe test.o
我假设您没有使用ѭ21。 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格式可执行文件,没有任何入口点规范。因此,我认为该代码只是“陷入”了第一部分汇编代码。我不建议这种行为,尤其是在链接多个对象时,因为我不知道会发生什么。使用use25ѭ。
拆卸精灵目标文件,我得到这个:
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
可以很好地进行链接。
只是一个想法-我从未解释过“ 31”部分。在Windows上,函数按16字节对齐,而如您所见,数据仅按4字节对齐。有关原因,请参见此说明。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。