Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

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

Mais conteúdos dessa disciplina