Voltar à lista
Assembly x86-64Exemplos

Exemplo — Windows

MessageBoxA e o stub do ntdll

Exemplo — Windows (Win32 e ntdll)

No Windows você chama a Win32 API respeitando a convenção Microsoft x64: argumentos em rcx, rdx, r8, r9 e 32 bytes de shadow space reservados na pilha antes do call.

; Windows x64 — chama a Win32 API MessageBoxA e encerra.
; Convenção Microsoft x64: args em rcx, rdx, r8, r9 + 32 bytes de shadow space.
    extern MessageBoxA
    extern ExitProcess

section .data
    titulo: db "Olá", 0
    texto:  db "Assembly no Windows", 0

section .text
    global mainCRTStartup
mainCRTStartup:
    sub     rsp, 40            ; 32 de shadow space + 8 p/ alinhar a pilha em 16
    xor     ecx, ecx           ; arg 1: hWnd = NULL
    lea     rdx, [rel texto]   ; arg 2: corpo da mensagem
    lea     r8,  [rel titulo]  ; arg 3: título
    xor     r9d, r9d           ; arg 4: MB_OK (0)
    call    MessageBoxA        ; retorno em eax

    xor     ecx, ecx           ; arg 1: código de saída 0
    call    ExitProcess

Por baixo, cada função acaba em um stub Nt* do ntdll.dll como o esboço abaixo. É por isso que o número de syscall do Windows é instável — ele é um detalhe interno, recompilado a cada build.

; Windows x64 — como um stub Nt* do ntdll.dll realmente entra no kernel.
; O número em eax MUDA a cada build do Windows: nunca o codifique à mão.
NtWriteFile:                   ; (esboço do stub gerado pela Microsoft)
    mov     r10, rcx           ; syscall destrói rcx; o stub salva o arg 1 em r10
    mov     eax, 0x08          ; número da syscall (exemplo — instável!)
    syscall                    ; retorna um NTSTATUS em eax
    ret