Escolar Documentos
Profissional Documentos
Cultura Documentos
Paulo C. Centoducatte
Ch3-1
Conjunto de Instrues
Instruo uma palavra da linguagem de mquina ISA (Instruction Set Architecture) Conjunto de instrues de uma mquina ISA MIPS 3 formatos de instrues instrues de 3 operandos
Programa em C a = b + c; d = a c; f = ( g + h ) ( i + j );
Assembly MIPS add a,b,c sub d,a,c add t0,g,h add t1,i,j sub f,t0,t1 o compilador cria t0 e t1 .
? 1998 Morgan Kaufmann Publishers
Paulo C. Centoducatte
Ch3-2
Programa em C f = ( g + h ) ( i + j );
Paulo C. Centoducatte
Ch3-3
Ch3-4
Soluo Primeiro devemos carregar um registrador temporrio com A[8]: lw $t0, 8($s3) # registrador temporrio $t0 recebe A[8] Agora basta executar a operao: add $s1,$s2,$t0 # g = h + A[8]
Paulo C. Centoducatte
Ch3-5
: PROCESSADOR 12 8
: 100 10
4 0 ENDEREOS MEMRIA
101 1 DADOS
Paulo C. Centoducatte
Ch3-6
? Exemplo: Suponha que h seja associado com o registrador $s2 e o endereo base do array A armazenado em $s3. Qual o cdigo MIPS para o comando A[12] = h + A[8];?
Soluo: lw $t0,32($s3) add $t0,$s2,$t0 sw $t0,48($s3) # $t0 recebe A[8] # $t0 recebe h + A[8] # armazena o resultado em A[12]
Paulo C. Centoducatte
Ch3-7
Exemplo: Supor que o ndice seja uma varivel: g = h + A[i]; onde: i associado a $s4, g a $s1, h a $s2 e o endereo base de A a $s3.
Soluo add $t1,$s4,$s4 add $t1,$t1,$t1 add $t1,$t1,$s3 lw $t0,0($t1) add $s1,$s2,$t0
Paulo C. Centoducatte
# $t1 recebe 4*i ( porque ??? ) # $t1 recebe o endereo de A[i] # $t0 recebe a[i]
Ch3-8
Paulo C. Centoducatte
Ch3-9
Formato de Instrues
Formato da instruo add $t0,$s1,$s2
0 17 18 8 0 32
cdigo da adio
$s1
$s2
$t0
6 bits
5 bits
5 bits
5 bits
op ? operao bsica da instruo (opcode) rs ? o primeiro registrador fonte rt ? o segundo registrador fonte rd ? o registrador destino shamt ? shift amount, para instrues de deslocamento funct ? function. Seleciona variaes das operao especificada pelo opcode
Paulo C. Centoducatte
? 1998 Morgan Kaufmann Publishers
Ch3-10
Paulo C. Centoducatte
Exemplo: D o cdigo assembly do MIPS e o cdigo de mquina para o seguinte comando em C: A[300] = h + A[300]; , onde $t1 tem o endereo base do vetor A e $s2 corresponde a h.
lw $t0,1200($t1) # $t0 recebe A[300] add $t0,$s2,$t0 # $t0 recebe h + A[300] sw $t0,1200($t1) # A[300] recebe h + A[300] ? Linguagem de mquina Op 35 0 43 rs 9 18 9 rt 8 8 8 rd 8 end/shamt 1200 0 1200 funct 32
Paulo C. Centoducatte
Ch3-12
Paulo C. Centoducatte
Ch3-13
Paulo C. Centoducatte
Ch3-14
Exemplo - Compilando um comando IF. Seja o comando abaixo: if ( i == j ) go to L1; f = g + h; L1: f = f - i; Supondo que as 5 variveis correspondam aos registradores $s0..$s4, respectivamente, como fica o cdigo MIPS para o comando? Soluo beq $s3,$s4,L1 add $s0,$s1,$s2 L1: sub $s0,$s0,$s3
Paulo C. Centoducatte
Ch3-15
Ch3-16
Loops
Usando IF Exemplo Loop: g = g + A[i]; i = i + j; if ( i != h ) go to Loop Soluo Loop: add $t1,$s3,$s3 add $t1,$t1,$t1 add $t1,$t1,$s5 lw $t0,0($t1) add $s1,$s1,$t0 add $s3,$s3,$s4 bne $s3,$s2,Loop
Paulo C. Centoducatte
# $t1 = 2 * i # $t1 = 4 * i # $t1 recebe endereo de A[i] # $t0 recebe A[i] # g = g + A[i] #i=i+j # se i != h v para Loo
? 1998 Morgan Kaufmann Publishers
Ch3-17
Usando while
Exemplo while (save[i] == k) i = i + j; Soluo Para i,j e k correspondendo a $s3,$s4 e $s5, respectivamente, e o endereo base do array em $s6, temos: Loop: add add add lw bne add j $t1,$s3,$s3 $t1,$t1,$t1 $t1,$t1,$s6 $t0,0($t1) $t0,$s5,Exit $s3,$s3,$s4 Loop # $t1 = 2 * i # $t1 = 4 * i # $t1 = endereo de save[i] # $t0 recebe save[i] # va para Exit se save[i] != k #i=i+j
Exit:
Paulo C. Centoducatte
? 1998 Morgan Kaufmann Publishers
Ch3-18
slt reg_temp, reg1, reg2 se reg1 menor que reg2, reg_temp setado, caso contrrio resetado. Nos processadores MIPS o registrador $0 possui o valor zero ($zero). Exemplo: Compilando o teste less than Soluo: slt $t0,$so,$s1 # $t0 setado se $s0 < $s1 bne $t0,$zero,Less # v para Less, se $t0 != 0 , ou seja a<b
Paulo C. Centoducatte
Ch3-19
Exemplo Compilando o case/switch Seja o comando abaixo: switch (k) { case 0: f = f + j; break; case 1: f = g + h; break; }
Paulo C. Centoducatte
Ch3-20
Soluo: supor que $t2 tenha 2 e f..k = $s0..$s5, respectivamente. slt $t3,$s5,$zero bne $t3,$zero,Exit slt $t3,$s5,$t2 beq $t3,$zero,Exit add add $t1,$s5,$s5 $t1,$t1,$t1 # teste se k < 0 # se k < 0 v para Exit # teste se k < 2 # se k>=2 v para Exit # $t1 = 2 * k # $t1 = 4 * k
# assumindo que 4 palavras na memria, comeando no endereo contido em $t4, tem endereamento correspondente a L0, L1, L2 add $t1,$t1,$t4 # $t1 = endereo de tabela[k] lw $t0,0($t1) # $t0 = tabela[k] jr $t0 # salto para endereo carregado em $t0 L0: add $s0,$s3,$s4 j Exit L1: add $s0,$s1,$s2 Exit:
Paulo C. Centoducatte
? 1998 Morgan Kaufmann Publishers
Ch3-21
Paulo C. Centoducatte
Ch3-22
Paulo C. Centoducatte
Ch3-23
Suporte a Procedimentos
? Para a execuo de um procedimento deve-se: Colocar os parmetros em um local onde o procedimento possa acess-los Transferir o controle ao procedimento Adquirir os recursos necessrios ao procedimento Executar a tarefa Colocar o resultado em um local onde o programa possa acess-lo Retornar o controle ao ponto onde o procedimento foi chamado
Paulo C. Centoducatte
Ch3-24
? Para este mecanismo, o MIPS aloca seus registradores, para chamada de procedimentos, da seguinte maneira: $a0 .. $ a3 ? 4 registradores para passagem de argumentos $v0 .. $v1 ? para retornar valores $ra ? para guardar o endereo de retorno Instruo para chamada de procedimento jal End_proc - (jump-and-link) ? desvia para o procedimento e salva o endereo de retorno (PC+4) em $ra (return address - $31) ? Instruo para retorno de chamada de procedimento jr $ra ? desvia para o ponto de onde foi chamado o procedimento
Paulo C. Centoducatte
Ch3-25
? Qual o problema para chamadas aninhadas ==. $ra destrudo. ? Qual a soluo ? utilizar uma pilha (LIFO)
SP
stack
Paulo C. Centoducatte
Ch3-26
Exemplo: Os parmetros g, h, i e j correspondem a $a0 .. $a3, respectivamente e f a $s0. Antes precisaremos salvar $s0, $t0 e $t1 na pilha, pois sero usados no procedimento
Exemplo Seja o procedimento abaixo: int exemplo (int g, int h, int i, int j) { int f; f = (g + h) (i + j); return f; }
Paulo C. Centoducatte
? 1998 Morgan Kaufmann Publishers
Ch3-27
# ajuste do sp para empilhar 3 palavras # salva $t1 na pilha # salva $t0 na pilha # salva $s0 na pilha
No procedimento add $t0,$a0,$a1 add $t1,$a2,$a3 sub $s0,$t0,$t1 Para retornar o valor f add $v0,$s0,$zero Antes do retorno necessrio restaurar os valores dos registradores salvos na pilha lw $s0, 0($sp) lw $t0, 4($sp) lw $s1, 8($sp) add $sp,$sp,12 Retornar jr $ra
Paulo C. Centoducatte
? 1998 Morgan Kaufmann Publishers
Ch3-28
H address igh
$sp C ontents of register $t1 C ontents of register $t0 $sp C ontents of register $s0
$sp
Lowaddress
a.
b.
c.
Paulo C. Centoducatte
Ch3-29
? Observaes $t0 .. $t9 ? 10 registradores temporrios que no so preservados em uma chamada de procedimento $s0 .. $s7 ? 8 registradores que devem ser preservados em uma chamada de procedimento
Exemplo procedimento recursivo Int fact (int n) { if (n<1) return(1); else return (n*fact(n-1)); }
Paulo C. Centoducatte
Ch3-30
Supor n correspondente a $a0 fact: sub $sp,$sp,8 sw $ra,4($sp) sw $a0,0(sp) slt $t0,$a0,1 beq $t0,$zero,L1 add add jr L1: sub jal $v0,$zero,1 $sp,$sp,8 $ra $a0,$a0,1 fact
# ajuste da pilha # salva o endereo de retorno #salva o argumento n #teste para n<1 #se n>=1, v para L1 #retorna 1 se n < 1 #pop 2 itens da pilha
#retorna n*fact(n-1)
Paulo C. Centoducatte
Ch3-31
? Alocao de espao para novos dados O segmento de pilha que contm os registradores do procedimento salvos e as variveis locais chamado de procedure frame ou activcation record. O registrador $fp usado para apontar para a primeira palavra deste segmento.
? Figura 3.11 O que preservado ou no numa chamada de procedimento. Registradores Preservados Registradores No Preservados Salvos: $s0-$s7 Temporrios: $t0-$t7 Apontador para pilha: $sp Argumentos: $a0-$a3 Endereo de retorno: $ra Valores de Retorno: $v0-$v1 Pilha acima do Apontador para Pilha abaixo do Apontador pilha para pilha
Paulo C. Centoducatte
Ch3-32
High address
$fp $fp
$sp $fp Saved argument registers (if any) Saved return address Saved saved registers (if any)
$sp
Low address
a. b. c.
Paulo C. Centoducatte
Ch3-33
? Figura 3.13 Conveno de registradores no MIPS Nome Nmero Uso Preservado em chamadas? $zero 0 Constante 0 n.d $v0-$v1 2-3 Resultados e avaliaes de No expresses $a0-$a3 4-7 Argumentos Sim $t0-$t7 8-15 Temporrios No $s0-$v7 16-23 Salvos Sim $t8-$t9 24-25 Temporrios No $gp 28 Ponteiro global Sim $sp 29 Ponteiro para pilha Sim $fp 30 Ponteiro para frame Sim $ra 31 Endereo de retorno Sim
Paulo C. Centoducatte
Ch3-34
Paulo C. Centoducatte
Ch3-35
Paulo C. Centoducatte
Ch3-36
Endereamento no MIPS
? Operandos constantes ou imediatos Para somar uma constante ou um imediato
lw
$t0,end_constante($zero) # end_constante = endereo da cosntante na memria add $sp,$sp,$t0 Observao: Outra forma permitir instrues aritmticas do tipo I (constantes com 16 bits)
Paulo C. Centoducatte
Ch3-37
Exemplo A instruo add do tipo I chamada addi ( add immediate). Para somar 4 a $sp temos:
addi $sp,$sp,4
8
opcode
29
rs
29
rt
4
imediato
Em comparaes
slti $t0,$s2,10 # $t0 =1 se $s2 < 10
Paulo C. Centoducatte
Ch3-38
Instrues de Carga
lui $t0,255 #load upper immediate
$t0
Paulo C. Centoducatte
Ch3-39
Exerccio:
Qual o cdigo MIPS para carregar uma constatnte de 32 bits no registrador $s0 ? 0000 0000 0011 1101 0000 1001 0000 0000
Soluo lui $s0,61 # 6110 = 0000 0000 0011 11012 addi $s0,$s0,2304 # 230410 = 0000 1001 0000 00002
Paulo C. Centoducatte
Ch3-40
op
6 bits
endereo
26 bits
Paulo C. Centoducatte
Ch3-41
Endereamenteo relativo ao PC
Branch (I-type)
16
17
Exit
PC ? PC + Exit
Paulo C. Centoducatte
Ch3-42
# $t1 = 2 * i # $t1 = 4 * i # $t1 = endereo de save[i] # $t0 recebe save[i] #v para Exit se save[i] != k #i = i+j
Assumindo que o loop est alocado inicialmente na posio 80000 na memria, teremos a seguinte seqncia de cdigo em linguagem de mquina:
0 0 0 35 5 0 2
19 9 9 9 8 19
19 80000 ..............................
19 9 21 8 21 20
9 9 9
0 0 0 0 8 0
32 32 32
32
Ch3-43
Exemplo Dado o branch abaixo, rescrev-lo de tal maneira a oferecer um offset maior
beq $s0,$s1,L1
Paulo C. Centoducatte
Ch3-44
Endereamento por base ou deslocamento ? o operando uma localizao de memria cujo endereo a soma de um registrador e uma constante na instruo Endereamento imediato => onde o operando uma constante na prpria instruo Endereamento relativo ao PC ? onde o endereo a soma de PC e uma constante da instruo Endereamento pseudodireto ? onde o endereo de desvio (26 bits) concatenado com os 4 bits mais significativos do PC
Paulo C. Centoducatte
? 1998 Morgan Kaufmann Publishers
Ch3-45
Register
Byte
Halfword
Word
PC
Word
PC
Word
Paulo C. Centoducatte
Ch3-46
Paulo C. Centoducatte
Ch3-47
Paulo C. Centoducatte
Ch3-48
Paulo C. Centoducatte
Ch3-49
Paulo C. Centoducatte
Ch3-50
? Traduzindo um Programa
C program
Compiler
Assembler
Linker
Loader
Memory
Paulo C. Centoducatte
Ch3-51
$sp
7fff ffff
hex
Stack
Static data
Reserved 0
? Quando da traduo de C para assembly deve-se fazer: ? alocar registradores para as variveis do programa ? produzir cdigo para o corpo do procedimento ? preservar os registradores durante a chamada do procedimento
Paulo C. Centoducatte
? 1998 Morgan Kaufmann Publishers
Ch3-52
Ch3-53
80x86
1978: The Intel 8086 is announced (16 bit architecture) 1980: The 8087 floating point coprocessor is added 1982: The 80286 increases address space to 24 bits, +instructions 1985: The 80386 extends to 32 bits, new addressing modes 1989-1995: The 80486, Pentium, Pentium Pro add a few instructions (mostly designed for higher performance) 1997: MMX is added
This history illustrates the impact of the golden handcuffs of compatibility adding new features as someone might add clothing to a packed bag an architecture that is difficult to explain and impossible to love
Paulo C. Centoducatte
? 1998 Morgan Kaufmann Publishers
Ch3-54
Ch3-55
Concluso
Erro: instrues mais poderosas aumentam desempenho VAX: CALL: salva endereo de retorno, n de parmetros, quaisquer registros modificados e valor antigo do SP instruo para apagar lista duplamente ligada IBM 360: 10 instrues mais freqentes: 80% das ocorrncias 16 instrues mais freqentes: 90% das ocorrncias 21 instrues mais freqentes: 95% das ocorrncias 30 instrues mais freqentes: 99% das ocorrncias
classe
arit. transf. dados desvio cond. jump
Paulo C. Centoducatte
MIPS
instr
add, sub, addi lw, sw, lb, sb, lui beq, bne, slt, slti j, jr, jal
gcc
48% 33% 17% 2%
spice
50% 41% 8% 1%
Ch3-56
Mquinas de 0, 1, 2 e 3 endereos
X=A*B+C*C memria onde X, A, B, C so endereos de posies de
Dois endereos Um endereo
LOAD A MULTIPLY B STORE T LOAD C MULTIPLY C ADD T STORE X MOVE T, A MULTIPLY T, B MOVE X, C MULTIPLY X, C ADD X, T
Trs endereos
MULTIPLY T, A, B MULTIPLY X, C, C ADD X, X, T
Load-Store
load R1, A load R2, B load R3, C mult R1, R1, R2 mult R3, R3, R3 add R1, R1, R3 store R1, X
AC ? AC op END
R1 ? R2 op R3
Paulo C. Centoducatte
Ch3-57
Mquinas de 0, 1, 2 e 3 endereos
Qual o melhor? tamanho do cdigo fonte tamanho do cdigo objeto tempo de execuo simplicidade e desempenho do hardware para suportar arquitetura
Paulo C. Centoducatte
Ch3-58