ARQUITECTURA DE COMPUTADORES CAPÍTULO II AULA VII
Índice Endereçamento MIPS: 32-bits imediatos; Endereços em branches e jumps; Modos de endereçamento; MARS Exercício 5: Fibonnaci
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.
Problema O modo normal de adicionar um constante em MIPS é utilizando a instrução addi. A instrução addi é codificada segundo o formato I- type, 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.
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 01000 0000 0000 1111 1111 0000 0000 1111 1111 0000 0000 0000 0000
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 01000 0000 0000 1111 1110 0000 0000 1111 1111 0000 0000 1111 1110
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 0000 0000 1111 0110 0000 0000 0000 0000 001101 00000 01000 0000 0001 1111 0001 0000 0000 1111 0110 0000 0001 1111 0001
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
Endereços em Branches e Jumps Como o I-type somente suporta endereços de 16 bits, existiria um limite de 2 16 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 2 32 instruções.
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 ±2 15 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.
Endereços em Branches e Jumps 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. 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.
Endereços em Branches e Jumps Exemplo da Bibliografia:
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.
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
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 shift left logic 2
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); } 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; }
Instruction Set Architecture (ISA) Fibonnaci iterativo Encontre os erros. Existem 4 erros graves e diversas outras práticas erradas..data msg:.asciiz "Entre um numero:\n" space:.byte 32.text addi $t2,$zero,1 add $s7,$zero,$zero la $s3,space la $a0,msg li $v0,4 syscall li $v0,5 syscall add $a0,$v0,$zero jal fibonacci j exit 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 move $a0,$s1 li $v0,1 syscall move $a0,$s3 li $v0,4 syscall j loop addi $s4,$s4,1 exit:
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 jal fibonacci add $s1,$v0,$zero subi $a0,$s0,2 jal fibonacci add $v0,$s1,$v0 blt $v0,$s7,no_print move $s7,$v0 addi $sp,$sp,-8 sw $v0,4($sp) sw $a0,0($sp) move $a0,$v0 li $v0,1 syscall move $a0,$s3 li $v0,4 syscall lw $v0,4($sp) lw $a0,0($sp) addi $sp,$sp,8 no_print: j return_n return0: li $v0,0 j return_n return1: li $v0,1 return_n: lw $s1,8($sp) lw $s0,4($sp) lw $ra,0($sp) addi $sp,$sp,12 jr $ra print: addi $sp,$sp,-4 sw $ra,0($sp) li $v0,1 syscall lw $ra,0($sp) addi $sp,$sp,4 jr $ra exit:
Dúvidas e Questões Maio 2014