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]