12
Parte 4 – Programação em Linguagem de Montagem do MIPS LABORG Fernando Gehm Moraes Matheus Trevisan Moreira 08/Abril/2015

Fernando Gehm Moraes Ney Laert Vilar Calazans

Embed Size (px)

DESCRIPTION

LABORG. Fernando Gehm Moraes Ney Laert Vilar Calazans. Parte 4 – Programação em Linguagem de Montagem do MIPS. 02/setembro/2013. Introdução. MIPS – Um processador RISC de 32 bits - PowerPoint PPT Presentation

Citation preview

Page 1: Fernando Gehm Moraes Ney Laert Vilar Calazans

Parte 4 – Programação em Linguagem de Montagem do

MIPS

LABORG

Fernando Gehm MoraesMatheus Trevisan Moreira

08/Abril/2015

Page 2: Fernando Gehm Moraes Ney Laert Vilar Calazans

2Fernando Moraes / Matheus Moreira

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”

Page 3: Fernando Gehm Moraes Ney Laert Vilar Calazans

3Fernando Moraes / Matheus Moreira

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

Page 4: Fernando Gehm Moraes Ney Laert Vilar Calazans

4Fernando Moraes / Matheus Moreira

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

Page 5: Fernando Gehm Moraes Ney Laert Vilar Calazans

5Fernando Moraes / Matheus Moreira

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”)

Page 6: Fernando Gehm Moraes Ney Laert Vilar Calazans

6Fernando Moraes / Matheus Moreira

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!

Page 7: Fernando Gehm Moraes Ney Laert Vilar Calazans

7Fernando Moraes / Matheus Moreira

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.

Page 8: Fernando Gehm Moraes Ney Laert Vilar Calazans

8Fernando Moraes / Matheus Moreira

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.

Page 9: Fernando Gehm Moraes Ney Laert Vilar Calazans

9Fernando Moraes / Matheus Moreira

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

Page 10: Fernando Gehm Moraes Ney Laert Vilar Calazans

10Fernando Moraes / Matheus Moreira

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)

Page 11: Fernando Gehm Moraes Ney Laert Vilar Calazans

11Fernando Moraes / Matheus Moreira

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”

Page 12: Fernando Gehm Moraes Ney Laert Vilar Calazans

12Fernando Moraes / Matheus Moreira

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 ## imprime espaço em branco

li $a0, 32

syscall