Goiânia, 08 de junho de 2005. Prof. José Wilson Lima Nerys MICROPROCESSADORES E MICROCOMPUTADORES AVALIAÇÃO 1 Aluno 1: ____________________________________________________ Matrícula: _______________Turma:____ Aluno 2: ____________________________________________________ Matrícula: _______________Turma:____ 1. Os alunos de microprocessadores turma 2005 decidiram fazer um pequeno projeto usando o microprocessador 8085 e, para isso, dividiram-se em grupos de 2 alunos. O projeto tem como ferramenta principal o ABACUS e é explicado a seguir. Parte 1: Programa gerador de código: o programa deve utilizar as matrículas dos dois alunos para gerar um código que será mostrado no display de endereços. Cada matrícula representa um número hexadecimal de 6 dígitos. A forma de geração desse código é: Valor: 2,0 Matrícula 1 Matrícula 2 Número aleatório Pré-Código Resultado de Adição + + + 1 Byte 2 x x y y a a ? ? 0 0 Byte 0 do pré-código Byte 1 do pré-código Byte 2 do pré-código Código + + ? Byte 0 Byte 1 Byte 2 ? ? Byte 1 x x y y a a ? ? 0 0 Byte 0 x x y y a a ? ? 0 0 Obs.: A matrícula 1 e a matrícula 2 devem ser manualmente armazenadas a partir das posições de memória 2090h e 2095h, respectivamente. O número aleatório deve ser digitado através do teclado e armazenado a partir da posição de memória 209Ah. A pilha deve ser colocada no endereço 2100 h. Faça o fluxograma e o programa gerador do código. Parte 2: O programa (continuação do anterior) deve comparar o código resultante com os valores hexadecimais 100 h e 200 h. Se o código for maior ou igual a 200 h, uma contagem decimal crescente ininterrupta, de 5 em 5, deve ser mostrada no display de dados. Caso o código seja menor que 100 h uma contagem decimal decrescente ininterrupta, de 5 em 5, deve ser mostrada no display de dados. Para valores de código dentro do intervalo de 100 h a 200 h, um novo número aleatório é solicitado. Valor: 2,0 Faça o fluxograma e o programa da segunda parte do projeto. 2. Analisando a arquitetura e o princípio de funcionamento do 8085, fale sobre possíveis maneiras de aumentar o desempenho desse processador. Valor: 1,0 Nota 1 = Prova 1 (50%) + Tarefa 1 (20%) + Exercícios Cap. 4 (20%) + Relatórios Lab. 2 e 3 (10%) Questão extra opcional (valor: 0,5 – do livro: O livro de ouro de quebra-cabeças – organizado por Paulo Cezar Tovar): Seis homens sentaram-se numa mesa redonda para jogar pôquer. Um deles era irmão de Paulo. Descubra onde eles se sentaram, sabendo os seguintes fatos: (a) Pedro, que era parente de Paulo, sentou junto de Jorge; (b) o homem que sentou junto ao homem, que sentou do lado oposto de Paulo, sentou do lado oposto do irmão de Paulo; (c) Antônio sentou do lado oposto de Pedro, que sentou junto ao homem que sentou junto ao homem, que sentou do lado oposto de Paulo; (d) Ernani sentou do lado oposto do homem, que sentou junto ao homem, que sentou junto ao homem, que sentou do lado oposto do irmão de Paulo. Escola de Engenharia Elétrica e de Computação – Universidade Federal de Goiás Goiânia, 08 de junho de 2005. Prof. José Wilson Lima Nerys SOLUÇÃO DO ITEM 1 (Partes 1 e 2) Observações: (a) Os bytes 2, 1 e 0 do número de matrícula 1(X) ocupam respectivamente as posições de memória: 20C0h, 20C1h e 20C2h. (b) Os bytes 2, 1 e 0 do número de matrícula 2(Y) ocupam respectivamente as posições de memória: 20C5h, 20C6h e 20C7h. (c) O número aleatório, que é digitado através do teclado, é armazenado nas posições de memória: 20CAh, 20CBh e 20CCh, começando com o byte mais significativo em 20CAh. (d) Inicialmente faz-se a adição X + Y e armazena-se o resultado nas posições de memória: 20D0h, 20D1h e 20D2h. (e) A seguir faz-se a adição do resultado do item anterior com o número aleatório (X + Y + A) e armazena-se o resultado nas posições de memória: 20D5h, 20D6 e 20D7h. (f) Encontra-se o complementar de 2 da soma total (X + Y + A) e armazena-se nas posições de memória: 20DAh, 20DBh e 20DCh. (g) A adição dos bytes 0, 1 e 2 do resultado anterior resulta no código desejado, que é armazenado em DE. (h) Na comparação do código com os valores 100h e 200h, basta comparar o conteúdo de D com 0 e 1. Se for zero, contagem decrescente; se for 1, pede outro código; caso contrário (≥2), contagem crescente. INÍCIO 1 Lê número aleatório de 3 bytes (6 dígitos) Guarda número aleatório na memória Adiciona-se X + Y, a partir do byte 0, e considerando o carry a partir do byte 1 Adiciona-se byte 0 + byte 1 + byte 2 do resultado de X + Y + A, usando o par HL como acumulador Guarda resultado em DE e mostra no display de endereços D = 00? Guarda resultado de X + Y na memória N S Adiciona-se X + Y + A, a partir do byte 0, e considerando o carry a partir do byte 1 S D = 01? Contagem Decrescente de 5 em 5 N Contagem crescente de 5 em 5 Guarda resultado de X + Y + A na memória Encontra-se o complementar de 2 do resultado de X + Y + A, a partir do byte 0 Guarda complemento de 2 de X + Y + A na memória 1 Escola de Engenharia Elétrica e de Computação – Universidade Federal de Goiás Goiânia, 08 de junho de 2005. Endereço (hexa) 2000 2003 2006 2008 200B 200C 200D 200E 2011 2012 2015 2018 2019 201C 201D 201E 2021 2022 2025 2026 2027 202A 202B 202E 202F 2032 2035 2036 2039 203A 203B 203C 203D 2040 2041 2044 2045 2046 2047 2048 204B 204C 204F 2050 2051 2052 2053 2055 2058 2059 205B 205E 205F 2061 2064 Mnemônico Prof. José Wilson Lima Nerys Comentário LXI SP,2100h LXI H,20CAh MVI C,03h CALL 20B0h MOV M,A INX H DCR C JNZ 2008 Aponta para a posição onde será guardado o byte 2 do número aleatório Contador para ler os 3 bytes do número aleatório Chama subrotina para leitura de 1 byte Armazena o conteúdo do acumulador (byte do número digitado) na memória Incrementa par HL para apontar para a próxima posição Decrementa contador para verificar se já foram digitados 3 bytes Se o contador não for zero, volta para ler o próximo byte do n. aleatório LXI H,20C7h LDA 20C2h ADD M STA 20D2h Depois de ler e guardar o número aleatório, aponta para byte 0 da matrícula 2 Carrega no acumulador o byte 0 da matrícula 1 Adiciona em A os bytes 0 das matrículas 1 e 2 Guarda em 20D2h byte 0 do resultado DCX H LDA 20C1h ADC M STA 20D1h Decrementa HL para buscar o byte 1 da matrícula 2 Carrega no acumulador o byte 1 da matrícula 1 Adiciona com carry os bytes 1 das matrículas 1 e 2 Guarda em 20D1h byte 1 do resultado DCX H LDA 20C0h ADC M STA 20D0h Decrementa HL para buscar o byte 2 da matrícula 2 Carrega no acumulador o byte 2 da matrícula 1 Adiciona com carry os bytes 2 das matrículas 1 e 2 Guarda em 20D0h byte 2 do resultado LXI H,20D2h LDA 20CCh ADD M STA 20D7h CMA MOV C,A Aponta para o byte 0 do resultado de M1 + M2 Carrega no acumulador o byte 0 do número aleatório Adiciona em A os bytes 0 do resultado M1 + M2 + número aleatório Guarda em 20D7h byte 0 de M1 + M2 + aleatório Complementa byte menos significativo e guarda temporariamente no registrador C DCX H LDA 20CBh ADC M STA 20D6h CMA MOV B,A Decrementa HL para buscar o byte 1 resultado de M1 + M2 Carrega no acumulador o byte 1 do número aleatório Adiciona com carry os bytes 1 do resultado M1 + M2 + número aleatório Guarda em 20D6h byte 1 de M1 + M2 + aleatório Complementa byte intermediário e guarda temporariamente no registrador B DCX H LDA 20CAh ADC M STA 20D5h CMA MOV E,A Decrementa HL para buscar o byte 2 resultado de M1 + M2 Carrega no acumulador o byte 2 do número aleatório Adiciona com carry os bytes 2 do resultado M1 + M2 + número aleatório Guarda em 20D5h byte 2 de M1 + M2 + aleatório Complementa byte mais significativo e guarda temporariamente no registrador E MOV A,C ADI 01h STA 20DCh MOV A,B ACI 00h STA 20DBh MOV A,E ACI 00h STA 20DAh O complemento do resultado de M1 + M2 + número aleatório está guardado em E B C. Assim, o complemento de 2 do número final, ou seja, o pré-código é encontrado adicionando 1 ao número de 6 dígitos guardado em E B C. O resultado desse ajuste é o pré-código, que é guardado nos endereços: 20DAh – byte mais significativo 20DBh – byte intermediário 20DCh – byte menos significativo Escola de Engenharia Elétrica e de Computação – Universidade Federal de Goiás Goiânia, 08 de junho de 2005. Endereço (hexa) 2065 2067 2069 206B 206E 206F 2072 2073 2074 2077 2078 2079 207A 207B 207E 207F 2080 2082 2085 2087 208A 208C 208D 2090 2092 2095 2096 2098 2099 209C 209E 209F 20A2 20A5 20A7 20A8 20AA 20AB Prof. José Wilson Lima Nerys Mnemônico MVI B,00h MVI D,00h MVI H,00h LDA 20DAh MOV L,A LDA 20DBh MOV C,A DAD B LDA 20DCh MOV E,A DAD D XCHG PUSH D CALL 0363h POP D MOV A,D CPI 00h JZ 209C CPI 01h JZ 2003h MVI A,00h PUSH PSW CALL 036Eh MVI D,03h CALL 05F1h POP PSW ADI 05h DAA JMP 208Ch MVI A,95h PUSH PSW CALL 036Eh MVI D,03h CALL 05F1h POP PSW ADI 95H DAA JMP 209Eh Comentário Adiciona os três bytes do pré código usando o registrador par HL como acumulador. O final está em HL. Em seguida o resultado é transferido para DE. Inverte os conteúdos de HL e DE. Portanto, o código final está em DE Mostra código final no display de endereços Carrega em A o conteúdo de D (dígito mais significativo do código) e compara com 00h. Se A = 00h, significa que o código é menor que 100h. Assim, há um desvio para a contagem decrescente, em 209Ch Compara D com 01. Se D = 1 volta para o início do programa. Caso contrário, significa que D ≥ 2 e o programa segue, entrando numa contagem crescente Contagem decimal crescente ininterrupta mostrada no display de dados e com atraso de tempo. Contagem decimal decrescente ininterrupta mostrada no display de dados e com atraso de tempo. 20B0 20B1 20B4 20B5 20B6 20B7 20B8 20B9 20BC 20BD 20BE 20BF 20C0 20C1 20C2 PUSH H CALL 02E7h RLC RLC RLC RLC MOV B,A CALL 02E7h ORA B POP H RET Subrotina para leitura de 1 byte (2 dígitos) 01 01 40 Exemplo de Matrícula 1 20C5 20C6 20C7 99 32 39 Exemplo de Matrícula 2 20CA 20CB 20CC aa aa aa Endereço de armazagem do número aleatório. O byte mais significativo está em 20CAh 2100 Pilha Escola de Engenharia Elétrica e de Computação – Universidade Federal de Goiás