LABORG
Parte 4 – Programação em
Linguagem de Montagem do
MIPS
Fernando Gehm Moraes
Matheus Trevisan Moreira
08/Abril/2015
Introdução
•
MIPS – Um processador RISC de 32 bits
•
Conjunto de Instruções – Usa-se o Instruction Set Architecture (ISA) do MIPS
R2000, primeira geração do MIPS (década de 80)
•
Todas as instruções ocupam 32 bits
•
Dados mais naturalmente tratados são de 32 bits
–
*
ISA do MIPS R2000 “dá suporte direto a”*:
•
Números naturais de 32, 16 ou 8 bits
•
Números inteiros de 32, 16 ou 8 bits
•
Números racionais de 32 ou 64 bits
•
Manipulação de caracteres ASCII compactados em palavras de 32 bits ou descompactados
•
Suporte limitado a dados quaisquer de 64, 32, 16 e 8 bits
“Dá suporte direto a” significa  “possui instruções específicas para manipular tais tipos de
dados”
Fernando Moraes / Matheus Moreira
2
Objetivos
• Esta aula tem como objetivos:
– Dar noções de como estruturar programas em linguagem de montagem do
MIPS
– Dar noções de como criar estruturas de dados simples no MIPS
– Treinar conceitos básicos de programação no MIPS
• Forma de realizar este treino – escrever e testar três programas:
– Detector de números palíndromos (60% da nota)
– Gerador de números palíndromos (20% da nota)
– Detector de overflow (20% da nota)
• Notar que números racionais não serão abordados aqui, pois sua
representação será estudada apenas em disciplina posterior
Fernando Moraes / Matheus Moreira
3
Descrição dos Programas
• Detector de números palíndromos (1/2)
– Um palíndromo é uma palavra, frase ou qualquer sequência de símbolos que
tenha a propriedade de poder ser lida tanto da direita para a esquerda como da
esquerda para a direita. Ou seja, uma frase palíndroma é aquela que lida da
esquerda para a direita ou da direita para a esquerda tem o mesmo sentido.
– Por exemplo:
• Oto come mocotó
• Socorram-me subi no onibus em marrocos
– Números, assim como letras, também são compostos por símbolos. Dessa
forma um número palíndromo é aquele é igual quando lido em qualquer
sentido.
– Por exemplo:
• 1852581
• 101
Fernando Moraes / Matheus Moreira
4
Descrição dos Programas
• Detector de números palíndromos (2/2)
– Usando as instruções divu, mfhi e mflo, escreva um programa que detecte se
um número é um palíndromo. O programa deve imprimir “e palindromo”
quando detectar que o número é um palíndromo e “nao e palindromo” quando
detectar que o número não é palíndromo.
– Use o pseudo-código abaixo como referência para escrever o código assembly:
num=numero_a_ser_testado
aux=0
while(num>0){
// Esse trecho escreve num invertido em aux
aux = (aux * 10) + (num % 10)
num = num / 10
}
teste_palindromo = numero_a_ser_testado – aux
if (teste_palindromo == 0) print(“e palindromo”) // Se num - aux for igual a 0,
// o numero é palíndromo
else print(“nao e palindromo”)
Fernando Moraes / Matheus Moreira
5
Descrição dos Programas
• Gerador de números palíndromos (1/2)
– A conjectura palíndroma é uma questão matemática interessante. Ela diz que:
“Assumindo um número inteiro positivo qualquer, escreva o número em ordem
inversa e some os dois números. Repita o processo com a soma, obtendo-se
então uma segunda soma e prossiga os mesmos passos até encontrar um
palíndromo.”
– Por exemplo:
• Assuma a inicialização com o número 68;
• Primeiro passo: 68 + 86 = 154
• Segundo passo: 154 + 451 = 605
• Terceiro passo: 605 + 506 = 1111
• Palíndromo detectado!
Fernando Moraes / Matheus Moreira
6
Descrição dos Programas
• Gerador de números palíndromos (2/2)
– Essa conjectura afirma que é possível encontrar um palíndromo num ciclo
finito de adições para qualquer número inicial escolhido. Porém, ninguém
conseguiu provar até hoje se ela é verdadeira ou falsa.
– Modifique o programa detector de números palíndromos, de forma que, caso o
número testado não seja um palíndromo, o programa gere um palíndromo a
partir desse número. O programa deve imprimir o número gerado para cada
passo realizado e, ao final da execução, apresentar o palíndromo gerado e
informar o número de passos executados.
Fernando Moraes / Matheus Moreira
7
Descrição dos Programas
• Detector de overflow
– Até hoje ninguém conseguiu provar se a conjectura dos números palíndromos
é verdadeira ou falsa e não sabemos se, de fato, é possível gerar um número
palíndromo a partir de qualquer valor inteiro. Por exemplo, nenhum computador
conseguiu computar até hoje um palíndromo partindo do número 196, apesar
de computadores já haverem calculado centenas de milhares de passos.
– Essa incerteza pode ser problemática para nosso programa, pois nossa
capacidade de representar valores inteiros está limitada ao tamanho do
barramento do processador (32 bits). Dessa forma, para garantir a consistência
dos palíndromos gerados pelo programa escrito na atividade anterior, devemos
detectar condições de overflow.
– Modifique o gerador de palíndromos para que caso aconteça um overflow, o
programa finalize sua execução e escreva um alerta de overflow para o usuário.
Fernando Moraes / Matheus Moreira
8
TRABALHO A FAZER
• Familiarizar-se com o ambiente de desenvolvimento MARS para o
MIPS R2000
• Compreender o processo de edição, montagem e simulação,
incluindo operações de entrada e saída no ambiente MARS
• Programar as duas aplicações mencionadas aqui e mostrar que os
programas funcionam usando o ambiente MARS:
– detecta_palindromo.asm – Dicas: Usem um label para definir um laço de repetição
que implemente o while do pseudo-código. O maior problema é ler o quociente e
o resto da divisão do número a cada iteração. Use a instrução divu para dividir o
número por 10 e as instruções mfhi e mflo para ler os valores do resto e do
quociente da divisão, respectivamente.
– gera_palindromo.asm – Dicas: Usem a rotina implementada para o detector de
palíndromos. No caso de o número não ser um palíndromo, atualizem os valores
de entrada e repitam a rotina.
– detector_overflow.asm
Fernando Moraes / Matheus Moreira
9
A ENTREGAR – T4
• Um arquivo compactado (.zip, .rar, etc.) contendo:
– Os códigos dos três programas em 3 arquivos distintos (.asm)
– Relatório incluindo telas do MARS, mostrando a operação correta de
cada um dos programas
• Data Final de Entrega: Ver Homepage, até antes 15min antes do horário
de início da aula via sala do Moodle ou por e-mail (em caso de
inacessibilildade do Moodle)
Fernando Moraes / Matheus Moreira
10
Apoio
• Área de dado paras mensagens que devem ser impressas e o n#:
.data
num:
.word
1234567
ok :
.asciiz
"E palindromo"
nok :
.asciiz
"NAO e palindromo"
iter :
.asciiz
"numero de iteracoes "
ovfl :
.asciiz
"OVERFLOW "
.text
…
• Exemplo de impressão de mensagem:
...
li
$v0, 4
la
$a0, ok
Syscall
…
Imprime “E palindromo”
Fernando Moraes / Matheus Moreira
11
Apoio
• Obtenção do resto $t2 = $s1 % $t0:
divu $s1, $t0
mfhi $t2
• Divisão $s1 = $s1 / $t0
divu $s1, $t0
mflo $s1
• Impressão do valor de $s0 (formato inteiro) no console
li
$v0, 36
move
$a0, $s0
syscall
• Impressão de um espaço em branco no console
li
$v0, 11
li
$a0, 32
## imprime espaço em branco
syscall
Fernando Moraes / Matheus Moreira
12
Download

PPT