Quando a instrução CALL é executada, qual o endereço que é colocado na pilha?

Passo 1

Beleza, a questão tá falando sobre a instrução CALL em Assembly (x86) e quer saber exatamente qual endereço vai parar na pilha quando a gente chama uma sub-rotina. Aqui o conteúdo é “Controle de Fluxo e Pilha em Assembly” e a gente vai precisar entender duas coisinhas:
  1. Como funciona a pilha (stack) no x86.
  2. O que a instrução CALL faz com o registrador de instrução (EIP/RIP).

Passo 2

Primeiro, lembra como a pilha funciona? É uma área de memória onde o processador faz push (empilha) e pop (desempilha). No x86, o registrador ESP (ou RSP no modo 64 bits) aponta pro topo da pilha. Quando a gente faz um push, ESP é decrementado e depois escreve ali o valor; no pop é o contrário.

Passo 3

Agora, a instrução CALL. Quando você executa algo como
CALL label
o processador precisa guardar o “endereço de retorno” na pilha, ou seja, para onde ele deve voltar depois que a sub-rotina terminar. Esse endereço de retorno é o endereço da instrução imediatamente seguinte ao CALL.

Passo 4

Tecnicamente, se o registrador de instrução é o EIP (em 32 bits) ou RIP (em 64 bits), o que entra na pilha é
endereçoderetorno = EIPatual + tamanhodainstrução CALL ççã
Mas, na prática, você nem precisa decorar o tamanho exato em bytes — basta saber: é o endereço da próxima instrução.

Resposta

O endereço que vai para a pilha é o endereço da instrução imediatamente após o CALL (o endereço de retorno).

Exercícios relacionados