Instrucoes de Armazenamento e permuta
Load
Um
grupo de instruções básicas do microprocessador Z80 60 carregamento (LOAD)
de um registo ou de uma célula de memória, a partir de outro registo ou de uma
posição de memória.
Todas
as instruções deste grupo são identificadas pela mnemónica LD,
especificando-se em seguida 0 destino e a fonte do armazenamento. Convém
salientar que 0 destino da informação se encontra sempre a seguir S mnemónica
LD: LD destino fonte. Na mnemónica
a seta é substituída por uma virgula e a fonte e 0 destino são formatados
conforme 0 endereçamento.
A
notação que se utiliza para especificar as instruções é a hexadecimal,
convertendo 0 micro-computador este valor para binário.
Por
exemplo, a instrução de carregamento do registo C a partir do registo B usa 0
código de operação 48H1. Este valor será descodificado pelo micro-computador
para 0100 1000 em binário.
Como
já foi referido a instrução de LOAD pode utilizar diversos tipos de endereçamento.
Por exemplo, a fonte pode ser endereçada por registo e 0 destino por endereçamento
indirecto. Especificando, a instrução
LD
(HL), D
carrega
a posição de memória endereçada pelo par HL com 0 conteúdo do registo 0.0
parêntesis em redor de HL significa que 0 conteúdo deste par de registos é
utilizado como um ponteiro para a memória. 0 byte mais significativo (high
byte) do endereço esta armazenado no registo H, enquanto 0 byte menos
significativo (Low byte) do endereço esta’ armazenado no registo L.
Como
exemplo de endereçamento indexado vejamos 0 caso da instrução cuja mnemónica
é:
LD
E, (IX, 8)
Esta
instrução faz com que 0 registo E seja carregado com 0 valor armazenado na
posição de memória, endereçada pelo conteúdo do registo de índice IX,
adicionado com 0 valor 8 (fig. 12). 0 código de operação é formado por dois
bytes e 0 operando por um byte.

As
instruções de carregamento, utilizando endereçamento directo, 550 também
instruções de três bytes, em que 0 código de operação é representado pelo
primeiro byte e o endereço pelos dois seguintes. Por
exemplo, a instrução de carregamento do acumulador com 0 conteúdo da
posição de memória 6F32H terá a mnemónica:
LD
A, (6F32H)
e
a sequência dos bytes na memória 6:

Note-se
que 0 byte de menor ordem do endereço é sempre 0 primeiro operando.
A
instrução de carregamento (LOAD) imediato dos registos CPR de oito bits ocupa
dois bytes. A instrução de carregamento do registo H com 0 valor 36 H será
escrita:
LD
H, 36 H
e
a sequência de bytes na memória será:

A
instrução de carregamento de uma céIula de memória utilizando endereçamento
indexado para 0 destino (céIuIa de memória) e endereço imediato para a
fonte, requer quatro bytes. Por exemplo, utilizando 0 registo de índice IX:
LD
(IX - 15), 21 H (15 na base 10)
apareceria
na memória de programa a seguinte sequência:

Note-se
que com qualquer endereçamento indexado a base de endereço (neste caso F1)
sucede imediatamente 0 código de operação.
Apresentaram-se
exemplos da instrução LD (LOAD) para diferentes modos de endereçamento. De
uma forma sistemática apresentam-se em seguida as mnemónicas e códigos de
operação das diversas instruções LD.

LD
r,s carregar 0 registo r com 0 conteúdo do registo S; é uma instrução de um
byte. Os registos fonte (source) e destino fazem parte do código de operação.
A tabela 1 resume Os códigos para as varias transferências entre registos.

Tabela
1
LOAD
REGISTO GPR COM DADOS (n):

LD
r, n carregar 0 registo r com o valor n é uma instrução de dois bytes. 0
registo destino esta contido nos bits 3, 4 e 5 do código de operação e 0
valor a transferir para 0 registo é indicado no segundo byte. A tabela 2 indica
os códigos para os sete destinos possíveis.

Tabela
2
LOAD
ENTRE REGISTOS DE USO GERAL E A MEMÓRIA. (HL)
r ; r (HL):

O
conteúdo da céIuIa de memória cujo endereço se encontra no par HL é
armazenado no registo r.

O
conteúdo do registo r é armazenado na célula de memória endereçada pelo par
de registos HL.
Estas
duas instruções permitem aos registos GPR trocar informações com a memória
exterior. São instruções de um byte.

Tabela
3
LOAD
ENTRE 0 ACUMULADOR F A MEMORIA
O
acumulador (A) tem possibilidade de comunicar com a memória exterior através
de endereçamento indirecto, utilizando o conteúdo dos pares de registos de uso
geral como endereço, ou através de endereçamento directo, isto é, o endereço
da posição de memória encontra-se nos dois bytes seguintes do código de
operação:

Com
esta instrução consegue-se que o acumulador seja carregado com o conteúdo da
posição de memória endereçada pelo par BC ou DE
Se
o endereçamento for directo, obtém-se o seguinte código de operação:

significando
que o Conteúdo da posição de memória endereçada por (nn) deve ser colocado
no acumulador.
Estas
instruções dizem respeito ao carregamento do acumulador com o conteúdo de uma
posição de memória. A operarão reciproca também é possível e apresenta os
códigos descritos nos parágrafos seguintes.

Esta
instrução armazena na posição de par BC ou DE o conteúdo do acumulador.
Se
o endereçamento for directo, então a instrução ela própria contém o endereço
da memória:

O
conteúdo do acumulador é armazenado na célula (nn). A tabela 4 sintetiza e
apresenta a notação hexadecimal deste grupo de instruções.

Tabela
4
LOAD
DE UM BYTE DE DADOS NA MEMÓRIA: (HL) n.

O
segundo byte da instrução é armazenado na posição de memória endereçada
pelo conteúdo do par de registos HL.
O
código hexadecimal desta instrução é o seguinte:

LOAD
INDEXADO ENTRE REGISTOS E Memória
Este
grupo de instruções utiliza Os registos de índice IX e IY para o endereçamento
indexado das posições de memória.

Esta
instrução carrega 0 registo r com 0 conteúdo da posição de memória cujo
endereço 60 conteúdo do registo IX acrescentado com C valor d: ADDRESS = (IX +
d). E’ uma instrução de três bytes, sendo sempre 0 Último byte 0 portador
do valor d.

Esta
instrução é idêntica a anterior, tendo apenas a diferença de 0 registo de
índice utilizado ser 0 IY. Note-se que s6 0 bit 5 do primeiro byte sofreu
modificação. 0 valor DDD continua a ter 0 mesmo significado da instrução
anterior.

A
instrução LD(IX + d),r permite carregar a posição de memória endereçada
por (IX + d) com 0 valor do registo r 0 registo r é especificado pelos bits
0, 1 e 2 do segundo byte do código de operação (555). Os valores que 555 pode
tomar são idênticos aos de DDD.

Esta
instrução idêntica à anterior, trocando-se a utilização do registo de índice
IX pelo registo lY Mais uma vez, Os valores pare SSS são idênticos aos de DDD,
em que SSS representa o registo cujo conteúdo vai ser armazenado na posição
de memória (IY + d).
LOAD
INDEXADO DE DADOS NA MEMÓRIA
Deste
grupo fazem parte duas instruções utilizando os registos IX e lY São instruções
de quatro bytes, em que o quarto byte contém a palavra de dados a armazenar na
célula de memória endereçada por (IX + d) ou (IY + d).

Na
tabela 5 encontram-se Os códigos hexadecimais das instruções que utilizam Os
registos de índice: LOAD indexado entre registos e memória e LOAD indexado de
dados na memória.

Tabela
5

Nenhuma
das instruções de LOAD referidas afectam as flags. Para terminar a apresentação
das instruções de LOAD que movimentam dados com 0 comprimento de oito bits
falta referir quatro instruções que realizam a troca de dados entre 0
acumulador (A) e Os registos I e R. Estas instruções são de dois bytes e têm
0 formato especificado na tabela 6.

Tabela
6
As
instruções LD A, I e LD A, R afectam 0 byte de flags do seguinte modo:

↕ ->Flag
afectada do acordo com 0 resultado da operação
0
->Flag
reset
·
->
Flag não afectada
1FF
->Conteúdo
do flip-flop do permissão do interrupção
X
->Bit
não utilizado polo registo do flags
O
microprocessador Z80 também permite a transferência de dados com 0 comprimento
de 16 bits entre Os registos e a memória. Este conjunto de instruções
manipula Os pares de registos GPR (8 bits cada registo), Os registos de índice
(16 bits cada registo), 0 ponteiro da pilha e dois bytes de dados na própria
instrução (endereçamento imediato). A mnemónica das instruções de LOAD com
16 bits e idêntica & anterior com 8 bits (LD). A diferença reside no facto
de a memória fonte e destino indicadas possuírem 16 bits. 0 código de
operarão é alterado de modo a haver uma correcta identificação.
Load
Imediato, ou Par de registos, de 16 Bits:

Esta
instrução carrega um par de registos com o segundo e terceiro bytes. o segundo
byte (nL representa o byte de menor ordem (low byte), enquanto o terceiro byte (nH)
representa o de maior ordem (high byte).
O
primeiro registo, do par de registos, é carregado sempre com o byte de maior
ordem. Por exemplo, com respeito ao par BC o byte de maior ordem será
armazenado em B: BCH = B. Se tomarmos como exemplo o par HL, o byte de menor
ordem é armazenado no registo L: HLL = L.
Para
o carregamento imediato dos registos de índice o Z80 utiliza uma instrução de
quatro bytes:

Sendo
Os registos de índice registos de 16 bits, Q byte nL é armazenado no byte de
menor ordem do registo, enquanto 0 byte nH é armazenado no byte de major
ordem.
Na
tabela 7 encontram-se representados Os códigos hexadecimais destas instruções.

TABELA
7
LOAD
DE REGISTOS, 0U PAR DE REGISTOS, COM 2 BYTES DA MEMÓRIA
A
partir do endereço de uma posição de memória, a CPU carrega um registo de 16
bits, ou dois de B bits, com 0 conteúdo da céIuIa endereçada e da célula
imediatamente a seguir. A célula cujo endereço é 0 operando da instrução é
armazenada no byte de menor ordem, enquanto a célula seguinte é armazenada
no byte de maior ordem do registo ou par de registos. Este conjunto de instruções
engloba três tipos:
Ø
Carregamento do par HL; instrução de três bytes:

Ø
Carregamento de um par de registos dd; instrução
de quatro bytes:

ddH:
registo que contém o byte de major ordem. ddL: registo que contém o byte de
menor ordem.
Ø
Carregamento dos registos de índice; instrução
de quatro bytes:

dH:
byte mais significativo de um registo de 16 bits. dL: byte menos significativo
de um registo de 16 bits.
Na
tabela 8 encontram-se representados Os códigos hexadecimais deste grupo de
instruções:

Tabela
8
LOAD
DE DUAS CÉLULAS DE MEMÓRIA COM 0 CONTEÚDO DE UM REGISTO OU PAR DE REGISTOS
Este
conjunto de instruções é 0 reciproco do conjunto anterior. A posição de memória
endereçada contém 0 byte menos significativo, enquanto que a posição
seguinte contém 0 byte mais significativo. Este conjunto de instruções também
engloba três tipos:
Ø
Carregamento da memória a partir do par HL;
instrução de três bytes:

Ø
Carregamento da memória a partir do par de
registos dd; instrução de quatro bytes;

Ø
Carregamento da memória a partir dos registos de
índice; instrução de quatro bytes:

nH
e nL representam os dois bytes do endereço da posição de memória. Repare-se
que esta célula vai armazenar o conteúdo do byte de menor ordem de um dos
registos de índice. A célula imediatamente a seguir nH (nL+1) irá armazenar o
byte mais significativo do registo.
Na
tabela 9 encontram-se representados os códigos hexadecimais deste grupo de
instruções.

Tabela
9
Para
terminar o estudo das instruções de LOAD (LD) falta, apenas,
referir
três instruções entre registos de 16 bits. Estas instruções promovem o
carregamento do ponteiro da pilha, SP, com o conteúdo do par
HL
e com o conteúdo dos registos de índice IX e IY:

As
instruções LD que movem 16 bits do dados não afectam o registo das flags.
O
estudo das instruções de carregamento dos registos do microprocessador fica
completo com as instruções EX e EXX (EXCHANGE).
EXCHANGES
(permuta do dados entre registos)
As
instruções de EXCHANGE (permuta) permitem a troca de dados armazenados em
pares de registos, em posições de memória endereçadas pelo ponteiro da pilha
(SP) e nos registos de índice.

Esta
instrução coloca o conteúdo do par HL no tempo que o conteúdo do par DE é
armazenado assim, uma troca de dados entre os dois pares de registos.

Neste
caso, 60 acumulador A e 0 registo de flags F que permutam Os dados com Os
registos A’ e F’
Os
pares de registos BC, DE e HL trocam de conteúdo com Os pares do registos
BC’, DE’ e HL’ através da instrução:

Segue-se
um grupo de três instruções que permitem a troca de dados entre 0 par HL,
Os registos IX e IY e duas posições de memória, sendo a primeira endereçada
pelo registo SP e a segunda a posição imediatamente a seguir:

As
instruções de EXCHANGE não alteram o conteúdo do registo de flags.
Na
tabela 10 representam-se os códigos hexadecimais deste grupo de instruções.