Visão geral das chamadas de procedimento
Quando o arquivo executável é carregado, ele é mapeado para o espaço de armazenamento.
A pilha do usuário cresce do endereço alto para o endereço baixo.
A posição da parte inferior da pilha é determinada e o topo da pilha é especialmente colocado em um Registrador de ponteiro de pilha de registro ESP.
- teste.c
int add(int x,int y){
return x+y;
}
int caller(){
int ti = 125;
int t2 = 80;
int sum = add(t1.t2);//
return sum;
}
- P colocar parâmetros (parâmetros reais) na pilha
- A instrução de chamada coloca o endereço de retorno na pilha e transfere para o procedimento chamado para execução
- Salve o site de P (isto é, o conteúdo do registrador de uso geral usado por P) e aloque espaço para suas próprias variáveis locais
- Execute o corpo da função Q e coloque o valor de retorno em um local especial neste momento
- Q restaura o campo de P e libera o espaço da variável local
- Busque o endereço do remetente e retorne, transfira o controle para P
- Por que salvar a cena?
Porque o procedimento de chamada e o procedimento chamado usam o mesmo conjunto de registradores - Convenções de uso do registro IA-32
– Registros salvos pelo chamador:
EAX, EDX, ECX
Quando o procedimento P chama o procedimento Q, Q pode usar diretamente esses três registros sem salvar seus valores na pilha.
Se P ainda precisar usar esses três registradores após retornar de Q, P deve salvá-los antes de ir para Q e restaurar seus valores antes de usá-los após retornar de Q.
– Registradores salvos pelo callee:
EBX, ESI, EDI
Q devem primeiro salvar seus valores na pilha antes de usá-los e restaurar seus valores antes de retornar a P.–
EBP e ESP são o registrador de ponteiro de quadro e o registrador de ponteiro de pilha, respectivamente, que são usados para apontar para a parte inferior e superior do quadro de pilha atual, respectivamente.
Descrição: Quais registradores cada processo deve usar primeiro para reduzir o overhead nas fases de preparação e finalização?
EAX, ECX, EDX!
- Estágio de preparação: as três primeiras
linhas A primeira instrução sempre coloca o antigo valor EBP na pilha
Neste momento, ESP aponta aqui
Após a segunda instrução mov, EBP também aponta aqui, e a parte inferior da pilha forma
a terceira instrução de subtração, ESP -24, o topo da pilha se move, deixando espaço suficiente - Atribuir variáveis locais: 4, 5 peças
125 enviadas para o endereço de ebp-12
80 enviadas para o endereço de ebp-8 - Prepare os parâmetros de entrada: 6-9 itens
80 são enviados para ESP+4 (ou seja, atribua um valor ao parâmetro t2)
e 125 são enviados para esp (ou seja, atribua um valor a t1)
Observe que as atribuições de parâmetros formais estão em ordem, da direita para a esquerda
- chamada:
Executa o processo chamado, gire para adicionar para executar
a primeira e a segunda instruções de adicionar também são push e mov,
cada função é a mesma - Preparação de adição:
coloque o valor de EBP no chamador
para formar a parte inferior do quadro de adição. A parte inferior
da pilha é o processo de chamada desta função. Por exemplo, o chamador é o processo de chamada de adição.
A execução termina - O valor de retorno é sempre em EAX
- Após o retorno da chamada, o endereço da próxima instrução é sempre colocado na pilha.
O endereço de retorno é na verdade o endereço de mov na quarta última linha.
Quando ret é executado, ret busca o endereço de retorno e o envia para o registrador EIP ( computador) - Colocar o valor de retorno na soma
- return sum coloca o valor de sum no registrador EAX
- Etapa final: os dois últimos itens
restauram a cena, resta retornar a pilha
, tornar ESP igual a EBP, e todo o conteúdo do meio é perdido,
depois pop o conteúdo apontado por ESP para EBP, ou seja, restaurar o parte inferior da pilha da função anterior
e, em seguida, ESP aponta para a unidade anterior, que é o endereço de retorno. retornar à função anterior
Processo geral da função C
– estágio de preparação
• forma a parte inferior do quadro: instrução push e instrução mov
• gera quadro de pilha (se necessário): subinstrução ou instrução e
• salva a cena (se houver um registrador de salvamento do callee): instrução mov
– procedimento (função ) corpo
• Alocar espaço variável local e atribuir valores
• Lógica de processamento específica, se uma chamada de função for encontrada
- Preparar parâmetros:
enviar parâmetros reais para os parâmetros de entrada do quadro de pilha
- Instrução CALL:
salvar o endereço de retorno e transferir para o função chamada
• Preparar parâmetros de retorno em EAX
– estágio final
• Desempilhar: deixar instrução ou instrução pop
• Pegar o endereço de retorno e retornar: instrução ret
Referência: NTU Computer System Fundamentals (1)