Vous êtes sur la page 1sur 40

Microprocessadores I – ELE 1078

Conjunto de Instruções do Microprocessador


8085
Aula 9
- PILHA E SUBROTINAS -
9.1 - Grupos de Instruções

As instruções no 8085 são distribuídas em 5 grupos:

1. Grupo de transferência da dados: Move dados entre


registradores ou posição de memória e registradores;

2. Grupo Aritmético: Adição, subtração, Incrementos, decremento;

3. Grupo Lógico: AND, OR, XOR, Comparação, Rotação,


Complemento;

4. Grupo de Desvio: Condicionais, Incondicionais, Subrotinas;

5. Grupo de Controle, Pilha, Entrada e Saída.


9.2 - S T A C K (Pilha)
Pilha: espaço de memória R/W utilizada para armazenamento temporário
durante a execução de um programa.
SP: registrador de 16 bits que aponta o endereço da posição mais alta da
pilha

O início da posição da pilha (stack) é definido no programa principal, e


geralmente é reservado na região mais alta da memória.
LXI SP, 20B0H => 31 B0 20
A pilha pode ocupar toda de memória de endereço armazenado no registro
de apontador de pilha (SP - stack pointer).

Exemplo: LXI SP, 2099H


O armazenamento de bytes de dados inicia-se na posição 2098H e
continua em ordem decrescente, 2097H, 2096H, etc.

O Stack é iniciado na posição alta de memória para evitar que o programa


seja destruído pelas informações da pilha.
9.2 - S T A C K (Pilha)
Os bytes dos pares de registradores (B, D, H e PSW) podem ser armazenados
na Pilha na ordem reversa (decrementando o endereço de memória)
através da instrução PUSH.

PUSH B (Registros BC)


PUSH D (Registros DE)
PUSH H (Registros HL)
PUSH PSW (Program Status Word) Acumulador + Flags

Os bytes podem ser transferidos da Pilha para os respectivos registradores


através da instrução POP.

POP B
POP D
POP H
POP PSW
9.2 - S T A C K (Pilha)
A Pilha é compartilhada pelo Programador e pelo Microprocessador.

Programador:
armazenar e retirar informação da pilha através das instruções PUSH e POP,
respectivamente.

Microprocessador
armazena o conteúdo do PC (Program Counter) na Pilha quando uma Sub-
rotina

LXI SP, D16 => Carrega o Stack Pointer. O registro SP é carregado com um
endereço (2 bytes).

PUSH rp => Armazena o conteúdo do par de registradores na Pilha (Stack).


Ex. PUSH B
O conteúdo do registrador SP é decrementado e o conteúdo do registrador
de maior ordem (registro B) é copiado para a posição do SP;
O conteúdo do registrador SP é novamente decrementado e o conteúdo
do registro de menor ordem (registro C) é copiado para a posição do SP.
9.2 - S T A C K (Pilha)
POP rp => Retira o conteúdo da Pilha para o par de registradores.
Ex. POP B
O conteúdo da localização de memória indicada pelo SP é copiada para o
registrador de menor ordem (registrador C) e o Stack é incrementado de 1.
O conteúdo do próximo endereço de memória é copiado para o registrador
de maior ordem (registrador B) e o Stack é novamente incrementado de 1.

Na operação de PUSH e POP nenhum Flag é alterado.

O conteúdo da memória utilizada pela Pilha permanece inalterado até que um outro
valor seja armazenado na memória.
9.3. - Exemplo 1
2000 LXI SP, 2099H
2001 LXI H, 42F2H
2006 PUSH H
2007 CALL DELAY (Chamada de subrotina )
200A POP H
200B HLT
9.3. - Exemplo 1

2000 LXI SP, 2099H


2001 LXI H, 42F2H
2006 PUSH H
2007 CALL DELAY (Chamada de subrotina)
200A POP H
200B HLT

LXI SP, 2099H


LXI H, 42F2H
9.3. - Exemplo 1
2000 LXI SP, 2099H
2001 LXI H, 42F2H
2006 PUSH H
2007 CALL DELAY (Chamada de subrotina)
200A POP H
200B HLT

LXI SP, 2099H


LXI H, 42F2H

LXI SP, 20B0


9.3. - Exemplo 1
2000 LXI SP, 2099H
2001 LXI H, 42F2H
2006 PUSH H
2007 CALL DELAY (Chamada de subrotina)
200A POP H
200B HLT

PUSH H

O Stack Pointer (SP) é decrementado de 1, assumindo 2098H, e o conteúdo do


registrador H é copiado para a posição de memória 2098H;
O SP é novamente decrementado de 1, assumindo 2097H, e o conteúdo do
registrador L é copiado para a posição de memória 2097H.

O Conteúdo do par HL não é perdido, podendo ser utilizado pela rotina DELAY.
9.3. - Exemplo 1
2000 LXI SP, 2099H
2001 LXI H, 42F2H
2006 PUSH H
2007 CALL DELAY (Chamada de subrotina)
200A POP H
200B HLT

POP H

O conteúdo do TOPO da Pilha, apontado pelo SP, é copiado para o registrador de


menor ordem (Registro L), e o SP é incrementado de 1, assumindo 2098H.
O Conteúdo do TOPO da Pilha, apontado pelo SP, é copiado para o registrador de
maior ordem (Registro H), e o SP é incrementado de 1, assumindo 2099H.
O Conteúdo das memórias 2097H e 2098H não são destruídos até algum outro
byte serem armazenados nessas posições de memória.
9.4 – Instruções de Pilha
9.4 – Instruções de Pilha
9.5 - Exemplo 2

A faixa de memória disponível para o programador é de 2000H a 23FFH.


Um programa para a transferência de dados e operações aritméticas está
armazenado das posições de memória 2000H a 2050H e o Stack Pointer (SP) é
iniciado na posição 2400H.
Dois conjuntos de dados são armazenados iniciando nas posições 2150H e
2280H. Os registradores HL e BC são utilizados como apontadores de
memórias para a localização de dados.
9.5 - Exemplo 2
A faixa de memória disponível para o programador é de 2000H a 23FFH. Um
programa para a transferência de dados e operações aritméticas está
armazenado das posições de memória 2000H a 2050H e o Stack Pointer (SP)
é iniciado na posição 2400H.
Dois conjuntos de dados são armazenados iniciando nas posições 2150H e 2280H.
Os registradores HL e BC são utilizados como apontadores de memórias para
a localização de dados.
9.5 - Exemplo 2
A faixa de memória disponível para o programador é de 2000H a 23FFH. Um
programa para a transferência de dados e operações aritméticas está
armazenado das posições de memória 2000H a 2050H e o Stack Pointer
(SP) é iniciado na posição 2400H.
Dois conjuntos de dados são armazenados iniciando nas posições 2150H e 2280H.
Os registradores HL e BC são utilizados como apontadores de memórias
para a localização de dados.
9.5 - Exemplo 2
A faixa de memória disponível para o programador é de 2000H a 23FFH. Um
programa para a transferência de dados e operações aritméticas está
armazenado das posições de memória 2000H a 2050H e o Stack Pointer
(SP) é iniciado na posição 2400H.
Dois conjuntos de dados são armazenados iniciando nas posições 2150H e 2280H.
Os registradores HL e BC são utilizados como apontadores de memórias
para a localização de dados.
9.5 - Exemplo 2
A faixa de memória disponível para o programador é de 2000H a 23FFH. Um
programa para a transferência de dados e operações aritméticas está
armazenado das posições de memória 2000H a 2050H e o Stack Pointer
(SP) é iniciado na posição 2400H.
Dois conjuntos de dados são armazenados iniciando nas posições 2150H e 2280H.
Os registradores HL e BC são utilizados como apontadores de memórias
para a localização de dados.
9.5 - Exemplo 2
9.5 - Exemplo 2
9.5 - Exemplo 2
9.5 - Exemplo 2
9.5 - Exemplo 2
9.5 - Exemplo 2
9.6 - Exemplo 3.
9.6 - Exemplo 3. Avaliar o Flag
9.7 - Exemplo 4
9.8 - Subrotinas
Grupo de instruções escrito separadamente do programa principal, para executa a
função que ocorre repetidamente no programa principal.

Objetivos
1. Dividir o programa em tarefas simples e modulares;
2. Criar procedimentos que podem ser “chamados” de diversos pontos do
programa.

Vantagens
1. Código mais compactos;
Se é necessário fazer várias vezes a mesma tarefa, existe apenas 1 porção
de código para a excetuar.
2. Códigos mais modular;
Permite uma programação mais ordenada e estruturada.
3. Menos erros.
As subrotinas podem ser testadas uma a uma.
9.8 - Subrotinas

CALL<addr> => É usado no programa principal para chamar a subrotina.

RET => É utilizado no final da sub-rotina para retornar ao programa principal.

Quando uma sub-rotina é chamada, o conteúdo do PC (Program Counter), que é o


endereço da instrução seguinte ao da instrução CALL, é armazenado na
Pilha;
O conteudo do PC é alterado para conter o endereço da subrotina.

Quando a instrução RET é executada no final da subrotina, o ultimo conteúdo


armazenado na pilha é retirado e colocado no PC. Isto faz com que a
seqüência de execução seja retomada no programa principal.
9.8 - Subrotinas
CALL<addr> => É usado no programa principal para chamar a subrotina.

RET => É utilizado no final da sub-rotina para retornar ao programa principal.

Quando uma sub-rotina é chamada, o conteúdo do PC (Program Counter), que é o


endereço da instrução seguinte ao da instrução CALL, é armazenado na
Pilha;
O conteudo do PC é alterado para conter o endereço da subrotina.

Quando a instrução RET é executada no final da subrotina, o ultimo conteúdo


armazenado na pilha é retirado e colocado no PC. Isto faz com que a
seqüência de execução seja retomada no programa principal.

CALL – RET

CALL <condição> - RET <condição>


9.8 - Subrotinas
9.8 - Subrotinas
9.8.1 Múltiplas chamadas para uma Sub-rotina
9.8.2 - Documentação da Subrotina e passagem de parâmetros

Várias informações são passadas entre o programa que chama a subrotina e a


subrotina. Dessa forma é preciso documentar a subrotina de forma clara e
cuidadosa.

1. Função da Subrotina;
2. Parâmetros de entrada e de saída;
3. Registradores utilizados e modificados;
4. Lista de outra Subrotinas chamadas pela subrotina.

Passagens de parâmetros:

1. Nos registradores;
2. Em endereços fixos de memória;
3. No Stack.
9.8.2 - Documentação da Subrotina e passagem de parâmetros
Passagens de parâmetros:

1. Nos registradores;
A rotina recebe os dados nos registradores B e C, e devolve o resultado no
Acumulador.

2. Em endereços fixos de memória;


A rotina recebe os dados nos endereços 20B0H e 20B1H, devolvendo o
resultado no endereço 20B2H.

3. No Stack.
Recebendo no stack os dados e devolvendo-os também no stack;
Recebendo no stack os dados e o endereço onde deve ser guardado o
resultado.

Use e abuse de comentários


9.8.3 - Instruções de chamada e retorno condicionais

São baseadas nos Flags: Carry / Zero / Signal / Parity

CALL condicional:

CC Addr => Chama a sub-rotina se o Flag Carry é 1 (CY = 1)


CNC Addr => Chama a sub-rotina se o Carry é 0 (CY = 0)
CZ Addr => Chama a sub-rotina se o Flag Zero = 1 (Z = 1)
CNZ Addr => Chama a sub-rotina se Zero = 0 (Z=0)
CM Addr => Chama a sub-rotina se Sinal = 1 (S=1 – Número negativo)
CP Addr => Chama a sub-rotina se Sinal = 0 (S=0 = Número positivo)
CPE Addr => Chama a sub-rotina se Paridade = 1 (P=1 – paridade par)
CPO Addr => Chama a sub-rotina se Paridade = 0 (P=0 – paridade impar)
9.8.3 - Instruções de chamada e retorno condicionais

São baseadas nos Flags: Carry / Zero / Signal / Parity

RET condicional:

RC => Retorna se o Flag Carry é 1 (CY = 1)


RNC => Retorna se o Carry é 0 (CY = 0)
RZ => Retorna se o Flag Zero = 1 (Z = 1)
RNZ => Retorna se Zero = 0 (Z=0)
RM => Retorna se Sinal = 1 (S=1 – Número negativo)
RP => Retorna se Sinal = 0 (S=0 = Número positivo)
RPE => Retorna se Paridade = 1 (P=1 – paridade par)
RPO => Retorna se Paridade = 0 (P=0 – paridade impar)
9.8.4 - Chamada de uma Subrotina por outra Subrotina
9.8.5 - Múltiplos retornos em Sub-rotina
9.8.6 - Subrotinas do Módulo MC-1

Vous aimerez peut-être aussi