Você está na página 1de 30

Programação do 8085

(Continuação)
Loops
Implementação de contadores
Implementação de “Delays”
Indexação
A Pilha (Stack)
SUBROTINAS
Loops
O loop é uma técnica muito frequentemente usada
na programação que consiste e repetir uma
sequência de instruções com vista a efectuar uma
mesma tarefa várias vezes.
 Determinados tipos de tarefas requerem um loop
contínuo enquanto que outros requerem loops
condicionais.
loop contínuo e condicional
Implementação de contadores
 Uma das aplicações mais frequentes na
programação em asembly é a contagem de
ocorrências de um determinado evento.
 A forma mais comum de implemetar um
mecanismo de contagem é carregar num registo ou
par de registos com um determinado valor e
usando uma instrução de salto condicional,
decrementar o contado de cada vez que o evento
ocorre.
Esquema geral de
implementação de um contador
Exemplo 1
 Elaborar um programa que transfere 100 bytes da
memória, começando do endereço 3400H para um
despositivo de saida com endereço 7FH. Suponha
que o despositivo pode receber os dados na mesma
velocidade de operação do µP.
Resolução
 MVI D, 64H
 LXI H, 3400H
 loop: MOV A, M
 OUT 7FH
 INX H
 DCR D
 JNZ loop
 HLT
Exercicio 1
 Elaborar um programa que transfere 1000 bytes da
memória, começando do endereço 3400H para um
despositivo de saida com endereço 7FH. Suponha
que o despositivo pode receber os dados na mesma
velocidade de operação do µP.
Implementação de “Delays”
 Um dos usos mais comuns do loop condicional é
na criação de rotinas ou programas para gerar
“delays” (retardos). Para tal é necessario conhecer
 Frequência de Clock (f)
 Período de Clock (T-Estado) – 1/f
 Tempo de execução da instrução (Dt)
 Números de estados (Nt)
Qual o tempo necessário para
executar a seguinte instrução
 MVIA, 32H => Carregar o byte 32H no
Acumulador.
 f = Frequência de Clock = 2 MHz
 T-Estado = Período de Clock = 1/f = 0.5µs
 Dt = Tempo de execução para a instrução Nt*1/f= 7
T * 0,5 = 3,5 μs (Sem loop)
 Dt = Nt*(1/f)*Nloop
Exemplo 2
 05F1H DCX D
 05F2H MOV A, D
 05F3H ORA E
 05F4H JNZ 05F1H

 DCX D=5T
 MOV A, D = 7 T
 ORA E = 4 T
 JNZ 05F1 = 10 T
 frequência interna é de 2,35 MHz
 Período de Clock = 1/f = 1/ 2,35 MHz = 0.425532μs
 Dt = 26*0.425532μs = 11.06 μs
 O Tempo de execução para a instrução
 05F1H DCX D
 05F2H MOV A, D
 05F3H ORA E
 05F4H JNZ 05F1H
 É 110.6 μs
Indexação
 Indexação é uma técnica que consiste em usar um
par de registos contendo endereço inicial de um
bloco de memória e ir incrementando o conteúdo
por 1 para aceder (para leitura ou escrita)
sucessivamente locais consecutivos desse bloco de
memória. O exercício que se segue mostra o uso
do método de indexação.
Exemplo 3
 Elaborar um programa que permite mover um
bloco de 100 bytes de dados armazenados em
locais consecutivos de memória , partindo do
endereço 2020H, para um outro bloco de 100
bytes que começa com o endereço 3020H
 LXI H, 2020H
 LXI B,
3020H
 MVI D, 64H
 Loop: MOV A, M
 STAX B
 INX H
 INX B
 DCR D
 JNZ loop
 HLT

A Pilha (Stack)
 A pilha é um bloco de memória que é configurado
para ser usado principalmente para o armazenar
temporariamente informação referente ao estado
do microprocessador logo antes de uma chamada a
uma subrotina.
 O acesso a pilha é conseguida atraves das
instruções PUSH e POP.
 No acesso da pilha para a operação de leitura, o
último dado introduzido será sempre o primeiro a
ser lido. Isto significa que a pilha funciona no
sistema de LIFO.
Inicializaçãop da pilha e dos
registos internos
 LXI SP, 2300H ; inicializar o stack pointer
com o endereço 2300H
 LXI B, 42D9H ; carregar o par BC com
o valor 42D9H (42 para o
registo B e D9 para o
registo C)
Transferência do dado para a pilha
 PUSH B Guardar o conteudo do par
BC na pilha (Primeiro guarda-se o conteudo de B e
depois o conteúdo de C).
Transferência do dado da pilha
para o par de registos
 POP B Busca o conteudo da pilha (o
conteúdo das duas “ultimas posições da pilha) para
o par BC
SUBROTINAS
 A necessidade de implementação de uma
subrotina surge quando um determinado conjunto
de instruções tem de ser executada várias vezes no
mesmo programa ou então em multiplas partes do
mesmo programa.
 Em assembly de 8085 a chamada a uma subrotina
é efectuada através da instrução CALL.
 Quando uma subrotina está em execussão, o
retorno ao programa principal é realizado através
da instrução RET.
 A execussão da instrução CALL começa por guardar
o conteúdo do contador de programas (PC) na pilha
para depois transferir a sequência da execussão do
programa para o endereço do início da rotina.
 Recorde-se que o contador de programas conem
sempre o endereço da próxima instrução por se
executar. Assim, quando a instrução está a ser
executada o PC contém o endereço da instrução logo a
seguir a instrução CALL.
 Por outro lado uma subrotina terminam sempre com a
instrução RET. A execussão desta instrução faz com
que o endereço que havia sido levado para a pilha na
altura da chamada da subrotina seja lido de volta para
o PC retomando-se deste modo a execussão do
programa principal
Exercicio 2
 Elaborar um programa que, ao iniciar zera todos os bits de um
registo de 8 bits usado como uma porta de saida com endereço 09H.
De seguida fica a monitorar continuamente o estado de uma chave
(Switch) conectada ao bit 0 de um registo de oito bits que é usado
como uma porta de entrada com endereço 08H. Logo que constatar
que a chave está activada (nível lógico um) o programa deve esperar
durante 20ms para depois enviar um sinal de nível lógico 1 para a
activação de um mecanismo de sinalização luminosa (luz amarela)
conectado ao bit 0 da porta de saida acima referida. Depois passa a
monitorar o estado da chave conectada ao bit 1 da porta de entrada.
Logo que constatar que a chave está activada (nível lógico um) o
programa deve esperar de novo durante 20ms para depois enviar um
outro sinal de nível lógico 1 para a activação de um mecanismo de
sinalização luminosa (luz vermelha) conectado ao bit 1 da porta de
saida.
 A rotina está enquadrada num programa que lê as
entradas de dois switches, um de cada vez para
depois enviar para um port de saida um byte de
dados que servirá para activar o alarme se o switch
estiver activado. Entre o momento da constatação
de que o switches está activado e o momento do
envio do sinal de alarme deve haver um intervalo
de tempo de 20ms.
 Neste programa supoe-se que os switches estão
conectados aos bits 0 e 1 da porta de entrada com
o endereço 08H enquanto que as saidas estão
também conectadas aos bits 0 e 1 da porta de saida
cujo endereço é 09H
 O programa começa com a inicialização do port de saida
enviando o valor 00H o que faz com que o “port” seja
“resetado”. Depois lê a porta de entrada e verifica se o
swicth 1 (S!) está activado. Caso este esteja activado
chama-se a rotina que gera um delay de cerca de 20ms e
depois dá saida o valor 02H (0000 0010) para o porta de
saida. Depois este processo é repetido para o switch 2.
A rotia que gera o delay implemeta um loop
simples usando o par BC como contador. Este par
de registos é inicializado com o valor decimal
1667 que quando decrementado até zero e
considerando que o microprocessador funciona
com a frequência de clock de 2 MHz irá resultar
num delay de 20ms. Repare que o teste para se
determinar se o par BC contém ou não o valor zero
é feito usando o operador OR entre os registos B e
C. O resultado do teste só será zero se ambos os
registos estiverem com o valor zero.
Aninhamento de subrotinas
 Em assembly uma subrotina pode chamar uma outra
subrotina e este por sua vez pode chamar uma outra e
assim por diante. O limite em termos do grau de
aninhamento é determinado pela extensão de memória a
que a pilha está reservada pois em cada chamada a uma
subrotina o endereço de retorno e possivelmente outra
informação referente ao estado do microprocessador e
que se encontra nalguns registos internos devem ser
guardados na pilha. Sendo assim, enquanto a pilha não
estiver “cheia” as subrotinas podem continuar a ser
aninhadas.

Você também pode gostar