             i----------------------------------------------
              RBT      Curso de Assembly      Aula N 10 
             ----------------------------------------------

Por: Frederico Pissarra


i------------
 ASSEMBLY X 
------------

    Mais  instrues  lgicas...   Falta-nos  ver  as  intrues  de
deslocamento de bits: SHL, SHR, SAL, SAR, ROL, ROR, RCL e RCR.

    A ltima letra  nas  instrues  acima  especifica  o sentido de
rotao (R = Right -> direita, L = Left -> esquerda).

    Para exemplificar a mecnica do funcionamento dessas  instrues
recorrerei a graficos (fica mais fcil assim).

    -----------
     SHL e SHR 
    -----------

        SHL:
      +-----+     +------------------+
      Carry<----                  <----- 0
      +-----+     +------------------+
                 msb                lsb


        SHR:
                  +------------------+      +-----+
           0 ---->                  ----->Carry
                  +------------------+      +-----+
                 msb                lsb

    SHR e SHL fazem o deslocamento dos bits em direo ao flag Carry
e  acrescentam  0  no  lugar  do ltimo bit que foi deslocado.  Essa
operao tem o mesmo efeito  de  multiplicar  por 2 (SHL) ou dividir
por 2 (SHR) um valor.  Com a vantagem  de  no  gastar  tanto  tempo
quanto as instrues DIV e MUL.

    SHR  a abreviao de  SHift  Right,  enquando  SHL  a de SHift
Left.


    -----------
     SAL e SAR 
    -----------

    SAL funciona da mesma maneira que SHL.

        SAR: +-----+
                 +------------------+      +-----+
             +--->                  ----->Carry
                  +------------------+      +-----+
                 msb                lsb

    SAR  desloca todos os bits para a direita (o lsb vai para o flag
carry) e repete o contedo do antigo ltimo bit (que foi deslocado).

    SAR    a  abreviao  de  SHift  Arithmetic  Right.   Sendo  um
deslocamento aritimtico, no  poderia  de  desconsiderar o sinal do
dado deslocado (dai o motivo de repetir o bit mais significativo!).


    -----------
     RCL e RCR 
    -----------

        RCL:
           +----------------------------------------+
                                                   
               +-----+     +------------------+    
           +----Carry<----                  <---+
                +-----+     +------------------+
                           msb                lsb


        RCR:
            +--------------------------------------+
                                                  
               +------------------+      +-----+  
            +-->                  ----->Carry+--+
                +------------------+      +-----+
               msb                lsb

    RCR  e  RCL  rotacionam  o  dado  "passando  pelo  carry".  Isto
significa que o bit  menos  significativo  (no  caso  de  ROR)  ser
colocado  no  flag  de carry e que o contedo antigo deste flag ser
colocado no bit mais significativo do dado.


    -----------
     ROL e ROR 
    -----------

        ROL:
                          +-------------------------+
                                                   
                +-----+    +------------------+    
                Carry<----                  <---+
                +-----+     +------------------+
                           msb                lsb


        ROR:
            +-------------------------+
                                     
               +------------------+     +-----+
            +-->                  ----->Carry
                +------------------+      +-----+
               msb                lsb

    Aqui a rotaao e' feita  da  maneira correta...  o flag de carry
apenas indica o ultimo bit que "saiu" e foi para o outro lado...

    A sintaxe dessas instrues  a seguinte:

 +-----------------------------------------------------------------+
   SHL AX,1                                                       
   SHR BL,1                                                       
   RCL DX,CL                                                      
   ROL ES:[DI],CL                                                 
 +-----------------------------------------------------------------+

    Note que o segundo operando   um contador do nmero de rotaes
ou shifts sero efetuadas.  Nos microprocessadores 80286  em  diante
pode-se usar um valor diferente de 1, no 8088/8086 no pode!

    Repare  tambm  que  podemos  usar  APENAS o registrador CL como
operando da direita se quisermos usar algum registrador!
