
                               ASSEMBLY
                             Manipulao de Memria
                                Aula nr. 18 de 26

    Hummmm...  Estamos na era dos  32 bits...  ento por que esperar
mais para discutirmos as novidades da linha 386  e  486?   Eles  no
diferem  muito do irmo menor: o 8086.  A no ser pelo fato de serem
"maiores". :)

    O 8086 e 80286 tm barramento de dados de  16  bits  de  tamanho
enquanto o 386 e o 486 tem  de 32 bits.  Nada mais justo que existam
modificaes nos registradores tambm:

           31              16 15                  0
           Ŀ
                               AH   AX   AL      EAX
           Ĵ
                               BH   BX   BL      EBX
           Ĵ
                               CH   CX   CL      ECX
           Ĵ
                               DH   DX   DL      EDX
           

    Os registradores de uso geral continuam os velhos conhecidos  de
sempre...  S que existem os registradores  de uso geral de 32 bits:
EAX, EBX, ECX e EDX, onde os 16 bits menos significativos destes so
AX, BX, CX e DX, respectivamente.

           31              16 15                  0
           Ŀ
                                    SI           ESI
           Ĵ
                                    DI           EDI
           Ĵ
                                    BP           EBP
           Ĵ
                                    SP           ESP
           

    Da mesma forma, os registradores SI, DI, BP  e  SP  ainda  esto
aqui...  bem como os seus equivalentes de 32 bits: ESI, EDI,  EBP  e
ESP.

    Os registradores  de  segmento  (chamados  de  SELETORES desde o
surgimento do 80286)  so  os  mesmos  e  no  mudaram  de  tamanho,
continuam com 16 bits: CS, DS, ES e SS.  Mas acrecentaram outros: FS
e  GS.  Isto ...  Agora existe um registrador de segmento de cdigo
(CS), um segmento de pilha (SS) e quatro segmentos de dados (DS, ES,
FS e GS).  Lembrando que DS    o segmento de dados default.  Repare
na ordem alfabtica dos registradores de segmento de dados...

    O registrador Instruction Pointer  tambm  continua  o  mesmo...
E tambm existe o seu irmo maior... EIP:

           31              16 15                  0
           Ŀ
                                    IP           EIP
           

    Da mesma forma os FLAGS tambm so os mesmos de sempre...  mas o
registrador FLAGS tambm foi expandido para 32  bits  e  chamado  de
EFLAGS.   Os sinalizadores extras so usados em aplicaes especiais
(como por exemplo,  chaveamento  para  modo protegido, modo virtual,
chaveamento de tarefas, etc...).

    Alguns outros registradores foram  adicionados ao conjunto: CR0,
CR1, CR3, TR4 a TR7.  DR0 a DR3, DR6 e DR7  (todos  de  32  bits  de
tamanho).  Esses novos registradores  so  usados no controle da CPU
(CR?), em testes (TR?) e DEBUG (DR?).  No tenho maiores informaes
sobre alguns deles e por isso no vou descrev-los aqui.

     Novas instrues foram criadas para o 386 e ainda  outras  mais
novas  para  o  486  (imagino  que  devam  existir outras instrues
especficas para o Pentium!). Eis algumas delas:

 BSF (Bit Scan Forward)

    Processador: 386 ou superior

    Sintaxe: BSF dest,src

    Descrio:

        Procura pelo  primeiro  bit  setado  no  operando "src".  Se
encontrar, coloca o numero do bit no operando "dest" e seta  o  flag
Zero.   Se  no  encontrar,  no altera o operando "dest" e reseta o
flag Zero.   BSF  procura  o  bit  setado  comeando  pelo  bit 0 do
operando "src".

    Exemplo:

        BSF     AX,BX

 BSR (Bit Scan Reverse)

    Processador: 386 ou superior

    Sintaxe: BSR dest,src

    Descrio:

        Faz a mesma coisa que BSF, porm a ordem de procura comea a
partir do bit mais significativo do operando "src".

    Exemplo:

        BSR     AX,BX

 BSWAP

    Processador: 486 ou superior

    Sintaxe: BSWAP reg32

    Descrio:

        Inverte a ordem das words de um registrador de 32 bits.

    Exemplo:

        BSWAP EAX

 BT (Bit Test)

    Processador: 386 ou superior

    Sintaxe: BT dest,src

    Descrio:

        Copia  o  contedo  do  bit do operando "dest" indicado pelo
operando "src" para o flag Carry.

    Exemplo:

        BT  AX,3

    Observaes:

      1- Aparentemente esta  instruo  no  aceita  operandos de 32
         bits.
      2- No exemplo acima o bit 3 de AX ser  copiado  para  o  flag
         Carry.

 BTC (Bit Test And Complement)

    Processador: 386 ou superior

    Sintaxe:  BTC dest,src

    Descrio:

        Instruo  identica   BT, porm complementa (inverte) o bit
do operando "dest".

 BTR e BTS

    Processador: 386 ou superior

    Sintaxe: BTR dest,src
             BTS dest,src

    Descrio:

        Instrues identicas a BT, porm  BTR zera o bit do operando
destino e BTS seta o bit do operando destino.

 CDQ (Convert DoubleWord to QuadWord)

    Processador: 386 ou superior

    Sintaxe: CDQ

    Descrio:

        Expande o contedo do registrador EAX para o par EDX e  EAX,
preenchendo com o bit 31 de EAX os bits de EDX (extenso de sinal).

 CWDE (Convert Word to DoubleWord Extended)

    Processador: 386 ou superior

    Sintaxe: CWDE

    Descrio:

        Esta  instruo  expande  o   registrador   AX   para   EAX,
considerando  o sinal.  Ela  equivalente a instruo CWD, porm no
usa o par DX:AX para isso.

 CMPXCHG

    Processador: 486 ou superior

    Sintaxe: CMPXCHG dest,src

    Descrio:

        Compara  o  acumulador  (AL,  AX  ou  EAX  -  dependendo dos
operandos) com o operando  "dest".   Se  forem iguais o acumulador 
carregado com o contedo de "dest", caso contrrio com o contedo de
"src".

    Exemplo:

        CMPXCHG BX,CX

 INVD (Invalidate Cache)

    Processador: 486 ou superior

    Sintaxe: INVD

    Descrio:

        Limpa o cache interno do processador.

 JECXZ

    Processador: 386 ou superior

    Observao:  identica a instruo  JCXZ,  porm o teste  feito
no registrador extendido ECX (32 bits).

 LGS e LFS

    Processador: 386 ou superior

    Observao: Essas instrues so identicas as instrues  LDS  e
LES, porm trabalham com os novos registradores de segmento.

 MOVSX e MOVZX

    Processador: 386 ou superior

    Sintaxe: MOVSX dest,src
             MOVZX dest,src

    Descrio:

        Instrues  teis  quando  queremos  lidar  com operandos de
tamanhos diferentes.  MOVZX move  o  contedo do operando "src" para
"dest" (sendo que "src" deve ser menor que "dest") zerando  os  bits
extras.   MOVSX  faz  a  mesma coisa, porm copiando o ltimo bit de
"src" nos bits extras de "dest" (converso com sinal).

    Exemplo:

        * Usando  instrues  do  8086,  para  copiar  AL  para  BX
          precisariamos fazer isto:

                MOV     BL,AL
                MOV     BH,0

        * Usando MOVZX podemos simplesmente fazer:

                MOVZX   BX,AL

 Instruo condicional SET

    Processador: 386 ou superior

    Sintaxe: SET? dest
             (Onde ?  a condio...)

    Descrio:

        Poe 1 no operando destino  se  a  condio  for  satisfeita.
        Caso contrrio poe 0.

    Exemplo:

        SETNZ AX
        SETS  EBX
        SETZ  CL

 SHRD e SHLD (Double Precision Shift)

    Processador: 386 ou superior

    Sintaxe: SHRD dest,src,count
             SHLD dest,src,count

    Descrio:

        Faz  o  shift  para  esquerda  (SHLD)  ou  direita (SHRD) do
operando "dest" "count" vezes, porm  os bits que seriam preenchidos
com zeros so preenchidos com o contudo dos bits do operando "src".
Eis um grfico exemplificando:

    SHRD
          src                 dest
    Ŀ    Ŀ
                  >Ĵ             > Carry
        
     n            0      n            0

    O operando "src" no  alterado no processo.  O  flag  de  Carry
contm o ltimo bit que "saiu" do operando "dest".

    Exemplo:

        SHLD    EAX,ECX,3
        SHRD    AX,BX,CL

 Instrues que manipulam blocos...

    CMPSD,  LODSD,  MOVSD, STOSD, INSD e OUTSD se comportam da mesma
forma que suas similares  de  8  ou  16  bits (CMPSB, CMPSW, etc..),
porm usam os registradores extendidos (ESI, EDI, ECX, EAX) e operam
com dados de 32 bits de tamanho (DoubleWords).

    Existem mais instrues...  Consulte algum manual da Intel ou  o
hipertexto  HELPPC21...  Pedirei aos Sysops do VixNET BBS (agora com
6 linhas hehehe) para  deixarem disponivel o arquivo 386INTEL.ZIP...
que  o guia tcnico para o processador 386.
--------------------------------------------------------------------

Dvidas a respeito dos novos recursos:

Q Os  segmentos  tem  mais  que  64k  no  modo  real,  j  que  os
registradores  extendidos  podem  ser  usados  neste   modo?    Como
funcionaria uma instruo do tipo:

    MOV     [ESI+3],EAX

R  No...   no  modo  real  os  segmentos  continuam  a ter 64k de
tamanho.  Os registradores extendidos podem  ser usados a vontade e,
quando  usados como offset em um segmento, os 16 bits superiores so
ignorados. A instruo apresentada funcionaria da mesma forma que:

    MOV     [SI+3],EAX

Q Onde e quando deve-se usar os novos registradores de segmentos?
R Onde e quando  voc  quiser.   Pense  neles  como se fosse novos
segmentos de dados extras.   Na  realidade  voc  apenas  conseguir
us-los  se  explicit-los  numa  instruo  que  faz  referncia  
memria, por exemplo:

    MOV FS:[BX],AL

Q Posso usar os registradores extendidos nas instrues normais ou
apenas nas novas instrues?
R  Pode  us-los  nas  instrues  "normais".   A  no  ser  que a
instruo no permita operandos de 32 bits...
             
