NASM教程使用int 80h,但这不适用于Windows

ama*_*el2 2 windows x86 assembly winapi nasm

我在完成FASM之后开始NASM Assembler.我在Windows操作系统中对此进行编码.我的代码是:

section.data ;Constant
            msg:    db "Hello World!"
            msg_L:   equ $-msg  ; Current - msg1

section.bss ;Varialble

section.text ; Code
        global _WinMain@16 

_WinMain@16:
        mov eax,4
        mov ebx,1; Where to wrte it out. Terminal
        mov ecx, msg
        mov edx, msg_L
        int 80h

        mov eax, 1 ; EXIT COMMAND
        mov ebx,0 ; No Eror
        int 80h
Run Code Online (Sandbox Code Playgroud)

要编译它并执行我使用:

nasm -f win32 test.asm -o test.o
ld test.o -o test.exe  
Run Code Online (Sandbox Code Playgroud)

我目前正在关注NASM教程的视频.我把开始改为WIN32,但是当我执行它时,它就会卡住并且不会运行......这有什么问题吗?

Cod*_*ray 9

您正尝试int 80h在Windows操作系统上进行Linux系统调用().

这不行.您需要调用Windows API函数.例如,MessageBox将在屏幕上显示一个消息框.

section.data ;Constant
            msg:    db "Hello World!"
            msg_L:   equ $-msg  ; Current - msg1

section.bss ;Varialble

section.text ; Code
        global _WinMain@16
        extern _MessageBoxA@16

_WinMain@16:
        ; Display a message box
        push 40h   ; information icon
        push 0
        push msg
        push 0
        call _MessageBoxA@16

        ; End the program
        xor eax, eax
        ret
Run Code Online (Sandbox Code Playgroud)

确保您正在阅读的书籍/教程是关于使用NASM进行Windows编程,而不是Linux编程!

  • 否.`int`指令发出系统调用中断.中断80h是基于Unix的系统上的`syscall`中断,由内核提供.如果没有Unix内核,那就没有任何实现.您必须自己实现这些功能.您可以发出中断80h,但它不会做任何有用的事情.从小开始; 你在汇编中的第一个项目不应该是编写OS内核. (6认同)
  • 不可以。您可以在 Linux VM 上编译它并在 Linux VM 上*运行*它,但不能在 Windows 上运行它,因为 Windows 上没有 Linux 系统调用。@dsafds (2认同)