INSTITUTO POLITÉCNICO DE BRAGANÇA ESCOLA SUPERIOR DE TECNOLOGIA E DE GESTÃO Engenharia Electrotécnica Microprocessadores 2ºano - 1ºsemestre Microprocessador 8085 Exercícios de Programação em Linguagem Assembly Ângelo César Web Page: http://www.ipb.pt/~aacesar E-Mail: aacesar@ipb.pt Bragança, Outubro de 2002
ÍNDICE 1. SALTOS (IN)CONDICIONAIS...ERRO! MARCADOR NÃO DEFINIDO. 2. A CONTINUACIÓN SE MUESTRA EL DIAGRAMA DE FLUJO CORRESPONDIENTE FIG.55H...ERRO! MARCADOR NÃO DEFINIDO. i
1. TRANSFERÊNCIA DE DADOS 1. Escreva um programa que carregue o Acumulador do CPU com o valor 55H. 2. Escreva um programa que transfira o conteúdo do Acumulador para uma célula de memória de endereço 2138H. 3. Escreva um programa que transfira o conteúdo da célula de memória de endereço 2138H para a unidade de saída, de endereço 00H. 4. Escreva um programa que transfira a informação estabelecida pelos switchs do porto de entrada de endereço 00H para a célula de memória de endereço 2100H. 5. Escreva um programa que transfira a informação estabelecida pelos switchs do porto de entrada de endereço 00H para os LEDs do porto de saída. 6. Escreva um programa que acenda apenas o LED mais à direita do porto de saída, de endereço 00H. 7. Escreva um programa que actualize continuamente a unidade de saída do µp8085 representada pelo conjunto dos 8 LEDs, em função do estado dos 8 switch do DIP da unidade de entrada. 8. Escreva um programa que reflicta a unidade de entrada continuamente na unidade de saída do µp8085 e saia se o valor lido for FFH. 9. Escreva um programa que detecte o endereço do porto da unidade de entrada, correspondente aos 8 switch do DIP, sendo desconhecido o seu valor. 10. Escreva um programa que detecte o endereço do porto da unidade de saída, representado pelo conjunto dos 8 LEDs, sendo desconhecido o seu valor. 11. Escreva um programa que substitua o conteúdo da posição de memória Op1 pelo seu módulo, utilizando o endereçamento indirecto. 12. Escreva um programa que coloque na posição de memória Res o maior dos conteúdos das posições de memória Op1, Op2 e Op3. Utilize o endereçamento indirecto. 13. Escreva um programa que coloque o conteúdo do registo de Flags na posição de memória 20A0H. 1
2. OPERAÇÕES ARITMÉTICAS E LÓGICAS 1. Escreva um programa que adicione o conteúdo de duas posições de memória Op1 e Op2, colocando o resultado na posição de memória Res. Utilize o modo de endereçamento directo. Faça o mesmo para o modo de endereçamento indirecto. 2. Escreva um programa que multiplique mas sem utilizar a multiplicação, os conteúdos das posições de memória Op1 e Op2 e deixe o resultado na posição de memória Res. Considere que o valor máximo que os operandos podem ter é 0FH. Utilize o endereçamento indirecto. 3. Escreva um programa que calcule a potência do conteúdo da posição de memória Base, elevada ao expoente contido na posição de memória Exp. 4. Escreva um programa que complemente os bits b0, b1, e b2 do Acumulador. 5. Escreva um programa que teste se o bit b3 do registo L está activo. 6. Escreva um programa que coloque a zero os bits b1, b2, b5 e b6 do registo B, sem alterar os outros bits. 7. Escreva um programa que active os bits b1 e b2 do Acumulador. 8. Escreva um programa que some o conteúdo da posição de memória 1040H com o conteúdo da posição de memória 1041H, colocando o resultado na posição de memória 1042H. 9. Escreva um programa que receba o dado do porto de entrada e adicione-lhe o valor 50H. Se o resultado não produzir carry deverá ser transferido para os LEDs do porto de saída; se produzir carry, o valor a escrever na saída deverá ser FFH. 10. Escreva um programa que adicione dois números compostos por vários dígitos. O número de dígitos está na célula de endereço 2020H; o primeiro número está guardado a partir do endereço 2021H e o segundo número a partir do endereço 2051H. Os números começam com o dígito de menor peso. O resultado da adição é guardada na memória a partir do endereço 2021H. 3. TABELAS DE DADOS 1. Escreva um programa que apague os dados de uma tabela, estando os seus endereços inicial e final guardados nas células de endereço 2050H e 2052H, respectivamente. 2
2. Escreva um programa que coloque o conteúdo "9A" em todas as posições de memória de endereço par, entre 2060H e 2080H. Os conteúdos das posições de endereço ímpar deverão permanecer inalterados. Utilize o modo de endereçamento indirecto. 3. Escreva um programa que analise os conteúdos das posições de memória entre os endereços 2090H e 20A5H e proceda da seguinte forma: i. Se o valor contido na posição de memória corrente for igual ou maior do que 0FH, o valor é substituído por AAH. ii. Se o valor contido na posição de memória corrente for menor do que 0FH, o valor substituído por FFH. 4. Considere uma tabela de endereço inicial Tab e dimensão Dim. Escreva um programa que conte o número de elementos iguais ao conteúdo da posição de memória Const e guarde o resultado da contagem na posição de memória Res. Utilize o endereçamento indirecto. 5. Considere uma tabela de endereço inicial Tab e dimensão Dim. Escreva um programa que some todos os conteúdos da tabela e deixe o resultado nas posições de memória Res e Res+1. 6. Considere uma tabela de endereço inicial Tab e dimensão Dim. Escreva um programa que ordene por ordem crescente os conteúdos da tabela. 7. Considere uma tabela de endereço inicial Tab e dimensão Dim. Escreva um programa que conte o número de bits a 1 existentes em todos os conteúdos da tabela e deixe o resultado nas posições de memória Res e Res+1. 8. Considere uma tabela de endereço inicial Tab e dimensão Dim. Escreva um programa que transfira para o porto de saída de endereço 00H os conteúdos desta tabela, sincronizado com o interruptor ligado ao bit b4 do porto de entrada de endereço 00H. 9. Escreva um programa que compare o conteúdo de 10 posições de memória consecutivas e coloque o maior valor no registo E. 10. Escreva um programa que multiplique duas tabelas, respeitando a condição C1 = A1 * B1. 11. Escreva um programa que analise o conteúdo de 15 posições de memória consecutivas e proceda da seguinte forma: i. Se o valor for < 05H, mantêm-no inalterado; ii. Se o valor for = 05H, substitui-o pelo valor 00H; iii. Se o valor for > 05H, subtrai-lhe duas unidades. 3
12. Escreva um programa que coloque o valor 1AH numa tabela de dados cujo endereço inicial está no endereço de memória 2050H, sendo a sua dimensão lida no endereço 2052H. 13. Escreva um programa que desloque a tabela de dados de endereços inicial e final, respectivamente, 2200H e 2350H, para o endereço inicial 2400H. Nota: neste programa é necessário utilizar dois registos apontadores. 4. ACESSO À STACK 1. Escreva um programa que contenha rotinas e que examine a stack e o stack pointer. 5. ROTINAS 1. Escreva uma rotina que multiplique os conteúdos dos registos D e E e guarde o resultado no Acumulador. 6. INTERRUPÇÕES 1. Escreva um programa que implemente uma máquina que permita atender a oito pedidos de interrupção, associando a cada pedido um dos RST disponíveis. 2. Escreva um programa que realize uma contagem no porto de saída de endereço 00H, Up ou Down ao ritmo de um clock ligado ao IRQ7. 3. Escreva um programa que preencha uma tabela de endereço inicial Tab e dimensão igual a Dim com os valores presentes no porto de entrada de endereço 00H, ao ritmo de um clock ligado ao IRQ5. 4. Escreva uma rotina de Interrupt que actue como escalonador de tarefas, ao ritmo de um clock ligado ao RST 7.5. Entende-se por escalonador de tarefas um programa que faz a gestão da execução de um conjunto de tarefas. NOTA: Considera-se a existência de apenas duas tarefas independentes. Assim, a função do escalonador será trocar a execução da tarefa 1 pela execução da tarefa 2 e vice-versa. O escalonador tem a função de guardar e restaurar o contexto das tarefas aquando da troca. A tarefa 1 deverá afixar caracteres A na consola de output e a tarefa 2 o conteúdo de um contador. 4
7. ACESSO AO TECLADO 1. Escreva um programa que preencha uma tabela em memória, sendo os valores introduzidos pelo utilizador através do teclado e que calcule os seus valores máximo e mínimo. 8. LOOP DE DELAY 1. Escreva um programa que implemente uma sequência de luzes da esquerda para a direita, sempre à mesma velocidade e continuamente, numa fila de 8 LEDs. 2. Escreva um programa que desloque o LED da direita para a esquerda, ao ritmo de uma rotina de delay, desde a posição LSB até à posição MSB. Nota: o deslocamento de um LED corresponde a ter um LED aceso sucessivamente em posições adjacentes. 3. Escreva um programa que acenda, alternadamente, os quatro LEDs mais à esquerda e os quatro LEDs mais à direita, mantendo-se durante algum tempo em cada um destes estados. 4. Escreva um programa que acenda, alternadamente, os quatro LEDs das posições ímpares (b1, b3, b5, b7) e os quatro LEDs das posições pares (b0, b2, b4, b6), mantendo-se durante algum tempo em cada um destes estados. 5. Escreva um programa que simule o deslocamento de um LED aceso da esquerda para a direita, mantendo-se durante algum tempo em cada um destes estados. 6. Escreva um programa que simule o deslocamento de um LED aceso, seguido de dois LEDs apagados, da esquerda para a direita, mantendo-se durante algum tempo em cada um destes estados. 9. DIVERSOS 7. Considere a existência de uma tabela de endereço inicial Tab, de dimensão igual a Dim e contendo elementos em BCD. Escreva um programa que adicione os seus conteúdos e deixe o resultado em Res e Res+1. 2. Escreva um programa que calcule o máximo divisor comum de um número nas seguintes condições: i. Deixe o resultado na posição de memória Res, em que o endereço é passado pela Stack. ii. Passagem de parâmetros de entrada pela Stack. NOTA: o cálculo do máximo divisor comum pode ser definida da seguinte forma: 5
Z = mdc (x, y) Se x = y Então z = x Senão Se (x > y) Então z = mdc (x-y, y) Senão z = mdc (x, y-x) 3. Escreva um programa que simule o funcionamento de um Flip-Flop tipo D. Considere as entradas D, Clock, Preset e Clear ligadas, respectivamente, aos bits b0, b1, b2 e b3 do porto de entrada de endereço 00H; as saídas Q e Q estão ligadas, respectivamente, aos bits b6 e b7 do porto de saída de endereço 00H. 4. Escreva um programa que, após a activação dum interruptor da unidade de entrada de endereço 00H, implemente uma sequência de luzes da esquerda para a direita, correspondentes à fila de 8 LEDs da unidade de saída de endereço 00H, com a seguinte ordem: (0000 0001), (0000 0010), (0000 0100),..., (1000 0000), (0000 0001),... A sequência só deve parar quando o mesmo interruptor for desactivado. 5. Escreva um programa que divida o conteúdo da posição de memória 1040H em dois valores de 4 bits e os armazene nas posições de memória 1041H e 1042H do seguinte modo: i. Coloque os 4 bits MSB da posição 1040H no lugar dos 4 bits LSB da posição 1041H; ii. Coloque os 4 bits LSB da posição 1040H no lugar dos 4 bits LSB da posição 1042H; iii. Coloque os restantes bits da posição 1041H e 1042H a zero. 6. Desenvolver um programa que faça a conversão do conteúdo do endereço address para os caracteres ASCII. O resultado deve ser armazenado a partir do endereço address + 1, iniciando pelo dígito menos significativo. 6