Parte 1: Organização de Computadores 7. Compilando programas Texto base: capítulo 3 Computer Organization and Design: The Hardware/Software Interface J.L. Hennessy e D.A. Patterson IC - UFF
MIPS: Visão do programador Alguns registradores (32 bits) $s0 - $s7: uso geral, preservados $t0 - $t9: temporários, não preservados $sp: apontador de pilha, preservado $ra: endereço de retorno, preservado $a0 - $a3: argumentos, não preservados $v0 - $v1: valores de retorno, não preservados IC - UFF
Algumas instruções IC - UFF
Formato das instruções IC - UFF
Um pequeno segmento em C Variáveis a e colocadas nos registradores $s1 $s5 pelo compilador IC - UFF
Um pequeno segmento em C Variáveis a e colocadas nos registradores $s1 $s5 pelo compilador IC - UFF
Um pouco mais de complexidade Variáveis f j em $s0 $s4 IC - UFF
Um pouco mais de complexidade Variáveis f j em $s0 $s4 IC - UFF
Um operando em memória A é um array de 100 posições; g e h estão em $s1 e $s2; endereço de base de A está em $s3 IC - UFF
Um operando em memória A é um array de 100 posições; g e h estão em $s1 e $s2; endereço de base de A está em $s3 ? IC - UFF
Ainda outro array A é um array de 100 posições; h está em $s2; endereço de base de A está em $s3 IC - UFF
Ainda outro array A é um array de 100 posições; h está em $s2; endereço de base de A está em $s3 IC - UFF
Array com índice variável A é um array de 100 posições; g, h e i estão em $s1, $s2 e $s4; endereço de base de A está em $s3 IC - UFF
Array com índice variável A é um array de 100 posições; g, h e i estão em $s1, $s2 e $s4; endereço de base de A está em $s3 IC - UFF
Outras instruções IC - UFF
Tomando decisões i e j estão em $s3 e $s4; f, g e h estão em $s0, $s1 e $s2 IC - UFF
Tomando decisões i e j estão em $s3 e $s4; f, g e h estão em $s0, $s1 e $s2 IC - UFF
Loop e índice variável A é um array de 100 posições; g, h, i e j estão em $s1, $s2, $s3 e $s4; endereço de base de A está em $s5. Ex: IC - UFF
Código do exemplo do Loop IC - UFF
Evitando o go to: while save é um array; i, j e k estão em $s3, $s4 e $s5; base de save está em $s6. Ex: IC - UFF
Código do exemplo com while IC - UFF
Mais algumas instruções IC - UFF
E o switch? Variáveis f a k estão de $s0 a $s5; $t2 contém 4; $zero = 0 IC - UFF
Código para o switch IC - UFF
Utilizando procedures Alocação de registros para passagem de parametros e valores $a0 - $a3: passagem de argumentos $v0 - $v1: retorno de valores $ra: endereço de retorno nova instrução: jal ProcedureAddress (salva endereço da próxima instrução em $ra) mais parametros/valores: uso da pilha IC - UFF
Procedures: um caso simples IC - UFF
Código MIPS: proc_simples IC - UFF
Recursividade Cálculo de fatorial IC - UFF
Código MIPS: fatorial IC - UFF
Arrays x ponteiros IC - UFF
Código clear1 e clear2 IC - UFF
Um pouco mais rápido ... IC - UFF
Pseudo-instruções A linguagem de montagem pode ter instruções que não sejam implementadas em hardware: pseudo-instruções Exemplo: move $t0, $t1 # $t0 $t1 ( a MIPS!) add $t0, $zero, $t1 # equivalente ao move IC - UFF
Transformando *.c em *.exe programa C programa fonte IC - UFF
Transformando *.c em *.exe programa C compilador programa assembly IC - UFF
Transformando *.c em *.exe programa C compilador programa assembly linguagem de máquina! montador módulo objeto IC - UFF
Transformando *.c em *.exe programa C compilador programa assembly linguagem de máquina! montador módulo objeto routina de biblioteca IC - UFF
Transformando *.c em *.exe programa C compilador podemos ter vários módulos objeto e várias rotinas de biblioteca programa assembly montador módulo objeto routina de biblioteca IC - UFF
Transformando *.c em *.exe programa C linguagem de máquina! compilador programa assembly módulo executável montador ligador módulo objeto routina de biblioteca IC - UFF
Transformando *.c em *.exe programa C compilador programa assembly montador módulo objeto ligador routina de biblioteca módulo executável carregador memória IC - UFF
Olhando cada fase . . . Identificação dos arquivos: Compilação Unix: arq.c, arq.s, arq.o, a.out MS-DOS: arq.c, arq.asm, arq.obj, arq.exe Compilação código objeto pode ser produzido diretamente fases IC - UFF
Montagem Transforma um programa em linguagem de montagem em um programa objeto: instruções de máquina, dados e informações para colocação das instruções em memória Tabela de símbolos: associação entre rótulos e seus endereços IC - UFF
Arquivo objeto (e.g., Unix) Cabeçalho: tamanho e posição dos componentes do arquivo objeto Segmento de texto: código de máquina Segmento de dados: dados estáticos e dinâmicos Inf. de relocação: identifica instruções e palavras de dados que dependem de endereços absolutos quando programa é carregado IC - UFF
Arquivo objeto (cont.) Tabela de símbolos: símbolos que não foram resolvidos (referências externas) Informação para depuração: possibilita associação entre instruções em C e instruções de máquina; facilita a leitura de estruturas de dados IC - UFF
Um arquivo objeto IC - UFF
Ligação Compilação separada: necessidade do ligador Ligador pega um programa objeto e produz um módulo carregável Ligação dinâmica em tempo de carregamento: incorporação de novas versões; compartilhamento de código Ligação dinâmica em tempo de execução: só aloca memória p/ o que for usado; instalação de módulos não existentes quando da programação da aplicação IC - UFF
Carregamento Definição de endereçamento: carregamento absoluto limitado: problema com modificações carregamento relocável problema: memória virtual (swapping) carregamento dinâmico em tempo de execução IC - UFF
Um programa na memória IC - UFF
Leitura suplementar Apêndice A, itens A1 até A6, Computer Organization and Design: The Hardware/Software Interface, J.L. Hennessy e D.A. Patterson Apêndice 7A, Operating Systems: Internals and Design Principles, W. Stallings IC - UFF