Aprender / Lição 10

Pilha e chamadas de funções

Lição 10 de 12Iniciante10 min
Laboratório · 10 / 12

Memória: guarde para recuperar

Seu robô-guia

RAX guarda 3. Guarde esse valor na pilha, mude RAX para 9 e recupere o 3 em RBX.

Blocos

Seu programa

1 instrução
  1. 01 MOV
    mov rax, 3

Resultado

PROCESSADORx86-64
RAX64 bits—
RBX64 bits—
RCX64 bits—

Aguardando suas instruções

ZF · indicador de zero—
Pilha · topo primeirovazia

Simulador didático · blocos equivalem a instruções Intel/NASM. Não executa Assembly nativo.

Entender melhor

PUSH guardou uma cópia na memória da pilha; POP a devolveu. Mudar RAX não alterou a cópia.

Este laboratório modela MOV, ADD, SUB, CMP, saltos de igualdade e pilha. Os registradores começam sem valor; a aritmética usa 64 bits sem sinal. Só ZF é representada, e cada execução recomeça do início. Repetições param após 200 passos. Não simula memória, outras flags, chamadas ao Linux ou um processador completo.

Consultar a lição completa
Entender melhor · Pilha e chamadas de funções
O que você vai aprender

Compreender a ordem da pilha e a relação entre CALL e RET.

O último que entra é o primeiro que sai

A pilha é uma região de memória usada com uma ordem especial: o último valor colocado é o primeiro retirado. Pense em uma pilha de pratos. O registrador RSP aponta para o topo dessa região.

Em x86-64, PUSH com um registrador de 64 bits reduz RSP em 8 bytes e guarda o valor. POP lê o valor do topo e aumenta RSP em 8. O trecho pressupõe uma pilha válida, como a fornecida pelo Linux ao iniciar um processo.

Chamar e voltar

CALL guarda um endereço de retorno na pilha e desvia para uma rotina. RET retira esse endereço e volta para a instrução após a chamada. Uma rotina é um trecho de código que pode ser reutilizado.

A pilha precisa permanecer equilibrada: retirar valores a mais pode corromper o retorno. Chamadas a bibliotecas também seguem regras de alinhamento e preservação de registradores; o pequeno exemplo aqui não faz essas chamadas.

Um exemplo, passo a passo

Exemplo comentadox86-64 · Intel / NASM · Linux
; Trecho x86-64 · Intel / NASM · Linux
mov rax, 3
push rax      ; guarda 3 na pilha
mov rax, 9
pop rbx       ; recupera 3 em RBX

Entendendo cada passo

  1. PUSH guarda uma cópia de 3 na memória da pilha.
  2. Alterar RAX para 9 não altera a cópia guardada.
  3. POP recupera 3 em RBX. Um PUSH e um POP do mesmo tamanho restauram RSP.
Para guardar

A pilha guarda valores em ordem inversa de entrada e também viabiliza o retorno de chamadas.

Revisão complementar

Verdadeiro ou falso

No exemplo, POP RBX recupera o valor 9 porque RAX mudou.

Escolha uma resposta

Marcação opcional, salva apenas neste navegador. Clique novamente para desfazer.