我在互联网上搜索了一个用于Windows的NASM x64的示例,但我发现只有一个,而且,不工作:(刚刚找到Linux,代码有人可以展示如何创建Hello world NASM的示例x64 windows
答案 0 :(得分:0)
讨论这个的话题:https://openclassrooms.com/forum/sujet/nasm-win64-bug-hello-world。 有人在 NASM [Win64] 中提出了一个解决方案。
main.asm
extern GetStdHandle
extern WriteFile
extern Sleep
extern ExitProcess
%define STD_OUTPUT_HANDLE (-11)
section .data
hello_str db "Hello World", 13, 10
hello_size equ ($ - hello_str)
output_handle dq 0
section .text
global main
main:
;Aligne la pile
and rsp, 0xFFFF_FFFF_FFFF_FFF0
mov rbp, rsp
;Récupère l'output standart
mov ecx, STD_OUTPUT_HANDLE
call GetStdHandle
mov [output_handle], rax
;Affiche le message
;Shadow Space
sub rsp, 48
mov rcx, [output_handle]
mov rdx, hello_str
mov r8d, hello_size
mov r9, 0
mov QWORD [rsp + 32], 0
call WriteFile
;Détruit l'espace de pile alloué pour les paramètres de la fonction
add rsp, 48
;Pause de 1000 millisecondes pour donner le temps de voir
;Shadow Space
sub rsp, 0x20
mov ecx, 1000
call Sleep
;Quitte
xor rcx, rcx
call ExitProcess
make.bat
@echo off
nasm.exe -fwin64 main.asm -o Obj/main.o
gpp.exe -s -m64 Obj/main.o -o hello.exe C:\Windows\System32\kernel32.dll
pause
“请注意,我使用 g++ 进行链接,但我认为您可以将其调整为您的链接器。”