适用于 Windows 的 Nasm x64 代码

问题描述 投票:0回答:2

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

NASM linux 的 x64 汇编代码

NASM windows 的 x64 汇编代码

windows assembly x86-64 nasm
2个回答
1
投票

谈论这个话题: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++ 进行链接,但我认为您可以将其调整为适合您的链接器。”


0
投票

我刚刚编写了一个最小的 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)

我写这篇文章是因为我在谷歌中没有找到例子。

原谅我的错误。

干杯。

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