Sumário Aula Anterior Exercício 8.2 – Identificação de Nomes pela Inicial Operações Lógicas e Correspondentes Instruções MIPS Manipulação de Bits Deslocamentos Shifts Lógicos e Aritméticos Operações Lógicas com Utilização de Mascaras Aula 10 1 Sumário Nesta Aula Esclarecimento de dúvidas para o teste Aula 10 2 Exercício 10.1 (Revisões) Escreva e teste um programa em linguagem assembly MIPS que calcule e imprima os primeiros 100 números primos. Um número n é primo se apenas é divisível por 1 e por n. Deve ser implementada uma rotina e-primo que retorna 1 se n é primo e 0 se n não é primo. Outra hipótese de trabalho consiste em determinar o resto da divisão de n por todos os números inferiores ao mesmo, usando a instrução remu (remu $t4, $a0, $t3 põe resto da divisão $a0/$t3 em $t4). Aula 10 3 Exercício 10.1 Estrutura do Programa <<Instruções>> Main Preservar $ra Inicializa Cont. num. Primos ($t0) Põe em $t1 total numeros a calcular (100) Inicializa $t2 = 0 var. de num. a ser calculado Ciclo:Increm. $t2 para começar em 1 Prepara arg. $a0 para passar o numero a calcular Jal primo Se resultado não é primo vai para label salto Incrementa contador de num. calculados ($t1) Imprime nova linha ($v0=4) Imprime numero que é primo ($v0=1) Aula 10 Salto:Se $t1 < 100 vai para label Ciclo Repõe $Sp e jr $ra Primo:Colocar 1 em $v0, considera-se á partida que o num. seja primo Colocar em $t3 o numero a analisar Colocar $t5 = 2, limite do ciclo Px:Decrementa $t3 (i--) Se $t3 < $t5 vai para label Sai Por em $t4 resto de $a0/$t3 Se $t4 !=0 volta para label Px. Se $t4=0 devolve $v0 = 0 Sai:Jr $ra 4 # Arquitectura de Computadores, # Programa que calcula os primeiros 100 números primos enter: .data .asciiz "\n" .text main: Resolução do Exercício 10.1 addi $sp, $sp, -4 # Reserva 1 posição na stack sw $ra, 0($sp) # Guarda $ra na stack. addi $t0, $zero, 0 # $t0 contador de números primos addi $t1, $zero, 100 # Total de números primos a mostrar addi $t2, $zero, 0 # Onde estará cada número a verificar ciclo: addi $t2, $t2, 1 # Número a verificar, começando em 1 add $a0, $zero, $t2 # Copia $t2 para argumento $a0 jal primo beq $v0,$zero, salto # Se não é primo vai para salto addi $t0, $t0, 1 # Contador de números primos addi $v0, $zero, 4 # System call $a0=4 (imprime string enter) la $a0, enter syscall addi $v0, $zero, 1 # Syscall $a0=1, imprime inteiro(nº primo) addi $a0, $t2, 0 # $t2 é o nº primo a imprimir syscall salto: bne $t0, $t1, ciclo # Se o total de números primos < 100 vai p/ ciclo lw $ra, 0($sp) # Re põe valor do $ra addi $sp, $sp, 4 jr $ra # Procedimento primo faz divião por 2, 3, ... n-1 primo: addi $v0, $zero, 1 # Começo por considerar-se o nº primo addi $t3, $a0, 0 # $t3 vai tomar todos os valores < ao nº a verificar addi $t5, $zero, 2 # Valor abaixo do qual já não se verifica px: addi $t3, $t3, -1 # Subtrai 1 a $t3 slt $t6, $t3, $t5 # $t6=1 se $t3<$t5 bne $t6, $zero, sai # $t6=1 não analisa remu $t4, $a0, $t3 # O resto da divisão do $a0=nº por $t3=valores < $a0 bne $t4,$zero, px # SEnão divisível analisa px número addi $v0, $zero, 0 # Faz $v0=0 se o nº não primo Aula 10 sai: jr $ra 5