用于Windows的Nasm x64代码

时间:2013-12-07 18:45:06

标签: assembly 64-bit nasm

我在互联网上搜索了一个用于Windows的NASM x64的示例,但我发现只有一个,而且,不工作:(刚刚找到Linux,代码有人可以展示如何创建Hello world NASM的示例x64 windows

x64 assembly code for NASM linux

x64 Assembly code for NASM windows

1 个答案:

答案 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++ 进行链接,但我认为您可以将其调整为您的链接器。”