NASM中具有LINK.EXE和WinAPI的Hello世界

问题描述 投票:1回答:1

我正在尝试在NASM中运行一个简单的Hello world程序。我想在不使用C库的情况下直接打印到控制台,而直接与WinAPI交互。

我正在使用Visual Studio提供的LINK.EXE进行链接。

到目前为止是我的代码:

section .data
    message:     db 'Hello world!',10    ; 'Hello world!' plus a linefeed character
    messageLen:  db $-message        ; Length of the 'Hello world!' string

    global _start
    extern  GetStdHandle
    extern  WriteConsoleW
    extern  ExitProcess

section .text

_start:
    ; DWORD  bytes;    
    mov     rbp, rsp
    sub     rsp, byte 8

    ; hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)
    mov     ecx, -11
    call    GetStdHandle

    ; WriteFile(hstdOut, message, length(message), &bytes, 0);
    mov     rcx, rax
    mov     rdx, message
    mov     r8,  messageLen
    lea     r9,  [rsp-4]
    push    0
    call    WriteConsoleW

    ; ExitProcess(0)
    mov     rcx, 0
    call    ExitProcess

    ret

我这样组装并链接:

nasm -f win64 .\ASM.ASM
link /entry:_start /nodefaultlib /subsystem:console .\ASM.obj "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64\kernel32.lib" "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64\user32.lib"

但是,当我运行生成的.exe文件时,我什么也没得到。

到目前为止我尝试过的一些事情是>

  • 使用修饰的名称(如_GetStdHandle @ 4),导致链接程序抱怨未解析的引用
  • [不尝试打印任何内容并调用Sleep,这导致进程无限期休眠
  • 退出时返回了不同的返回码,再次没有执行任何操作
  • 我在做什么错?

编辑:固定的呼叫约定

我正在尝试在NASM中运行一个简单的Hello world程序。我想不使用C库直接打印到控制台,而是直接与WinAPI交互。我正在使用Visual Studio提供的LINK ....

winapi assembly x86 x86-64 nasm
1个回答
4
投票

您的修订代码存在三个问题。第一个是:

© www.soinside.com 2019 - 2024. All rights reserved.