Instrucoes de Rotacao e deslocamento
As operações de rotação e deslocamento são
bastante importantes na realização de algoritmos de multiplicação e divisão,
e são frequentemente utilizadas em operações de contagem.
Genericamente, na figura 16 estão representadas as
acções de deslocamento e rotação de bytes para a esquerda. A operação de
deslocamento (shift)

fig.16
efectua-se de uma forma linear em que cada bit
se desloca uma posição para a esquerda (shift left). 0 bit LSB (least
significant bit) é preenchido com o valor 0 , enquanto o bit MSB se transfere
para a flag de carry. A operação de rotação (rotate) efectua-se de um modo
circular em que cada bit se desloca uma posição para a esquerda, o valor da
flag de carry transita para o bit de menor ordem (LSB) e o bit de maior ordem (MSB)
passa a ocupar a posição da flag de carry.
As instruções de rotação e deslocamento operam
sobre registos e posições de memória.
RLCA: Rotação Circular do Acumulador para a
Esquerda
(Rotate
Left Circular Accumulator)
A instrução RLCA opera unicamente sobre os bits do
acumulador. Todos os bits são deslocados uma posição para a esquerda,
passando o bit 7 (MSB) a ocupar a posição do bit 0 e da flag de carry conforme
está esquematizado na figura 17.

A instrução RLCA é formada por um único
byte e tem a seguinte configuração:

No registo de flags as flags H e N são
colocadas a 0 , a flag de carry tem o valor do bit MSB e as flags S, Z e P/V não
sofrem alteração.

RLA: Rotação do Acumulador para a Esquerda
(Rotate Left Accumulator)
Esta instrução opera exclusivamente sobre o conteúdo
do acumulador. Cada bit é deslocado uma posição para a esquerda, o valor da
flag de carry é transferido para o bit LSB enquanto o bit MSB vai ocupar a flag
C (fig. 18).

A instrução RLA tem a seguinte configuração:

0 registo de flags é alterado do mesmo modo
que na instrução anterior.
RRCA: Rotação Circular do Acumulador para a Direita
(Rotate
Right Circular Accumulator)
A instrução RRCA executa a operação inversa da
instrução RLCA. Os bits do acumulador são deslocados para a direita ocupando
o bit 0 a posição do bit 7 e da flag de transporte (C) conforme está
esquematizado na figura 19.

A instrução RRCA é constituída por um byte cuja
forma é:

0 registo de flags é afectado do mesmo modo
que na instrução RLCA.
RRA: Rotação do Acumulador para a Direita
(Rotate
Right Accumulator)
A instrução inversa da instrução RLA actua
exclusivamente sobre os bits do acumulador. Todos os bits são deslocados de uma
posição para a direita, o bit 0 (LSB) é armazenado no flip-flop carry e o
antigo valor desta flag passa a ocupar o bit 7 (MSB) do acumulador. A figura 20
ilustra o processo de rotação para a direita.

A instrução RRA tem o código:

O registo de flags, mais uma vez, é afectado de modo
idêntico ao da instrução RLCA.
Na tabela 24 encontram-se representados à direita os
códigos das instruções de rotação do acumulador.

Tabela 24-Rotações e deslocamentos
As instruções de rotação circular sobre bytes, no
microprocessador Z80, são estendidas aos restantes registos de uso geral, posições
de memória e registos de índice. Estas instruções actuam nos bytes a que
dizem respeito da mesma maneira que as instruções anteriores actuavam em relação
ao acumulador.
RLC r: Rotação Circular do Registo r para a
Esquerda
(Rotate Left Circular r)
Esta instrução está ilustrada na figura 17
em que o acumulador é substituído pelo registo r. 0 registo r pode ser
qualquer um dos registos de uso geral incluindo o acumulador: B, C, D, E, H, L e
A.
0 código da instrução RLC r é formado por dois
bytes:
0 registo de flags é afectado do seguinte modo:

As flags S, Z e C são colocadas de acordo com o resultado da operação
de rotação, a flag P/V dá-nos conta da paridade do byte uma vez que ela não
se altera com a rotação e, por último, as flags H e N armazenam sempre o
valor «0» (reset).
Se no código anterior os três bits RRR, indicadores
do registo actuado pela instrução RLC tiverem o valor 110, então, a operação
de rotação dá-se no byte de memória (RAM) endereçado pelo par HL.
RLC(IX/IY+ d): Rotação Circular de Uma Célula de
Memória (Indexada) para a Esquerda
Esta instrução executa a operação de rotação
circular para a esquerda de uma célula de memória endereçada pelo registo de
índice IX ou IY e em que é especificada uma base de endereço (d).
0 código de instrução é formado por quatro bytes,
especificando o terceiro byte a base de endereço d

0 registo de flags é afectado do mesmo modo que na
instrução anterior.
RRCs: Rotação Circular de Um de Registo ou de
Uma Célula de Memória para a Direita
Instrução idêntica à RLA mas de âmbito
mais geral, pois todos os registos e células de memória podem ser operados.
Os códigos desta instrução obtêm-se a partir dos
códigos da instrução RLC consoante o tipo de endereçamento, substituindo os
bits dentro do rectângulo tracejado 0 0 0 pelos bits 0 1 0. O operando s (RLs)
tanto pode estar contido num registo (A, B, C, D, E, H e L), como numa célula
da memória (RAM) endereçada pelo par HL ou pelos registo IX e IY (depois de
adicionada a base de endereço d). 0 registo de flags sofre as mesmas modificações
que no caso das instruções RLC r.
RRCs: Rotação Circular de Um de Registo ou de Uma Célula
de Memória para a Direita.
Instrução idêntica à RRCA mas de âmbito
alargado, uma vez que todos os registos de uso geral e células de memória (RAM)
podem ser operados.
Os códigos destas instruções obtêm-se dos códigos
das instruções RLC, consoante o modo de endereçamento, substituindo os bits 0
0 1 , dentro do rectângulo tracejado, pelos bits 0 0 1. No endereçamento
indexado em que se utilizam os registos de índice IX e IY é necessário
especificar no terceiro byte o valor d da base de endereço.
0 registo de flags sofre as mesmas alterações que
no caso das instruções RLC r.
RRs: Rotação para a Direita de Um Registo ou Célula
de Memória
A instrução RRs é semelhante à instrução
RRA: desloca todos os bits de um operando (de um byte) uma posição para
direita. 0 bit MSB é carregado com o valor da flag C enquanto esta toma o valor
do bit LSB.
Os códigos de operação desta instrução obtêm-se por substituição
nas instruções RLC dos bits 0 0 0 pelos bits 0 1 1.
0 registo de flags não sofre alteração em relação
às instruções RLC r.
SLAs:
Shift Left Arithmetic
A instrução SLA opera sobre os bits de qualquer
registo de uso geral, incluindo o acumulador, e sobre posições de memória (RAM)
endereçadas pelo par HL ou pelos registos de índice, IX e IY, depois de se
adicionar a base de endereço d.
A instrução SLA desloca (shift) uma posição para
a esquerda todos os bits do operando. 0 bit MSB transita para a flag de carry
enquanto o bit LSB é carregado com o valor 0. A figura 21 ilustra a operação
de deslocamento para a esquerda (shift left arithmetíc).

Os códigos de operação para os diversos
modos de endereçamento obtêm-se pela substituição dos bits dentro de rectângulo
tracejado 0 0 0 das
instruções RLC pelos bits 1 0 0. O registo
de flags apresenta a configuração:
SRAs:
Shift Right Arithmetic
Esta instrução executa o deslocamento para a
direita dos bits de um operando situado num dos registos de uso geral (B, C, D,
E, H, L e A), ou situado numa célula de memória endereçada pelo par HL ou
registos de índice (adicionando o endereço de base d).
0 bit MSB (bit nº 7) permanece imutável, passando o
bit LSB a ocupar a flag C. A figura 22 ilustra este processo.

Os códigos de operação, referentes aos diversos
modos de endereçamentos, obtêm-se substituindo os bits 0 0 0 das instruções
RLC pelos bits 1 0 1. O byte de flags é alterado da mesma forma que para a
instrução SLA.
SRLs:
Shift Right Logical
A instrução SRL desloca uma posição para a
direita os bits de um registo ou de uma célula de memória. 0 bit 7 (MSB) é
colocado a 0 ao mesmo tempo que o bit 0 (LSB) é armazenado na flag C. Esta
operação está representada na figura 23.

Os diferentes códigos de operação dizem respeito
aos diversos modos de endereçamento do operando. Obtêm-se a partir dos códigos
das instruções RLC substituindo os bits 0 0 0 pelos bits 1 1 1.
O registo de flags é modificado de igual modo ao da
instrução SLA.
RLD: Rotate Digit Left
A instrução RLD opera com dígitos, codificados em
BCD, armazenados no acumulador e numa posição de memória endereçada pelo par
HL. A rotação dá-se para a esquerda do seguinte modo:
- os quatro bits menos significativos da posição de
memória passam a ocupar os quatro bits mais significativos da mesma célula;
- os quatro bits mais significativos da célula de
memória (os primitivos) ocupam os quatro bits menos significativos do
acumulador;
- os quatro bits menos significativos do acumulador
passam a ocupar os quatro bits menos significativos da posição de memória
endereçada.
Os quatro bits mais significativos do acumulador não
são afectados. A figura 24 ilustra o procedimento descrito.

0 código da instrução RLD é formado por
dois bits com o seguinte formato:

0 registo de flags é modificado do mesmo modo que
nas instruções shift, com a diferença de que o bit da flag C não é
afectado.
RRD: Rotate Digit Right
A instrução RRD executa as mesmas operações da
instrução RLD mas para o lado direito. São desencadeadas as seguintes acções:
- os quatro bits mais significativos da posição de
memória endereçada pelo par HL passam a ocupar os quatro bits menos
significativos da mesma célula de memória;
- os quatro bits menos significativos (os primitivos)
da célula de memória ocupam os quatro bits menos significativos do acumulador;
- os quatro bits menos significativos ddo acumulador (os primitivos) são
transferidos para os quatro bits mais significativos da célula.
Como anteriormente os quatro bits mais significativos
do acumulador não são afectados. Na figura 25 encontra-se representada a operação
de rotação RRD.

0 código de operação difere apenas do da
instrução RLD no quarto bit do segundo byte:

As modificações do registo de flags são idênticas
às geradas pela instrução RLD.
Na tabela 24 encontra-se um resumo dos códigos
hexadecimais das instruções de rotação (rotate) e de deslocamento (shift).
Um deslocamento para a direita (right shift) é
equivalente a uma divisão por dois. Um deslocamento para a esquerda (left shift)
é equivalente a uma multiplicação por dois e pode ser entendido como uma adição
do conteúdo do registo consigo próprio.
Exemplificando, multiplique-se o número 9(10) por
2(10):

o deslocamento de uma posição para a esquerda dos
bits, com a introdução de um 0 no bit menos significativo, é equivalente a
uma multiplicação por 2(10).
Se dividirmos 10(10) por 2(10) obtemos o resultado:
Multiplicações e divisões podem ser efectuadas a
partir das operações simples de adição e deslocamento, daí a grande importância
destas instruções.
As instruções de rotação de grupo de quatro bits,
além de serem utilizadas nas operações aritméticas em BCD, permitem
facilmente a compactação de dígitos escritos em ASCII transformando-os em BCD.
Por exemplo, os números 4 e 9 têm a seguinte representação em ASCII:
4
= 011 0100
9 = 011 1001
então, num byte podem-se compactar dois dígitos
ASCII passando-os para BCD: