Академический Документы
Профессиональный Документы
Культура Документы
1. Objetivos
2. Equipamento necessário
3. Teoria
ANTES DE INICIAR A PARTE PRÁTICA, LEIA ATENTAMENTE A TEORIA EXPOSTA NESTE ITEM E
NOS CAPÍTULOS 9 E 10 DO GAONKAR
A PILHA
A pilha é uma região da memória RAM reservada para armazenar, principalmente, endereços de retorno de
sub-rotinas. Pode também ser usada para armazenar o conteúdo de registradores, a fim de evitar que
sejam alterados ou destruídos por uma sub-rotina. As operações de pilha transferem dados de 16 bits entre
pares de registradores e a memória RAM. As duas operações básicas são o PUSH, que adiciona dados a
pilha, e o POP, que retira dados da pilha.
Por exemplo, os dados armazenados no registrador B de um programa serão perdidos se esse registrador
for usado durante uma sub-rotina. Uma instrução PUSH, executada no começo de uma sub-rotina, salvará
o conteúdo deste registrador. A instrução PUSH B armazena o conteúdo do par de registradores BC na
pilha. PUSH D armazena o conteúdo do par DE, PUSH H armazena o par HL e PUSH PSW armazena o
acumulador e o registrador F. PSW representa a palavra de estado do processador.
Ao final da sub-rotina, os dados são restaurados (devolvidos) aos registradores originais por uma instrução
POP. Uma instrução POP copia os dados armazenados na pilha para o par de registradores indicados na
própria instrução. Por exemplo, POP B restaura dados da pilha para os registradores B e C. Note que os
dados devem ser retirados da pilha na ordem inversa daquela em que foram inseridos. Portanto, a pilha é
uma estrutura de dados do tipo LIFO (Last In, First Out), ou seja, o último a entrar é o primeiro a sair. A
seqüência de instruções a seguir guarda e restaura todos os registradores:
PUSH PSW
PUSH B
PUSH D
PUSH H
.
Instruções da sub-rotina
.
POP H
POP D
POP B
POP PSW
RET
Para o controle da pilha, existe um registrador mantido pelo processador chamado ponteiro de pilha (SP)
Seu programa deverá iniciar este ponteiro. Isto significa que seu programa deverá carregar o endereço
base da pilha no SP. Este endereço base é normalmente o endereço mais alto da RAM. Isto porque a pilha
cresce a medida que o SP é decrementado, isto é, cresce do maior endereço para o menor. A medida que
se acrescentam itens à pilha, esta se expande para posições de memória com endereços mais baixos. A
24
Mclab04.doc Autor: Paulo Sergio da Silva
Criado em 14/7/1999 10:58 Atualizado em 28/2/2007 11:55
única limitação ao número de itens que podem ser adicionados a pilha é a quantidade de RAM disponível
para a pilha.
Por exemplo, sempre que uma instrução PUSH B é executada, o SP é decrementado de uma unidade, o
conteúdo do registrador B é copiado para a posição de memória apontada pelo SP. A seguir o SP é
decrementado novamente de uma unidade e o conteúdo do registrador C é copiado para a posição de
memória apontada por ele.
A instrução POP B copia o byte de dados anteriormente guardado na pilha de volta para o registrador C,
incrementa o SP, copia o próximo byte de dados guardado na pilha para o registrador B e incrementa
novamente o SP.
Após uma seqüência de PUSHs e POPs, o SP fica apontando para o mesmo endereço que ele continha
antes das operações.
SUB-ROTINAS
Uma rotina é uma pequena secção de programa que executa uma tarefa específica. Se for preciso usar um
procedimento muitas vezes num programa, pode-se gravá-lo uma única vez na memória na forma de uma
sub-rotina e então chamá-lo toda vez que for necessária. Este método ocupa muito menos memória que o
processo de rescrever o procedimento inteiro toda vez que o mesmo for utilizado.
Nenhum dos programas de laboratório que você usou até agora é um programa por si mesmo. A maior
parte dos programas reais executam uma série de tarefas, muitas das quais podem ser comuns a vários
outros programas. Você precisa de uma maneira de formular essas tarefas de uma só vez e torná-la
disponível tanto para diferentes partes de um programa quanto para outros programas.
Isto é possível escrevendo a tarefa como uma sub-rotina, cujas instruções resultantes possam ser gravadas
de uma só vez, testadas e a partir de então usadas repetidamente. Esta sub-rotina poderá tornar-se parte
de uma biblioteca de sub-rotinas, que fornecerá soluções para problemas comuns.
O 8085 tem instruções especificas para transferir o controle para sub-rotinas e devolver o controle ao
programa principal. A instrução CALL transfere o controle à sub-rotina e a instrução RET (return) devolve o
controle ao programa principal. A instrução CALL guarda o valor antigo do contador do programa na pilha
antes de colocar o endereço inicial da sub-rotina no contador de programa (PC).
A instrução RET recupera o valor antigo da pilha e o coloca de volta no contador de programa. O efeito é a
transferência do controle do programa, primeiro para a sub-rotina e depois de volta ao programa principal.
Uma sub-rotina também pode transferir o controle para outra sub-rotina e assim por diante. Esse processo
é chamado aninhamento; isto significa que uma instrução CALL numa sub-rotina pode chamar outra sub-
rotina.
4. Experimentos
O Programa 1 mostra como usar a pilha. Este programa carrega pares de registradores com dados e
transfere estes dados para a pilha. Em seguida o programa recupera os dados da pilha.
ENDEREÇO DADOS ASSEMBLY COMENTÁRIOS
LXI SP,20A0 Inicializa o SP
25
Mclab04.doc Autor: Paulo Sergio da Silva
Criado em 14/7/1999 10:58 Atualizado em 28/2/2007 11:55
ENDEREÇO CONTEÚDO
209F
209E
209D
209C
209B
209A
2099
2098
Tabela 1 - Resultados Parciais do Programa
Altere o conteúdo dos registradores A, B, C, D, E, H, L e F para FFH. Continue a execução do restante do
programa pressionando as teclas EXECUTE, GO e EXECUTE.
Verifique que ao final do programa os dados dos registradores são os originais! Complete a Tabela 2.
REGISTRADOR CONTEÚDO
A
F
B
C
D
E
H
L
PC
SP
Tabela 2 - Resultados do Programa
26
Mclab04.doc Autor: Paulo Sergio da Silva
Criado em 14/7/1999 10:58 Atualizado em 28/2/2007 11:55
27
Mclab04.doc Autor: Paulo Sergio da Silva
Criado em 14/7/1999 10:58 Atualizado em 28/2/2007 11:55
RST 1
28
Mclab04.doc Autor: Paulo Sergio da Silva
Criado em 14/7/1999 10:58 Atualizado em 28/2/2007 11:55
SUBROTINA PARITY
ENDEREÇO CONTEÚDO
209F
209E
209D
209C
209B
209A
Tabela 3 - Pilha
j) Note que os quatro últimos bytes armazenados nestas posições estão de acordo como os quatro
bytes dos registradores H, L, A e F.
k) Execute as instruções MOV A,M e ANI 7F. Observe o conteúdo dos registradores e anote na Tabela
4.
29
Mclab04.doc Autor: Paulo Sergio da Silva
Criado em 14/7/1999 10:58 Atualizado em 28/2/2007 11:55
REGISTRADOR CONTEÚDO
A
F
B
C
D
E
H
L
PC
SP
Tabela 4 - Conteúdo dos registradores
ENDEREÇO CONTEÚDO
209F
209E
209D
209C
209B
209A
Tabela 5 - Pilha
REGISTRADOR CONTEÚDO
A
F
B
C
D
E
H
L
PC
SP
Tabela 6 - Conteúdo dos registradores
30
Mclab04.doc Autor: Paulo Sergio da Silva
Criado em 14/7/1999 10:58 Atualizado em 28/2/2007 11:55
INÍCIO
(A) > 9 ? No
Yes
(A) = (A) + 07
(A) = (A) + 30
FIM
31
Mclab04.doc Autor: Paulo Sergio da Silva
Criado em 14/7/1999 10:58 Atualizado em 28/2/2007 11:55
O dígito BCD mais significativo é deslocado duas vezes para a direita através do flag de carry. Isto é
realizado pela execução das instruções RRC. O resultado parcial é armazenado no registrador C. A seguir,
o dígito BCD mais significativo é deslocado novamente para a direita através do flag de carry, adicionado ao
registrador C e deslocado para a esquerda através do carry.
Finalmente, este valor é adicionado ao dígito BCD menos significativo. Deste modo a conversão BCD para
binário é obtida.
O endereço 2050 contém o número BCD de dois dígitos, enquanto o endereço 2051 contém o resultado da
conversão.
32
Mclab04.doc Autor: Paulo Sergio da Silva
Criado em 14/7/1999 10:58 Atualizado em 28/2/2007 11:55
e) Execute a primeira instrução ANI e observe que você obteve o seguinte resultado no acumulador:
A = 0011 0011 (correspondente ao número 33h)
Mask = 0000 1111 (correspondente à máscara 0Fh)
A and Mask = 0000 0011 (resultado)
f) Observe os diversos registradores e complete a Tabela 6.
REGISTRADOR CONTEÚDO
A
F
B
C
D
E
H
L
SP
PC
Tabela 6 - Conteúdo dos registradores
g) Execute o programa até a última instrução. O resultado estará contido no acumulador e na posição
de memória 2051. Para o número BCD 33 o resultado da conversão será 21H
h) Teste o programa para diferentes números BCD.
i) Execute o programa no modo contínuo.
33