procedimentosprocedimentos - início - instituto de ...simone/scminter/contaulas/8_proc.pdf ·...
TRANSCRIPT
Sistemas de Computação
ProcedimentosProcedimentos
Sistemas de Computação
Chamada de Procedimentos
• Utilização de procedimentos:– Facilitar entendimento do programa– Reutilização de código
• Passos necessários para execução de um procedimento:
– Os parâmetros a serem acessados pelo procedimento são disponibilizados
– Controle é transferido para o procedimento– Recursos de memória são garantidos ao procedimento– A tarefa desejada é realizada pelo procedimento– Resultado do procedimento é disponibilizado– Controle é retornado para o ponto de origem
Sistemas de Computação
Chamada de Procedimentos
• Registradores utilizados na implementação de procedimentos em MIPS:
– $a0-$a3: quatro registradores para argumentos para o procedimento
– $v0-$v1: dois registradores para retorno dos valores do procedimento
– $ra: endereço de retorno ao final do procedimento
• Instrução para desviar para início de procedimento:
– jal endereço-do-procedimento
Sistemas de Computação
Chamada de Procedimentos
• Um registrador denominado PC (Program Counter) armazena o endereço da instrução corrente
• Registrador $ra armazena valor do PC somado ao número de bytes da instrução de desvio para o procedimento
Endereço Instrução
100 call X(a,b,c,d)
104 instr Y
X instr K
instr L
PC = 100
$ra = 104
Sistemas de Computação
Chamada de Procedimentos
• Programa que chama o procedimento:– Coloca os parâmetros em $a0-$a3– Executa a instrução jal X
• Procedimento chamado:– Efetua o processamento necessário– Armazena os resultados em $v0-$v1– Retorna o controle através da execução da instrução jr $ra
Sistemas de Computação
Chamada de Procedimentos
• Procedimento pode precisar de mais registradores
• Registradores utilizados pelos procedimentos necessitam ser restaurados na volta
• Utilização de uma pilha em memória que contém os dados que não podem ser armazenados no registradores disponíveis
• Operação de push para colocar dado e pop para remover
• Registrador para armazenar o topo da pilha $sp (stack pointer)
Sistemas de Computação
Chamada de Procedimentos
Segmento do programa em C Segmento do Programa em
MIPS int ex1 (int g, int h, int j, int i) { int f: f= (g + h) – (i + j); return f; }
ex1: subi $sp,$sp,12 sw $t1,8($sp) sw $t0, 4($sp) sw $s0,0($sp) add $t0,$a0,$a1 add $t1,$a2,$a3 sub $s0,$t0,$t1 add $v0,$s0,$zero lw $s0, 0($sp) lw $t0,4($sp) lw $t1,8($sp) addi $sp,$sp,12 jr $ra
Sistemas de Computação
Chamada de Procedimentos
$sp
$sp
$sp
a. b. c.Memória baixa
Conteúdo de $t1
Conteúdo de $t0
Memória alta
Conteúdo de $s0
Sistemas de Computação
Procedimentos aninhados
• Procedimentos que chamam outros procedimentos
• Exemplo:– Programa principal:
addi $a0, $zero, 3 # coloca 3 em $a0
jal A
– Procedimento A:addi $a0, $zero, 7 # coloca 7 em $a0, mas não uso valor em $a0
jal B # perdeu endereço de retorno ($ra) ao programa principal
– Solução: Salvar registradores na pilha
Sistemas de Computação
Procedimentos aninhados
• Procedimento fatorial em Cint fact (int n)
{
if (n<1) return (1);
else return (n*fact(n-1));
{
• Procedimento fatorial em MIPSfact: sub $sp, $sp, 8
sw $ra, 4($sp)sw $a0, 0($sp)slt $t0, $ao, 1beq $t0, $zero, L1add $v0, $zero, 1add $sp, $sp, 8jr $ra
L1: sub $a0, $a0, 1jal factlw $a0, 0($sp)lw $ra, 4($sp)add $sp, $sp, 8mul $v0, $a0, $v0jr $ra
Sistemas de Computação
Chamada de Procedimentos
• Variáveis locais são armazenadas na pilha: registro de ativação
b.
$sp
$sp
$sp
c.
$fp
$fp
a.
End. de retorno
Reg. de arg .salvos
Arrays e estruturas locais
Reg. de arg .salvos
Memória alta
Memória baixa
Sistemas de Computação
Programa em linguagem
de montagem
Processo de Compilação e Execução
Programa em CCompilador
Montador
Módulo em linguagem de
máquina Ligador
ExecutávelCarregador
Bibliotecas
Memória
Sistemas de Computação
Interpretador
• Realiza tradução, ligação e execução comando a comando do programa fonte
• Não gera nenhum produto intermediário (código objeto, código executável)
Sistemas de Computação
Interpretação versus Compilação
• Programas interpretados necessitam de mais memória que programas executáveis
• Programas interpretados são mais lentos
• Interpretação facilita identificação de erros no programa fonte, tanto na etapa de conversão como na execução (inconsistência de tipos, etc)
• Ideal: desenvolver em interpretadores e depois disponibilizar um executável
Sistemas de Computação
Montador
• Um montador traduz um arquivo contendo comandos da linguagem de montagem em um outro arquivo contendo instruções e dados em formato binário
Arquivo-fonte
Arquivo-fonte
Montador
Montador
Arquivo-objeto
Arquivo-objeto
Ligador Arquivo-executável
Sistemas de Computação
Montador
• Montador em dois passos (lê o arquivo fonte duas vezes) :
– Primeiro passo: descobre endereço dos labels– Segundo passo: traduz cada comando da linguagem de montagem
para uma instrução de máquina, associando seqüências numéricas a códigos de operação, a indicadores de registradores e a labels
• Montador armazena o nome do label e seu endereço na tabela de símbolos
Sistemas de Computação
Montador
• Montador em um passo (lê o arquivo fonte uma vez):
– Em uma única leitura, uma representação binária é construída– Quando aparece um label não definido, gravam-se o label e a
instrução em um tabela– Quando label é definido, tabela é consultada para saber as
instruções que se referenciam a ele – Montador volta para trás para completar instruções– Toda representação binária tem que estar em memória
Sistemas de Computação
Montador
• Montadores produzem arquivos-objeto:– cabeçalho: descreve o tamanho e posição das outras partes do
arquivo– segmento de texto: contém o código em linguagem de máquina– segmento de dados: contém representação binária dos dados do
arquivo-fonte– informações sobre relocação: identificam as instruções que
dependem de endereços absolutos e que devem ser relocados– tabela de símbolos: associa endereços a labels externos e
referências não resolvidas– informações para análise de erros: informações para depuradores
Sistemas de Computação
Ligadores e Carregadores
• Código objeto não é suficiente para ser executado
• Tarefas a serem executadas– Resolução de referências simbólicas (ligação)– Ajuste de endereços (relocação)– Alocação de espaço em memória (alocação)– Colocação das instruções e dados fisicamente na memória (carga)
• Código Objeto– Absoluto: os endereços constantes do código são endereços reais
de memória– Relocável: os endereços são relativos ao início do programa,
transformando-se em endereços reais apenas na execução mais flexível e mais utilizado!
Sistemas de Computação
Ligador
• Rotinas comuns são agrupadas em bibliotecas• Ligador resolve as referências externas
– Agrega o código objeto das bibliotecas a serem utilizadas, criando um único módulo de carga
– Substitui chamadas a procedimentos por seus endereços
• Relocação União dos espaços de endereçamento de cada módulo objeto
• Gera código executável (ou módulo de carga)• DLL (Dynamic Link Library)
– Os procedimentos só são ligados em tempo de execução Ligador Dinâmico
Sistemas de Computação
Alocação de memória no MIPS
Dados estáticos
Dados dinâmicos
Reservado
Texto
Memória alta
Memória baixa
$sp 7fff fffc Stack
0
pc 0040 0000
$gp 1000 8000
1000 0000
Sistemas de Computação
Código objeto
CabeçalhoNome Procedimento ATamanho do texto 100hexa
Tamanho dos dados 20hexa
Código Endereço Instrução0 lw $a0, 0($gp)4 jal 0… …
Dados 0 (X)… …
Relocação Endereço Tipo de Instr. Dependência0 lw X4 jal B
Tabela desímbolos
Label Endereço
X ---B ---
Sistemas de Computação
Código objeto
cabeçalhoNome Procedimento BTamanho do texto 200hex
Tamanho dos dados 30hex
Código Endereço Instrução0 sw $a1, 0($gp)4 jal 0--- ---
Dados 0 (Y)--- ---
Relocação Endereço0 sw4 jal 0
Tabela de símbolos Label EndereçoY ---A ---
Sistemas de Computação
Código executável
cabeçalhoTamanho do texto 300hex
Tamanho dos dados 50hex
Código Endereço Instrução0040 0000hex lw $a0, 8000hex($gp)0040 0004hex jal 40 0100hex
--- ---0040 0100hex sw $a1, 8020hex($gp)0040 0104hex jal 40 0000hex
--- ---Dados Endereço
1000 0000hex (X)--- ---1000 0020hex (Y)--- ---
Sistemas de Computação
Carregador
• O carregador carrega o módulo executável na memória e executa as seguintes funções:
– Lê cabeçalho do arquivo executável para determinar tamanho dos segmentos de código e dados
– Cria espaço para armazenar código e dados– Copia instruções e dados para a memória– Copia os parâmetros para a pilha do programa principal– Inicializa registradores e apontador da pilha para primeiro
endereço livre– Desvia para rotina de inicialização que copia os parâmetros nos
registradores de argumento e chama rotina principal. Quando a rotina principal retorna, chama rotina do sistema