Pilha e Subrotinas

Propaganda
Faculdade de Engenharia de Ilha Solteira – Departamento de Engenharia Elétrica
ELE 1078 - Microprocessadores I
4 – Pilha e Subrotinas no 8085
A Pilha é uma região da memória RAM, definida pelo usuário, para guardar valores que serão
usados posteriormente. Assim, o usuário pode guardar o conteúdo de qualquer registrador (dois
a dois: A e Flags, B e C, D e E, H e L) na pilha e o microprocessador guarda automaticamente
os endereços de retorno de subrotinas comuns e de subrotinas de interrupções.
Os dados são armazenados na pilha de modo seqüencial e existem duas formas de
manipulação:
FIFO (first in - first out) = o primeiro dado a entrar será o primeiro a sair.
LIFO (last in - first out) = o último dado a entrar será o primeiro a sair.
4.1 - Organização da pilha no 8085
No 8085 a manipulação da pilha é do tipo LIFO.
Quando um dado vai ser armazenado na pilha, o SP é decrementado. Ao contrário,
quando um dado vai ser retirado da pilha, o SP é incrementado.
No 8085 o SP estará indicando sempre uma posição da pilha que contém um dado.
Na inicialização do sistema o endereço inicial da pilha (topo da pilha) deve ser definido
pelo programador. É importante observar a localização de dados gerais na memória para que
não haja conflito com a pilha. O modo adequado para inicialização da pilha no 8085 é usar a
seguinte instrução:
LXI SP, dado16.
4.2 – INSTRUÇÕES PARA MANIPULAÇÃO DA PILHA NO 8085
No 8085 a pilha é manipulada com dados de 16 bits. Como não existem registradores de
16 bits, a cada operação usa-se um PAR DE REGISTRADORES.
•
PUSH PR → Guarda o conteúdo do par de registros especificado na pilha;
Exemplo: PUSH B (Salva o par BC)
Procedimento computacional:
SP = SP -1
Armazena B no endereço de memória dado por SP
SP = SP -1
Armazena C no endereço de memória dado por SP
•
PUSH PSW → Salva o conteúdo do acumulador e os FLAGs na pilha;
•
POP PR → Carrega o par de registros com o conteúdo de duas posições da pilha;
Exemplo: POP B
Procedimento computacional:
Carrega C com o conteúdo do endereço dado por SP
SP = SP + 1
Faculdade de Engenharia de Ilha Solteira – Departamento de Engenharia Elétrica
ELE 1078 - Microprocessadores I
Carrega B com o conteúdo do endereço dado por SP
SP =SP + 1
•
POP PSW → Carrega o acumulador e os FLAGs com valores da pilha;
Observação: Existem duas instruções associadas ao par de registros HL e o apontador de
pilha PC:
•
•
•
XTHL → Os valores de HL e SP são trocados;
SPHL → Faz SP ser igual a HL.
PCHL → (PCh) = (H), (PCl) = (L)
4.3 – INSTRUÇOES PARA MANIPULAÇÃO DE SUBROTINAS NO 8085
As chamadas de subrotina no 8085 podem ser condicionadas aos FLAGs ou diretas. Em
qualquer situação, o microprocessador salva automaticamente o conteúdo do PC, que contém o
endereço da próxima instrução, na pilha (PCÆPILHA). Quando o microprocessador encontra
uma instrução indicando o fim da subrotina, o PC é automaticamente recarregado (PILHA Æ
PC) com o programa principal continuando normalmente.
As instruções envolvendo subrotinas são as seguintes:
• CALL end16 → Chama a subrotina a partir do endereço especificado, incondicionalmente.
• Cccc end16 → Chama uma subrotina armazenada a partir do endereço especificado se a
condição ccc é verdadeira.
CNZ end16 → Chama uma subrotina a partir do endereço especificado se o FLAG Z = 0
CZ end.16 → Chama uma subrotina a partir do endereço especificado se o FLAG Z = 1
CNC end16 → Chama uma subrotina a partir do endereço especificado se o FLAG Cy = 0
CC end16 → Chama uma subrotina a partir do endereço especificado se o FLAG Cy = 1
CPO end16 → Chama uma subrotina a partir do endereço especificado se o FLAG P = 0
CPE end16 → Chama uma subrotina a partir do endereço especificado se o FLAG P = 1
CP end16 → Chama uma subrotina a partir do endereço especificado se o FLAG S = 0
CM end16 → Chama uma subrotina a partir do endereço especificado se o FLAG S = 1
• RET → Indica o retorno de uma subrotina de maneira incondicional;
• Rccc → Indica o retorno de uma subrotina, condicionado à ccc ser verdadeira;
RNZ end16 → Retorna da subrotina se o FLAG Z = 0
RZ end16 → Retorna da subrotina se o FLAG Z = 1
RNC end16 → Retorna da subrotina se o FLAG Cy = 0
RC end16 → Retorna da subrotina se o FLAG Cy = 1
RPO end16 → Retorna da subrotina se o FLAG P = 0
RPE end16 → Retorna da subrotina se o FLAG P = 1
RP end16 → Retorna da subrotina se o FLAG S = 0
RM end16 → Retorna da subrotina se o FLAG S = 1
4.4 – ESTRUTURA DE SUBROTINAS
Faculdade de Engenharia de Ilha Solteira – Departamento de Engenharia Elétrica
ELE 1078 - Microprocessadores I
Uma subrotina deve ser cuidadosamente estruturada e deve-se deixar bem claro três pontos
básicos:
1. Função da subrotina e sua localização (endereço);
2. Parâmetros de entrada;
3. Parâmetros de saída.
Exemplo:
Subrotina que divide - X/Y
Função:
Entrada:
Saída:
Divisão (endereço)
Valores X (reg. A) e Y (reg. B)
Resultado (reg. A)
No caso de subrotinas em “ASSEMBLY”, é importante especificar os registradores que
serão afetados.
4.5. - Funcionamento da Pilha e Exercícios
Observações
(a) O conteúdo guardado na pilha é sempre de 16 bits. Assim, o microprocessador normalmente
guarda o conteúdo de PC, que já é de 16 bits, mas o usuário normalmente guarda o conteúdo de
registradores de 8 bits, que então são associados 2 a 2;
(b) Os registradores duplos que podem ser guardados na pilha são PSW (= A + Flags), B (= B
+ C), D (= D + E) e H (= H + L);
(c) Para guardar o conteúdo de um desses registradores duplos usa-se a instrução PUSH rp;
(d) Para recuperar o conteúdo que foi guardado na pilha usa-se a instrução POP rp;
(e) Quando uma informação é enviada para a pilha o byte mais significativo é guardado
primeiro; isso significa que o byte menos significativo vai ser retirado primeiro porque o
último dado armazenado é o primeiro a ser retirado;
(f) A pilha do 8085 evolui do maior endereço para o menor, ou seja, a cada vez que uma
informação (2 bytes) é enviada para a pilha, o endereço do topo da pilha é reduzido de 2. Ele é
acrescido de 2 quando a informação é retirada da pilha;
(g) O apontador de pilha SP aponta sempre para o topo da pilha, mas ele é incrementado de 1
antes de cada byte ser armazenado.
Exemplo de armazenamento na pilha:
Supondo que inicialmente SP = 2090 h, A = 01 h, F = 23 h, B = 45 h e C = 67 h, as
figuras a seguir mostram a evolução da pilha após cada instrução dada. A região em destaque
corresponde à posição apontada por SP após a instrução.
Faculdade de Engenharia de Ilha Solteira – Departamento de Engenharia Elétrica
ELE 1078 - Microprocessadores I
Exercício 1. Mostre, através de um mapa de memória, a evolução da pilha quando se realiza as
seguintes instruções, na seqüência mostrada:
PUSH B, PUSH D, ADD B, PUSH PSW, ADD D, POP PSW, OUT 90, POP D, POP B
Valores iniciais: SP = 20C0 h, (A) = 33 h, (B) = 1C h, (C) = 4B h, (D) = 10 h, (E) = FE
h e (F) = 3D h.
Exercício 2 - Mostre, através de um mapa de memória, a evolução da pilha quando se
executam as seguintes instruções, na seqüência mostrada:
PUSH PSW, PUSH B, CALL ADIÇÃO, (RET), MOV B, A, POP B, POP PSW
Valores iniciais: (SP) = 2090 h, (A) = 53 h, (B) = 0F h, (C) = 05 h, (D) = 12 h, (E) = 01
h e (F) = 55 h. Endereço da chamada de subrotina “CALL ADIÇÃO”: 2020 h
Exercicio 3- Considere o programa abaixo, em mnemônico, e responda as questões a seguir,
sabendo que a subrotina no endereço 0200 h provoca um retardo de 1ms e afeta o registrador B.
(a) O que o programa acima faz?
(b) Desenhe uma tabela mostrando os endereços e o conteúdo da pilha após a execução da
instrução CALL 0200h.
(c) Quais os valores enviados pela porta de saída 01?
(d) Mostre o que deve ser feito se o reg. B for usado no lugar do reg. C.
Download