arquitectura de computadores

Propaganda
ARQUITECTURA DE
COMPUTADORES
CAPÍTULO II
AULA VII
Ricardo Mendão Silva
[email protected]
Índice
• Endereçamento MIPS:
• 32-bits imediatos;
• Endereços em branches e jumps;
• Modos de endereçamento;
• MARS – Exercício 5: Fibonnaci
Ricardo Mendão Silva
[email protected]
Endereçamento MIPS
Problema
Apesar de instruções MIPS 32 bits facilitarem a
implementação do hardware, por vezes é necessário
termos constantes ou endereços da mesma dimensão.
Nesta aula iremos abordar a solução geral para lidar
com grandes constantes e o modo optimizado que se
utiliza na gestão dos endereços de branches e jumps.
Ricardo Mendão Silva
[email protected]
Endereçamento MIPS
Problema
• O modo normal de adicionar um constante em MIPS é
utilizando a instrução addi.
• A instrução addi é codificada segundo o formato Itype, seguindo a seguinte formula:
I-type
Op(6)
Rs(5)
Rt(5)
address (16)
addi $t0,$s0,i
001000
sssss
ttttt
iiii iiii iiii iiii
• Como se pode verificar o máximo que se pode carregar
é uma constante de 16 bits.
Ricardo Mendão Silva
[email protected]
Endereçamento MIPS
Operandos 32 bits imediatos
• Apesar de na maioria dos casos os operandos caberem
perfeitamente em 16 bits, por vezes é necessário 32
bits para os representar.
• Como tal, existe em MIPS a instrução lui – Load
Upper Immediate - utilizada para carregar os 16 bits
mais significativos num registo.
Lui $t0, 255
001111
00000
0000 0000 1111 1111
Ricardo Mendão Silva
01000
0000 0000 1111 1111
0000 0000 0000 0000
[email protected]
Endereçamento MIPS
Operandos 32 bits imediatos
• Para completar os 16 bits menos significativos
utiliza-se o comando ori.
• Or = 1 sempre que qualquer um dos elementos for 1.
ori $t0, $t0, 254
001101
00000
0000 0000 1111 1111
Ricardo Mendão Silva
01000
0000 0000 1111 1110
0000 0000 1111 1110
[email protected]
Endereçamento MIPS
Operandos 32 bits imediatos
• Exemplo:
• Carregue a seguinte constante para MIPS:
• 0000 0000 1111 0110 0000 0001 1111 0001
lui $t0, 246
ori $t0, $t0, 497
001111
00000
01000
0000 0000 1111 0110
001101
00000
0000 0000 1111 0110
Ricardo Mendão Silva
0000 0000 1111 0110
0000 0000 0000 0000
01000
0000 0001 1111 0001
0000 0001 1111 0001
[email protected]
Endereçamento MIPS
Endereços em Branches e Jumps
• Como vimos nas aulas anteriores, a instrução jump
utiliza o formato mais simples de todos, o J-Type.
J-type
Op(6)
address (26)
j 1000
000010
00 0000 0000 0000 0011 1110 1000
• No entanto, os Branches necessitam de mais
intervenientes, nomeadamente dos registos para
comparação, sendo codificados em I-Type.
I-type
Op(6)
Rs(5)
Rt(5)
address (16)
bne $s0,$s1,EXIT
000101
10000
10001
EXIT
Ricardo Mendão Silva
[email protected]
Endereçamento MIPS
Endereços em Branches e Jumps
• Como o I-type somente suporta endereços de 16 bits,
existiria um limite de 216 instruções.
• Para resolver esta limitação, o Program Counter é
calculado com base na seguinte fórmula:
• Program Counter = Registo + Endereço do Branche
• Deste modo consegue-se um máximo de 232 instruções.
Ricardo Mendão Silva
[email protected]
Endereçamento MIPS
Endereços em Branches e Jumps
• Dado que o PC contem o endereço da instrução actual,
faz todo o sentido que se adicione o endereço do
branche a este, resultando em:
• Program Counter = Program Counter + Endereço do Branche
• Deste modo consegue-se ±215 instruções.
• A esta forma de endereçamento chama-se Endereçamento
relativo ao Program Counter.
• O MIPS, tal como todos os computadores recentes,
utiliza este tipo de endereçamento dado que por
norma o destino do branche está relativamente
próximo do mesmo.
Ricardo Mendão Silva
[email protected]
Endereçamento MIPS
Endereços em Branches e Jumps
• O MIPS,
utiliza
norma o
próximo
tal como todos os computadores recentes,
este tipo de endereçamento dado que por
destino do branche está relativamente
do mesmo.
• Por outro lado, as instruções Jump e Jump-and-link
já utilizam endereçamento directo pois com 26 bits
conseguem abranger uma serie de instruções bastante
mais vasta.
Ricardo Mendão Silva
[email protected]
Endereçamento MIPS
Endereços em Branches e Jumps
• Exemplo da Bibliografia:
Ricardo Mendão Silva
[email protected]
Endereçamento MIPS
Modos de endereçamento
• Em MIPS existem distintos modos de endereçamento,
nomeadamente:
• Endereçamento imediato – quando o operando é uma constante
inserida na instrução.
• Endereçamento de registo – quando o operando é um registo.
Ricardo Mendão Silva
[email protected]
Endereçamento MIPS
Modos de endereçamento
• Endereçamento Base – quando o operando é a localização na
memória cujo endereço é a soma de um registo + um constante.
• Endereçamento relativo ao PC – quando o endereço do branch é
a soma do PC + uma constante.
PC = PC + Address
Ricardo Mendão Silva
[email protected]
Endereçamento MIPS
Modos de endereçamento
• Endereçamento pseudo-directo – quando o endereço de jump
representa os 26 bits da instrução concatenados com os bits
mais significativos do PC e depois de sofrerem um shift left
igual a 2.
J-type
Op(6)
address (26)
j 1000
000010
00 0000 0000 0000 0011 1110 1000
PC
0101 0000 1111 0000 1111 0000 1111 0000
01 01 00 0000 0000 0000 0011 1110 1000 00
Ricardo Mendão Silva
shift left logic 2
[email protected]
Instruction Set
Architecture (ISA)
MARS - Exercício
Exercício 5:
• Compile a sequência de Fibonacci de 20.
A sucessão de Fibonacci define que n+1 = n + (n-1), ou seja:
0,1,1,2,3,5,8,13,21,34,55,89,…
Recursivo
Iterativo
int fibonacci(int num)
{
if(num==0 || num==1)
return 1;
else
return fibonacci(num-1) + fibonacci(num-2);
}
Ricardo Mendão Silva
int fibonacci (int num)
{
int i, j, k, t;
i = 0; j = 1;
for (k = 1; k <= num; k++)
{
t = i + j;
i = j;
j = t;
}
return j;
}
[email protected]
Instruction Set
Architecture (ISA)
Fibonnaci iterativo
Encontre os
erros….
Existem 4
erros graves
e diversas
outras
práticas
erradas.
.data
msg:
space:
.text
.asciiz "Entre um numero:\n"
.byte 32
addi $t2,$zero,1
add $s7,$zero,$zero
la $s3,space
la $a0,msg
li $v0,4
syscall
fibonacci:
add $s0,$zero,$zero
addi $s1,$zero,1
move $s2,$a0
add $s4,$zero,$zero
loop:
bgt $s4,$s2,exit
add $t0,$s0,$s1
move $s1,$s0
move $s0,$t0
li $v0,5
syscall
add $a0,$v0,$zero
move $a0,$s1
li $v0,1
syscall
jal fibonacci
j exit
move $a0,$s3
li $v0,4
syscall
addi $s4,$s4,1
j loop
exit:
Ricardo Mendão Silva
[email protected]
Instruction Set
Architecture (ISA)
Fibonnaci recursivo
fibonacci:
addi $sp,$sp,-12
sw $ra,0($sp)
sw $s0,4($sp)
sw $s1,8($sp)
add $s0,$a0,$zero
beq $s0,$zero,return0
beq $s0,$t2,return1
subi $a0,$s0,1
blt $v0,$s7,no_print
move $s7,$v0
return1:
li $v0,1
addi $sp,$sp,-8
sw $v0,4($sp)
sw $a0,0($sp)
return_n:
lw $s1,8($sp)
lw $s0,4($sp)
lw $ra,0($sp)
addi $sp,$sp,12
jr $ra
move $a0,$v0
li $v0,1
syscall
move $a0,$s3
li $v0,4
syscall
jal fibonacci
add $s1,$v0,$zero
subi $a0,$s0,2
jal fibonacci
add $v0,$s1,$v0
Ricardo Mendão Silva
lw $v0,4($sp)
lw $a0,0($sp)
addi $sp,$sp,8
no_print:
j return_n
return0:
li $v0,0
j return_n
print:
addi $sp,$sp,-4
sw $ra,0($sp)
li $v0,1
syscall
lw $ra,0($sp)
addi $sp,$sp,4
jr $ra
exit:
[email protected]
Dúvidas e Questões
Ricardo Mendão Silva
Maio 2014
[email protected]
Ricardo Mendão Silva
[email protected]
Download