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