Folha 1 - Microprocessador I8086
Folha 1 - Microprocessador I8086
Folha 1 - Microprocessador I8086
MICROPROCESSADORES E MICROCONTROLADOES
2º SEMESTRE - 2009/10
1.1 1.2
1
2. Escreva um programa que efectue a adição dos registos AL e BL. O resultado da operação
deve ser armazenado no registo CL. Realize a soma com diferentes valores de modo a testar
situações de overfflow etc.
7. Escreva um programa que armazene no registo CX o menor dos dois valores contidos nos
registos AX e BX.
11. Escreva um programa que incremente a variável VAR1 uma unidade até esta atingir o valor
10. VAR1 possui inicialmente o valor 0
12. Escreva um programa que determine o comprimento de uma string terminada pelo caracter
nulo. O endereço inicial da string é STRING e o resultado deve ser armazenado no registo DX.
2
13. Escreva um programa que ordene por ordem crescente um array de 5 elementos do tipo byte.
14. Escreva um programa que determine o valor máximo de uma tabela de 10 inteiros sem sinal.
O endereço inicial é TABELA e o valor máximo deve ser guardado no registo DX.
15. Escreva um programa que troque todos os bits dos elementos de um array de 5 elementos do
tipo byte.
16. Escreva um programa que utilizando instruções de shift multiplique o registo AX por 4. Altere
o programa de modo a que o registo AX seja dividido por 2.
17. Escreva um programa que, dado um conjunto de 5 bytes armazenados na memória a partir do
endereço BLOCO, altere os bits desses elementos da seguinte forma:
a) b7,b6,b5,b4,b3,b2,b1,b0 0,0,b5, b4 ,1,1,b1, b0
b) b7,b6,b5,b4,b3,b2,b1,b0 b0,b1,b2,b3,b4,b5,b6,b7
18. Escreva um programa que permita escrever no monitor do computador a mensagem "Olá
mundo". O endereço da string deverá estar contido no registo SI.
Altere o programa de modo a que seja possível escolher a cor dos caracteres da string e a cor de
fundo da string.
19. Escreva um programa que, utilizando um ciclo, permita escrever no écran os números de 1 a
5.
20. Altere o programa anterior de modo a que a string seja escrita nas coordenadas x,y do écran
(as coordenadas devem estar contidas nos registos DL e DH).
21. Escreva um programa que permita ler uma string a partir do teclado do computador,
armazenando-a a partir de uma posição de memória cujo endereço deverá estar contido no registo
SI. O tamanho máximo da string deverá ser de 100 caracteres.
22. Escreva um programa que converta uma string num inteiro. O endereço da string deve ser
colocado no registo SI e o inteiro resultante da conversão armazenado no registo AX. O seu
3
programa deverá detectar as situações de erro que considerar importantes, não convertendo a
string sempre que se verificar uma dessas situações.
23. Escreva um programa que converta um inteiro numa string. O endereço da string deve ser
colocado no registo SI e o inteiro a converter no registo AX. O seu programa deverá detectar as
situações de erro que considerar importantes, não convertendo o inteiro sempre que se verificar
uma dessas situações.
24. Escreva um programa que leia 8 inteiros (>0) a partir do teclado e os guarde num array. O
programa deverá em seguida imprimir no ecrã unicamente os números pares.
25. Escreva um programa que escreva no écran o dobro de um número inserido através do
teclado.
26. Escreva um programa que permita ler através do teclado um número de 4 dígitos e apresente
como resultado a sua decomposição.
Exemplo para o número 2578: 2 milhares 5 centenas 7 dezenas 8 unidades.
27. Escreva um procedimento que permita escrever no monitor do computador uma string.
a) Utilize a passagem de parâmetros por registos.
b ) Utilize a passagem de parâmetros por stack.
28. Escreva um procedimento que permita ler uma string a partir do teclado do computador,
armazenando-a num buffer. O tamanho máximo da string deverá ser de 100 caracteres.
a) Utilize a passagem de parâmetros e retorno de valores por registos.
b ) Utilize a passagem de parâmetros e retorno de valores por stack.
29. Escreva um procedimento que converta uma string num inteiro. O seu procedimento deverá
detectar as situações de erro que considerar importantes, não convertendo a string sempre que se
verificar uma dessas situações.
a) Utilize a passagem de parâmetros e retorno de valores por registos.
b ) Utilize a passagem de parâmetros e retorno de valores por stack.
4
31. Escreva um programa que permita ler uma string a partir do teclado e que quando terminar a
inserção da string permita escrever no ecrã o número total de caracteres contidos na string.
32. Escreva um programa que, fazendo uso dos procedimentos anteriores, permita ler um valor inteiro
a partir do teclado e escreva no ecrã o seu quadrado.
33. Com certeza conhece a função strcpy da biblioteca de funções da linguagem de programação C.
Desenvolva então um programa em assembly que copia uma string posicionada no endereço SOURCE
para uma string posicionada no endereço DEST. Ambas as strings terminam com o caracter zero.
34. Escreva um programa em assembly que, tal como a função strcmp da linguagem C, compara duas
strings posicionadas nos endereços STR1 e STR2, respectivamente. O resultado da comparação será
armazenado no acumulador, tendo em atenção os seguintes critérios:
AX > 0 se STR1 > STR2
AX = 0 se STR1 = STR2
AX < 0 se STR1 < STR2
35. Escreva um programa que executa a concatenação de duas strings STR1 e STR2 (função strcat da
linguagem C), devendo o resultado da concatenação ficar guardado em STR1.
36. Escreva um programa que, fazendo acesso directo à memória vídeo, escreva uma string numa
posição (x, y) e determinado atributo. A memória vídeo começa no endereço 0B800:0000 e é disposta
como se fosse um array sequencial, alternando caracter com atributo, isto é, num byte está o caracter e
no seguinte o atributo desse caracter.
37. Elabore um programa que, fazendo uso dos procedimentos anteriores, implemente uma
calculadora de números inteiros. A calculadora deverá começar por pedir o primeiro operando,
depois a operação (+,-,*,/, %) e finalmente o segundo operando. No final deverá apresentar o
resultado da operação. O programa deverá efectuar todo o controlo de erros necessário ao seu
bom funcionamento.
38. Escreva um procedimento que, fazendo acesso directo à memória vídeo, escreva uma
string numa posição (x, y) e determinado atributo. A memória vídeo começa no endereço
0B800:0000 e é disposta como se fosse um array sequencial, alternando caracter com atributo,
isto é, num byte está o caracter e no seguinte o atributo desse caracter.
5
Será necessário também ligar e desligar o altifalante.
Para concluir este programa deverá primeiro desenvolver alguns procedimentos que tornarão a
programação mais simples. Esses procedimentos são os seguintes:
- programar o circuito temporizador do computador
- ligar o altifalante
- desligar o altifalante
- tocar uma frequência no altifalante
- esperar um determinado tempo
Porto 43h
bit 7 bit 0
tipo de contagem
Seleccionar contador 0 - contagem em binário
00 - contador 0 1-contagem em BCD
modo de contagem
01 - contador 1 000 - interrupção no fim da contagem
10 - contador 2 001 - modo monoflop
11 - não utilizada 010 - gerador de impulsos
011 - gerador de onda quadrada
100 - pulso gerado por software
modo de leitura/escrita do contador 101 - pulso gerado por hardware
00 - counter latch instrucion
01 - apenas o byte menos significativo
10 - apenas o byte mais significativo
11 - byte menos sig. depois byte mais sig.
Para o altifalante funcionar como pretendido deve-se utilizar a contagem em binário, geração de onda
quadrada, utilização de 2 bytes e utilização do contador 2.
mov ax,2712
out 42h,al ; enviar os 8 bits menos significativos para o porto 42h
mov al, ah
out 42h,al ; enviar os 8 bits mais significativos para o porto 42h
O procedimento a desenvolver deverá ter como parâmetros de entrada o valor a colocar neste porto.
O esquema seguinte mostra como os vários portos se interligam de modo a produzir um som no
altifalante.
6
Porto 61h
bit 0
circuito
temporizador
contador
0
Amplif. filtro.
contador
1
contador
2
porto 42h
gate
7
A oitava a utilizar no programa pode ser qualquer uma das presentes na tabela
Sugere-se a criação de uma tabela que contenha as notas já convertidas para o formato exigido pelo
procedimento tocar as frequências.
A tabela seguinte mostra esses valores para a oitava 5:
oitava_5 dw 4561,4062,3620,3417,3044,2712,2416
41. Pretende-se que escreva uma Rotina de Atendimento à Interrupção (RAI) 60h. Esta rotina
deve aceitar como parâmetros de entrada CX e SI representando respectivamente o número de
elementos de um array de bytes e um apontador para este, e deve ter como resultado em AX a
soma de todos os elementos do array.
Este trabalho deve englobar as seguintes tarefas:
Procedimento para executar as tarefas pedidas e de acordo com as regras de uma RAI;
Procedimento para ler a tabela de vectores de interrupção;
Procedimento para escrever na a tabela de vectores de interrupção;
Programa principal (startup) onde deve chamar os procedimentos para ler e escrever na
tabela de vectores de interrupção de forma a guardar o vector de interrupção “antigo” (que
deve ser reposto no final do programa), colocar o vector de interrupção novo e chamar a
interrupção 60h de modo a testar a RAI;
42. Pretende-se que escreva uma Rotina de Atendimento à Interrupção (RAI) 61h. Esta rotina
deve aceitar como parâmetro de entrada SI representando um apontador para uma string, e
deve ter como resultado, em AX, o número de caracteres da string.
Este trabalho deve englobar as seguintes tarefas:
Procedimento para executar as tarefas pedidas e de acordo com as regras de uma RAI;
Procedimento para ler a tabela de vectores de interrupção;
Procedimento para escrever na a tabela de vectores de interrupção;
Programa principal (startup) onde deve chamar os procedimentos para ler e escrever na
tabela de vectores de interrupção de forma a guardar o vector de interrupção “antigo” (que
deve ser reposto no final do programa), colocar o vector de interrupção novo e chamar a
interrupção 61h de modo a testar a RAI;
8
A tabela de vectores de interrupção está representada na figura.
9
AX = código da interrupção
CX = offset da nova rotina de atendimento
DX = segmento da nova rotina de atendimento
10