使用 NASM 生成 .OBJ 并使用 LINK.EXE 链接成功生成 .exe 但程序挂起,为什么?

Generating .OBJs with NASM and linking with LINK.EXE successfully generates a .exe but the Program hangs, Why?

我使用 NASM 作为汇编程序,我正在尝试在 C++ 之后学习汇编语言,但我遇到了太多问题,例如在使用命令 nasm -f win32 c:\asm\assembly.asm 生成 .OBJ 之后生成一个 assembly.obj 文件,并在 CMD link c:\asm\assembly.obj /OUT:c:\asm\assembly.exe /SUBSYSTEM:CONSOLE /ENTRY:start 中使用命令后生成一个 assembly.exe 文件。

但是如果我尝试打开它,Windows 会显示一个框,上面写着“程序已停止工作”这是什么??我很困惑,我知道 Internet 上的 IDE,但不想使用它们中的任何一个,我喜欢命令提示符 window,但从未用它来链接我的任何应用程序(c++),这是从 TutorialsPoint.com:

复制的代码

注意*:TutorialsPoint 网站上的所有评论都是原创的,不是我的...

section .text
    global _start   ;must be declared for linker (ld)
_start:             ;tells linker entry point
    mov edx,len     ;message length
    mov ecx,msg     ;message to write
    mov ebx,1       ;file descriptor (stdout)
    mov eax,4       ;system call number (sys_write)
    int 0x80        ;call kernel
    
    mov eax,1       ;system call number (sys_exit)
    int 0x80        ;call kernel

section .data
msg db 'Hello, world!', 0xa  ;our dear string
len equ $ - msg              ;length of our dear string

我尝试将 _start 更改为网站上的 _WinMain@16(Windows 程序在 linux 上使用 _WinMain 而不是 _start)但它给链接器 error:Unresolved 外部,但是这个代码组装和链接正常,我面临的唯一问题是应用程序挂起或停止工作。

提前致谢!!

它崩溃是因为您试图在 Windows 上 运行 为 Linux 制作的组件。在这里,您的代码试图调用一些 Linux 内核的系统调用来编写 Hello World 并退出,但这在 Windows 上不起作用。汇编很少是多平台的。

根据经验,如果您看到 int 0x80,此代码可能无法在 Windows 上运行。

在 Windows 上,您可以尝试调用 kernel32.dll 中的 MessageBox 函数,例如显示您的 HelloWorld,请参阅 this post if you need some help with this