Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在windowsxp中用NASM编程_Windows_Nasm_Winmain - Fatal编程技术网

在windowsxp中用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 $ 根据

我有以下代码,可以在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当我的汇编程序没有这些东西并且可以工作的时候

这是用于组装的命令: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语言中,这些
    #包括
    ,并直接链接到
    kernel32.dll
    。这些是gui应用程序,几乎肯定与
    user32.dll
    链接,也可能与
    advapi32.dll
    链接
  • /SUBSYSTEM:NATIVE
    -这里有两种类型的应用程序;驱动程序和应用程序。本机NT应用程序在windows启动期间运行,需要
    NTProcessStartup
    作为入口点。本机应用程序中没有libc。司机又不一样了
通过
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
,对于dos
nasm-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选项,对吗?