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 ExitProcessPor 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