我在互联网上搜索了一个适用于 Windows 的 NASM x64 示例,但我只找到了一个,并且不起作用:(,只是找到了适用于 Linux 的代码,有人可以展示如何创建 Hello world NASM x64 Windows 的示例
谈论这个话题:https://openclassrooms.com/forum/sujet/nasm-win64-bug-hello-world。 有人提出了 NASM [Win64] 中的解决方案。
主.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++ 进行链接,但我认为您可以将其调整为适合您的链接器。”
我刚刚编写了一个最小的 Windows 64 汇编代码文件。我用 nasm 编译它,然后用 ld.exe 链接它。 我不是专家。我正在学习,但我注意到缺少简单的代码文件。 源asm文件是:
bits 64
default rel
MB_OK equ 0
NULL equ 0
extern MessageBoxA
extern ExitProcess
section .text
push rbp
mov rbp, rsp
mov rcx, MB_OK
lea rdx, mensaje2
lea r8, mensaje1
mov r9, NULL
sub rsp, 32
call MessageBoxA
xor rcx, rcx
sub rsp, 32
call ExitProcess
section .data
mensaje1: db "Hola colega", 0
mensaje2: db "Esto es una prueba", 0
我用这个 makefile 编译它:
EXE=a.exe
ASMB=nasm.exe
LINK=ld.exe
ASMFLAGS=
LDFLAGS = -LC:\SinInstalacion\Desarrollo\mingw64\x86_64-w64-mingw32\lib -lkernel32 -luser32
OBJS=main.o
all: $(EXE)
$(EXE): $(OBJS)
$(LINK) -o $(EXE) $(OBJS) $(LDFLAGS)
%.o: %.asm
$(ASMB) -f win64 $< -o $@ $(ASMFLAGS)
clean:
del $(OBJS) $(EXE)
我写这篇文章是因为我在谷歌中没有找到例子。
原谅我的错误。
干杯。