Função (procedimento) chamar representação em nível de máquina (1)

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.
1
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;
 }
  • Passos

  1. P colocar parâmetros (parâmetros reais) na pilha
  2. A instrução de chamada coloca o endereço de retorno na pilha e transfere para o procedimento chamado para execução
  3. 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
  4. Execute o corpo da função Q e coloque o valor de retorno em um local especial neste momento
  5. Q restaura o campo de P e libera o espaço da variável local
  6. 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!

  • Alterações em pilhas e quadros de pilha

2

  • A representação em nível de máquina da função acima

3

4

  • 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)

Acho que você gosta

Origin blog.csdn.net/weixin_61631200/article/details/127407334
Recomendado
Clasificación