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:

<-- Voltar

Hosted by www.Geocities.ws

1