Voltar à lista
Assembly x86-64Memória

Pilha e quadros

push/pop, prólogo/epílogo, alinhamento e red zone

Pilha, quadros e alinhamento

A pilha cresce para baixo (endereços menores). push subtrai 8 de rsp e grava; pop lê e soma 8. Cada função costuma abrir um quadro (stack frame) no prólogo e fechá-lo no epílogo, usando rbp como ponto fixo para acessar locais e argumentos.

; prólogo e epílogo típicos de uma função
minha_funcao:
    push    rbp                ; salva o frame pointer do chamador
    mov     rbp, rsp           ; rbp = base do novo quadro
    sub     rsp, 32            ; reserva 32 bytes para locais (múltiplo de 16)

    ; ... corpo: [rbp-8], [rbp-16]… são as variáveis locais ...

    mov     rsp, rbp           ; libera os locais
    pop     rbp                ; restaura o frame do chamador
    ret                        ; desempilha o endereço de retorno

Duas regras práticas importantes: (1) no momento de um call, a pilha deve estar alinhada em 16 bytes — por isso os sub rsp, N costumam usar múltiplos de 16 (contando o endereço de retorno já empilhado). (2) No System V (Linux) existe a red zone: 128 bytes abaixo de rsp que uma função folha pode usar sem ajustar o ponteiro. O Windows não tem red zone, mas exige os 32 bytes de shadow space acima citados.