Prévia do material em texto
Programação Assembly para o microprocessador 8085: Problemas Bruno Damas Escola Naval — Departamento de Ciências e Tecnologia Março de 2019 (Versão 3) 1. Calcule o valor armazenado no acumulador no final de cada um dos seguintes códigos: (a) MVI A,0FFh MVI B,1 MVI C,2 ADD B ADI 30h ADC C (b) MVI A,10h SUI 03h MVI B,0AFh MVI C,10h ADD B SBB C (c) MVI A,0F8h ANI 08h ORI 02h 2. Faça um programa que troque o conteúdo de duas posições de memória. Os endereços das posições de memória são os que estiverem nos pares de registos HL e DE, que deverão ser carregados logo no início do programa. 3. Programe o 8085 para consultar duas posições de memória, apontadas respectivamente pelos pares de registos DE e HL, copiando para o acumulador o maior dos valores aí contidos. 4. Programe o microprocessador 8085 para copiar um bloco de 20 bytes de uma posição de memória para outra. Os endereços de origem e destino deverão estar armazenados nos registos DE e HL, respectivamente. 5. Altere o programa anterior de forma a que se possa copiar um número arbitrário de bytes, assumindo que o número de bytes a copiar se encontra inicialmente armazenado no acumulador. 6. Crie um programa para o 8085 que calcule a soma dos primeiros 100 números inteiros. O resultado, no final do programa, deverá estar armazenado no par de registos HL. 7. Altere o programa anterior de forma a calcular a soma de N números, onde N é o número armazenado no acumulador no início do programa. 8. Programe o 8085 para somar dois números inteiros com P bytes cada. O primeiro número a ser somado deve estar armazenado a partir da posição de memória apontada pelo par HL (byte menos significativo), estando o segundo número guardado P bytes depois. O número P está 1 armazenado no registo B no início do programa, e o resultado da soma deve ser guardada nas posições de memória correspondentes ao primeiro operando. 9. Apresente o código máquina correspondente aos programas desenvolvidos anteriormente, assu- mindo que o endereçamento de carregamento dos mesmos (endereço da primeira instrução) é igual a B000h. 10. Escrever um programa que ordene, de forma ascendente, um conjunto de números inteiros de 1 byte armazenados em posições contíguas de memória. Assume-se que o endereço do primeiro byte a ordenar se encontra armazenado no par HL e que o número de bytes a ordenar está armazenado no acumulador. 11. Assumindo que a partir da posição de memória apontada por HL se encontra um bloco de N bytes correspondentes a um texto codificado em ASCII, onde o número N corresponde ao valor inicial do registo B, implemente um programa para o 8085 que conte o número de caracteres nesse bloco iguais a “A” (maiúsculo ou minúsculo). O resultado final deve ser armazenado no acumulador. 12. Transforme o programa do problema 5 numa sub-rotina COPIA_BLOCO que recebe os ende- reços de origem e destino nos pares DE e HL, respectivamente, e o número de bytes a copiar no acumulador. A sub-rotina deverá preservar o estado dos registos e flags, com excepção dos pares DE e HL que deverão conter o endereço origem/destino seguinte ao do último byte copiado (ou seja se originalmente o par DE tem o endereço 9000h e é necessário copiar 20 bytes, no final o par DE deverá ter armazenado o endereço 9014h). 13. Crie uma sub-rotina COPIA_BLOCOS que copie um conjunto de M blocos contínuos de N bytes cada. O endereço de origem dos dados deverá ser passado à sub-rotina no par de registos DE, o endereço destino no par HL, o número M de blocos no registo B e o tamanho de cada bloco no registo A. A sub-rotina deverá retornar deixando o estado dos registos e das flags inalterado. Aproveite a sub-rotina COPIA_BLOCO desenvolvida na questão anterior para reutilizar código. 14. (Teste 14ABR2016) Escreva uma sub-rotina que calcule a soma dos primeiros N números inteiros ímpares. O valor de N é passado à rotina no registo C, enquanto o valor final da soma deve ser devolvido no par de registos HL. Assume-se que N > 1, não precisando a rotina de validar o valor passado no registo C. Exemplo: se C = 04h, após a chamada da rotina o par de registos HL terá o valor 0010h (1 + 3 + 5 + 7 = 16 = 10h). 15. (Teste 14ABR2016) Pretende-se criar uma subrotina que calcule os primeiros N termos da série de Fibonacci. Esta série caracteriza-se por cada termo da série ser igual à soma dos dois anteriores, Fk = Fk−1 + Fk−2, com termos iniciais F0 = 0 e F1 = 1, o que resulta em Fk = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, · · · } A posição de memória onde deve ser escrita a sequência é passada à subrotina através do stack, enquanto o tamanho da sequência a gerar é passado no registo B. Assim, por exemplo, se N = 8 e o endereço base passado pelo stack for igual a 6000h, depois da chamada à subrotina as posições de memória 6000h a 6007h deverão ter armazenados os números 0, 1, 1, 2, 3, 5, 8 e 13, por esta ordem. 16. (Exame 17JUN2016) Pretende-se desenvolver uma rotina em Assembly para o 8085 para procurar um determinado número numa lista de 20 números. Supondo que o endereço de início da lista de números é passado no par de registos HL e que o número a procurar é passado no registo A, apresente a rotina que executa esta tarefa. A rotina deve devolver o valor 1 no registo B se o número for encontrado e 0 caso contrário. 17. (Teste 2MAI2017) O algoritmo de ordenação BubbleSort permite ordenar uma lista de N números de forma ascendente ou descendente, funcionando da forma seguinte: 2 Asus Destacar (a) O algoritmo atravessa todos os N números da lista, começando no primeiro, comparando cada número com o número seguinte e trocando-os se estes dois números estiverem na ordem errada; (b) Depois de atravessar a lista toda uma vez garante-se que o último número da lista já está na posição correcta; (c) O algoritmo volta a atravessar a lista da forma descrita no ponto 1, desta vez apenas para os primeiros N-1 elementos (o último já está ordenado); (d) O procedimento é repetido até toda a lista estar ordenada. Exemplo: ordenação ascendente da lista 7 5 8 10 3 1o varrimento: 5 7 8 10 3 → 5 7 8 10 8 → 5 7 8 10 3 → 5 7 8 3 10 2o varrimento: 5 7 8 3 10 → 5 7 8 3 10 → 5 7 3 8 10 3o varrimento: 5 7 3 8 10 → 5 3 7 8 10 4o varrimento: 3 5 7 8 10 → LISTA ORDENADA • Escreva uma sub-rotina TROCA que compare dois números e os troque, se for necessário, de forma a que o segundo seja sempre maior ou igual ao primeiro. O primeiro número encontra-se na posição de memória apontada pelo par de registos HL e o segundo número na posição de memória seguinte, ou seja, M[HL+1]. Ao retornar a sub-rotina deve deixar o par HL a apontar para o segundo número, deixando os restantes registos com os mesmos valores com que os recebeu; • Escreva uma outra sub-rotina VARRIMENTO que, para uma lista de N números arma- zenados contiguamente em memória, percorre essa lista a partir do seu início, aplicando a sub-rotina TROCA a cada um dos seus elementos (mesmo que não tenha feito a alínea anterior, considere que essa rotina existe). A posição da memória onde a lista está guardada é passada para a rotina no par de registos HL e o número de elementos N é passado no registo C. A sub-rotina deve deixar, ao retornar, todos os registos com os mesmos valores com que os recebeu; • Finalmente, escreva a sub-rotina BUBBLESORT que utiliza a rotina VARRIMENTO para ordenar a lista de números. A posição da memória onde a lista está guardada é passada para a rotina no par de registos HL e o número de elementos N é passado no registo C. Ao contrário das alíneas anteriores não é necessário salvaguardar o contexto. 18. (Teste 17ABR2018) Imagine que pretende controlar o número de acessos de viaturas à Escola Naval usando o microprocessador 8085. Para tal dispõe de um sensor que assinala o valor lógico 1 quando a cancela de entrada abre para entrar um carro, de outro sensor que assinala o valor lógico 1 quando a cancela de saída abre para sair um carro, e de um sinal digital de comando que inibe a abertura da cancela de entrada. Suponhaque o parque da Escola Naval tem uma lotação máxima de 200 viaturas. Escreva o código de um programa em Assembly para fazer o controlo da cancela, ou seja, que não permita a entrada de mais automóveis quando a lotação do parque está completa. Suponha que o valor dos sensores das cancelas de entrada e saída é lido respectivamente dos portos 50h e 51h e que a inibição da abertura da cancela de entrada pode ser realizada escrevendo o valor FFh para o porto 52h. Para voltar a permitir a entrada de viaturas deve ser escrito o valor A0h para esse porto. Assuma que ao iniciar o programa o parque está vazio. 3 Asus Destacar 19. (Teste 17ABR2018) Repita a questão anterior assumindo agora que os sinais digitais provenientes dos sensores das cancelas estão ligados directamente ao microprocessador: o de entrada está ligado à linha de interrupção RST5.5 e o de saída à linha RST6.5. Apresente as rotinas associadas às interrupções correspondentes. Sugestão: em vez de um registo considere agora que o contador de viaturas é armazenado numa localização de memória pré-definida e previamente iniciado num valor conveniente. 20. (Exame 26JUN2018) Pretende-se desenvolver uma rotina em Assembly para o 8085 para contar o número de notas positivas (≥ 10) numa lista de notas. Apresente essa rotina, supondo que o endereço de início da lista de notas em memória é passado no par de registos HL, que o tamanho dessa lista é passado no registo C e que o resultado é devolvido no registo B. 21. (Exame 26JUN2018) Altere ou acrescente, na rotina desenvolvida no ponto anterior, o código necessário para fazer a salvaguarda do contexto existente antes da chamada a essa mesma rotina. 4 Asus Destacar