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.