UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA - DEPARTAMENTO DE INFORMÁTICA APLICADA INF01107 - Arquitetura e Organização de Computadores I – Turma A - 2008 Trabalho Prático 1 - Simulador NEANDER Escrever um programa para o simulador Neander que implemente as quatro operações aritméticas básicas (soma, subtração, multiplicação e divisão) sobre números inteiros positivos, representados em complemento de dois (ou seja, os operados estão na faixa entre 0 e 127, inclusive). Para a definição da operação devem ser obrigatoriamente utilizadas as seguintes posições: Palavra 128 – primeiro operando da operação Palavra 129 – segundo operando da operação Palavra 130 – código da operação (1: soma, 2: subtração, 3: multiplicação, 4: divisão) Palavra 131 – resultado da operação Palavra 132 – código de erro (veja abaixo) Não é necessário realizar nenhum teste sobre a correção do resultado, ou seja, eventuais "vai-um" ou estouros de representação devem ser ignorados. A operação de divisão corresponde a uma divisão inteira, ou seja, o quociente é um número inteiro e o resto é descartado. A correção da entrada deve ser indicada através dos seguintes códigos no endereço 132: Código 0: entrada correta Código 1: operando(s) fora da faixa, ou seja, negativo(s) Código 2: operandos dentro da faixa, mas código de operação inválido Código 4: tentativa de divisão por zero Em caso de erro, deve ser devolvido zero como resultado da operação. Os valores das posições 128 a 130 de memória não devem ser alterados pelo programa. Dicas: 1. O simulador Neander não possui operação de subtração. Entretanto, uma subtração pode ser transformada em uma soma através do complemento do subtraendo. 2. O simulador Neander não possui operação de multiplicação. Entretanto, uma multiplicação não é nada mais que uma série de somas sucessivas. 3. O simulador Neander não possui operação de divisão. Entretanto, o quociente de uma divisão pode ser calculado através de uma série de subtrações sucessivas. Os trabalhos serão corrigidos de forma automática, com 20 grupos de valores diferentes. Portanto, devem ser observadas rigorosamente as seguintes especificações: o código do programa deve iniciar no endereço 0 da memória. a primeira instrução executável deve estar no endereço 0. os endereços das variáveis devem ser exatamente os especificados acima. para constantes e variáveis adicionais, ou para trechos extras de programa, usar os endereços de memória de 133 em diante. o programa será executado 20 vezes de forma consecutiva (sem ser carregado de disco a cada vez); portanto é necessário inicializar todas as variáveis utilizadas. O programa deverá ser entregue no Moodle, na área de “Entrega do Primeiro Trabalho”, juntamente com uma documentação contendo uma breve descrição do método utilizado e uma listagem do programa fonte usando mnemônicos simbólicos para as instruções (LDA, STA, etc ...) e indicando os endereços de memória nos quais as instruções ficam armazenadas, assim como os endereços dos operandos das instruções, em decimal. Para o nome do arquivo de memória do Neander, utilize a letra inicial do seu primeiro nome, seguida do seu número de cartão. Assim, por exemplo, o aluno João da Silva, cartão número 123456, deve denominar o seu arquivo de J123456.MEM. Como o Moodle só permite o envio de um único arquivo, compacte todos os arquivos usando Zip ou Rar. Data de Entrega: 05/05/2008 via http://moodle.inf.ufrgs.br Exemplos de casos de teste (todos os valores estão indicados no sistema decimal) Endereço 128 129 130 131 132 Endereço 128 129 130 131 132 128 8 4 0 1 18 12 1 30 0 Caso 1 Caso 9 44 1 5 0 2 105 56 2 49 0 Caso 2 Caso 10 29 1 1 30 0 12 12 3 144 0 Caso 3 Caso 11 115 15 1 130 0 103 2 4 51 0 Caso 4 Caso 12 105 127 2 234 0 101 5 4 20 0 Caso 5 Caso 13 47 3 3 141 0 45 130 5 0 1 Caso 6 Caso 14 122 100 4 1 0 128 129 1 0 1 Caso 7 Caso 15 28 0 4 0 4 35 32 3 96 0 Caso 8 Caso 16