Transcript

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


Top Related