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:
- Como funciona a pilha (stack) no x86.
- 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 é
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).