我正在尝试在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文件时,我什么也没得到。
到目前为止我尝试过的一些事情是>
我在做什么错?
编辑:固定的呼叫约定
我正在尝试在NASM中运行一个简单的Hello world程序。我想不使用C库直接打印到控制台,而是直接与WinAPI交互。我正在使用Visual Studio提供的LINK ....
您的修订代码存在三个问题。第一个是: