IC - UFF Parte 1: Organização de Computadores 7. Compilando programas Texto base: capítulo 3...
Transcript of IC - UFF Parte 1: Organização de Computadores 7. Compilando programas Texto base: capítulo 3...
IC - UFF
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
Categoria Instrução Exemplo SignificadoAritmética add add $s1,$s2,$s3 $s1 = $s2 + $s3
subtract sub $s1,$s2,$s3 $s1 = $s2 - $s3Transf. de dados load word lw $s1,100($s2) $s1=memo[$s2+100]
store word sw $s1,100($s2) memo[$s2+100]=$s1
IC - UFF
Formato das instruções
Formato tipo Rop rs rt rd shamt funct
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits
Formato tipo Iop rs rt endereço
6 bits 5 bits 5 bits 16 bits
Campo Significadoop código da operaçãors registro fonte do primeiro operandort registro fonte do segundo operandord registro destino do operando
shamt número de bits deslocadosfunct função; indica a variante do código de operação
IC - UFF
Um pequeno segmento em C
Variáveis a e colocadas nos registradores $s1 $s5 pelo compilador
Código C Código MIPS
a = b + c;d = a – e;
IC - UFF
Um pequeno segmento em C
Variáveis a e colocadas nos registradores $s1 $s5 pelo compilador
Código C Código MIPS
a = b + c; add $s1,$s2,$s3d = a – e; sub $s4,$s1,$s5
IC - UFF
Um pouco mais de complexidade
Variáveis f j em $s0 $s4
Código C Código MIPS
f = (g + h) – (i + j);
IC - UFF
Um pouco mais de complexidade
Variáveis f j em $s0 $s4
Código C Código MIPS
f = (g + h) – (i + j); add $t0,$s1,$s2add $t1,$s3,$s4sub $s0,$t0,$t1
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
Código C Código MIPS
g = h + A[8];
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
Código C Código MIPS
g = h + A[8]; lw $t0,32($s3)add $s1,$s2,$t0
?
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
Código C Código MIPS
A[12] = h + A[8];
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
Código C Código MIPS
A[12] = h + A[8]; lw $t0,32($s3)add $t0,$s2,$t0sw $t0,48($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
Código C Código MIPS
g = h + A[i];
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
Código C Código MIPS
g = h + A[i]; add $t1,$s4,$s4add $t1,$t1,$t1add $t1,$t1,$s3lw $t0,0($t1)add $s1,$s2,$t0
IC - UFF
Outras instruções
Categoria Instrução Exemplo SignificadoSalto condicional beq beq $s1,$s2,L if($s1== $s2) go to L
bne bne $s1,$s2,L if($s1!= $s2) go to LSalto incond. j j End go to End
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
Código C Código MIPS
if (i == j) f = g + h;else f = g - h;
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
Código C Código MIPS
if (i == j) bne $s3,$s4,Else f = g + h; add $s0,$s1,$s2else j Exit f = g - h; Else: sub $s0,$s1,$s2
Exit:
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:
Loop: g = g + A[i];i = i + j;if (i != h) go to Loop;
IC - UFF
Código do exemplo do Loop
Loop: add $t1, $s3, $s3add $t1, $t1, $t1add $t1, $t1, $s5lw $t0, 0($t1)add $s1, $s1, $t0add $s3, $s3, $s4bne $s3, $s2, 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:
while (save[i] == k) i = i + j;
IC - UFF
Código do exemplo com while
Loop: add $t1, $s3, $s3add $t1, $t1, $t1add $t1, $t1, $s6lw $t0, 0($t1)bne $t0, $s5, Exitadd $s3, $s3, $s4j Loop
Exit:
IC - UFF
Mais algumas instruções
Categoria Instrução Exemplo SignificadoSalto condicional slt slt $s1,$s2,$s3 if($s2<$s3) $s1=1;
else $s1=0Salto incond. j r j $t0 go to (Reg)
IC - UFF
E o switch?
Variáveis f a k estão de $s0 a $s5; $t2 contém 4; $zero = 0
switch (k) {case 0: f = i + j; break;case 1: f = g + h; break;case 2: f = g - h; break;case 3: f = i - j; break;
}
IC - UFF
Código para o switchslt $t3, $s5, $zerobne $t3, $zero, Exitslt $t3, $s5, $t2beq $t3, $zero, Exitadd $t1, $s5, $s5add $t1, $t1, $t1add $t1, $t1, $t4lw $t0, 0($t1) # ($t0)=JumpTable[k]jr $t0
L0: add $s0, $s3, $s4j Exit
L1: add $s0, $s1, $s2j Exit
L2: sub $s0, $s1, $s2j Exit
L3: sub $s0, $s3, $s4Exit:
obs.: os endereços dos rótulos L0 L3 encontram-se emquatro palavras seqüenciais começando no endereçoindicado em $t4
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
int proc_simples (int g, int h, int i, int j){
int f;
f = (g + h) – (i + j);return f;
}
IC - UFF
Código MIPS: proc_simplesproc_simples:
sub $sp, $sp, 12sw $t1, 8($sp)sw $t0, 4($sp)sw $s0, 0($sp)add $t0, $a0, $a1add $t1, $a2, $a3sub $s0, $t0, $t1add $v0, $s0, $zerolw $s0, 0($sp)lw $t0, 4($sp)lw $t1, 8($sp)add $sp, $sp, 12jr $ra
IC - UFF
Recursividade
Cálculo de fatorialint fat (int n){
if (n < 1)return (1);
elsereturn (n * fat(n-1));
}
IC - UFF
Código MIPS: fatorialfat:
sub $sp, $sp, 8sw $ra, 4($sp)sw $a0, 0($sp) # salva nslt $t0, $a0, 1beq $t0, $zero, L1 # se n>=1, vá p/ L1add $v0, $zero, 1add $sp, $sp, 8jr $ra
L1: sub $a0, $a0, 1 # n = n - 1jal fat # chama fat(n-1)lw $a0, 0($sp)lw $ra, 4($sp)addi $sp, $sp, 8mult $v0, $a0, $v0 # retorna n*fat(n-1)jr $ra
IC - UFF
Arrays x ponteiros
clear1 (int array[], int size){
int i;for (i = 0; i < size; i++)
array[i] = 0;}
clear2 (int *array, int size){
int *p;for (p = &array[0]; p <&array[size]; p++)
*p = 0;}
IC - UFF
Código clear1 e clear2
move $t0, $zero move $t0, $a0loop1: add $t1, $t0, $t0 loop2: sw $zero, 0($t0)
add $t1, $t1, $t1 addi $t0, $t0, 4add $t2, $a0, $t1 add $t1, $a1, $a1sw $zero, 0($t2) add $t1, $t1, $t1addi $t0, $t0, 1 add $t2, $a0, $t1slt $t3, $t0, $a1 slt $t3, $t0, $t2bne $t3, $zero, loop1 bne $t3, $zero, loop2
IC - UFF
Um pouco mais rápido ...
move $t0, $zero move $t0, $a0loop1: add $t1, $t0, $t0 add $t1, $a1, $a1
add $t1, $t1, $t1 add $t1, $t1, $t1add $t2, $a0, $t1 add $t2, $a0, $t1sw $zero, 0($t2) loop2: sw $zero, 0($t0)addi $t0, $t0, 1 addi $t0, $t0, 4slt $t3, $t0, $a1 slt $t3, $t0, $t2bne $t3, $zero, loop1 bne $t3, $zero, loop2
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 *.exeprograma C
programafonte
IC - UFF
Transformando *.c em *.exeprograma C
compilador
programa assembly
IC - UFF
Transformando *.c em *.exeprograma C
compilador
programa assembly
montador
módulo objeto
linguagem demáquina!
IC - UFF
Transformando *.c em *.exeprograma C
compilador
programa assembly
montador
módulo objeto routina de biblioteca
linguagem demáquina!
IC - UFF
Transformando *.c em *.exeprograma C
compilador
programa assembly
montador
módulo objeto routina de biblioteca
podemos ter váriosmódulos objeto evárias rotinas de
biblioteca
IC - UFF
Transformando *.c em *.exeprograma C
compilador
programa assembly
montador
módulo objeto
ligador
routina de biblioteca
módulo executável
linguagem demáquina!
IC - UFF
Transformando *.c em *.exeprograma 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: 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
CabeçalhoNome Procedure A
Tamanho do texto 10016
Tamanho dos dados 2016
Segmento de texto Endereço Instrução0 lw $a0, 0($gp)4 jal 0... ...0 (X)Segmento de dados... ...
Inf. de relocação Endereço Tipo de instrução Dependência0 lw X4 jal B
Tabela de símbolos Rótulo EndereçoX -B -
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
$sp Pilha
Dados dinâmicos
Dados estáticos
Texto$pc
PCB
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