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
Download

Aula Anterior