我有以下代码,可以在Windows XP 32位、2.09.08 NASM上很好地组装和运行:; how to compile: nasm -f elf test.asm; how to link: ld -o test.exe test.osection .datasection .text;global _WinMain@16;_WinMain@16:;global _start_start: mov ax,4 jmp $根据许多关于nasm的教程,asm文件需要包含以下内容:global _WinMain@16_WinMain@16:...你可以看到我的asm文件里没有这个。(它被注释掉了,它只有一个开始)。那么,当我的汇编程序没有这个功能并且可以工作时,这些教程都提到了对global-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是起点。参阅here。通常在c中,这些#include <windows.h>与kernel32.dll直接相连。这些图形用户界面应用程序几乎肯定与user32.dll和advapi32.dll也有关联。/SUBSYSTEM:NATIVE-这里有两种类型的应用程序:驱动程序和应用程序。本机NT应用程序在Windows启动期间运行,需要NtProcessSStartup作为入口点。本机应用程序中没有libc。司机又不一样了。link.exe支持的windows子系统的完整列表here可用。_start是Windows将实际开始运行代码的符号。通常,libc等实际上处理_start并进行一些初始设置,因此您的程序实际上并不完全从_main开始。如果您想与libc链接,就会有问题,因为您与libc库有冲突的符号。但是,如果您从未打算调用c或c++标准库中的任何函数,则可以使用_start。编辑Yikes我刚刚注意到:; how to compile: nasm -f elf test.asm; how to link: ld -o test.exe test.o我想你不是在用那个。ELF(可执行和可链接格式)是可执行文件的Linux格式;Windows需要可移植可执行(PE)映像。nasm选项是-f elf或dos-f win32。编辑2只是为了检查,我组装了代码并再次将其反汇编。我也用明威。不管怎样,我得到了:SECTION .text align=16 execute ; section number 1, codeEntry_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格式可执行文件,没有入口点规范。因此,我认为代码只是“通过”到程序集代码的第一部分开始。我不建议这种行为,特别是当链接多个对象时,因为我不知道会发生什么。使用。分解elf对象文件,我得到:SECTION .data align=4 noexecute ; section number 1, dataSECTION .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对于要汇编的每个文件。必要时用nasm -f coff代替-entry。win32对链接很有用。只是一个想法-我从未解释过win64部分。这些函数在windows上是16字节对齐的,而正如您所看到的,数据只有4字节对齐。原因见this explanation。关于windows - 在Windows XP中使用NASM编程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6461501/
10-17 02:47