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

Por: Frederico Pissarra



i-------------
 ASSEMBLY XI 
-------------

    Mais instrues de comparao...

  CMPSB e CMPSW

    Essas instrues comparam (da mesma forma que CMP) o contedo da
memria apontada  por  DS:SI  com  o  contedo  apontado  por ES:DI,
afetando os flags.  Com isso, soluciona-se a limitao da  instruo
CMP com relao aos dois operandos como referncias  memria!

    Lembre-se que DS:SI  o operando implicito FONTE, enquanto ES:DI
  o  destino.   A comparao  feita de ES:DI para DS:SI.  A rotina
abaixo  equivalente  a  CMPSB:

 +-----------------------------------------------------------------+
   MOV AL,ES:[DI]                                                 
   CMP AL,[SI]                                                    
   INC SI                                                         
   INC DI                                                         
 +-----------------------------------------------------------------+

    Existe um pequenino erro de lgica na rotina  acima,  mas  serve
aos nossos propsitos de ilustrar o que ocorre em CMPSB.

    SI  e  DI sero incrementados (ou decrementados, depende do flag
de direo)  depois  da  operao,  e  o  incremento (ou decremento)
depender da instruo...  Lembre-se que CMPSB compara Bytes e CMPSW
compara Words.


  SCASB e SCASW

    Essas  instrues servem para comparar (da mesma forma que CMP o
faz) o contedo da memria  apontado  por DS:SI com o registrador AL
(no caso de SCASB) ou AX (no caso de SCASW).  Os flags so  afetados
e SI  incrementado (ou decrementado)  de  acordo  com  a  instruo
usada.


+------------------------------------------------------------------+
Comparando blocos de memria:                                     
+------------------------------------------------------------------+

    Podemos usar CMPS?  e SCAS?  (onde ?  e' B ou W) em conjunto com
REP  para  compararmos blocos (CMPS?) ou procurar por um determinado
dado num bloco (SCAS?).  A diferena aqui  que podemos fornecer uma
condio de comparao ou busca.

    Acrescentando o modigicador REP,  precisamos  dizer  uma dessas
instrues a quantidades de dados que queremos manipular...  fazemos
isso atravs do registrador CX (assim  como  fizemos  com  LODS?   e
STOS?):

 +----------------------------------------------------------------+
   ;Certifica-se do sentido crescente!                           
   CLD                                                           
                                                                 
   ;Obtm o segmento da linha de comando e coloca em DS          
   MOV   AX,SEG LINHA_DE_COMANDO                                 
   MOV   DS,AX                                                   
                                                                 
   ;Obtm o offset inicial da linha de comando                   
   MOV   SI,OFFSET LINHA_DE_COMANDO                              
                                                                 
   ;Procura, no mximo por 128 bytes                             
   MOV   CX,128                                                  
                                                                 
   ;Procuraremos por um espao.                                  
   MOV   AL,' '                                                  
                                                                 
   REPNE SCASB                                                   
 +----------------------------------------------------------------+

    Esse  fragmento  de cdigo ilustra o uso de SCASB com blocos.  O
modificador  REPNE  significa  (REPete  while  Not  Equal  -  Repete
enquanto no for igual).  REPNE garante que o byte vai ser procurado
por  toda  a  linha  de  comando  at  que  o  primeiro  espao seja
encontrado.  Se no houver espaos na linha, ento,  depois  de  128
bytes  de  procura,  o  registrador  CX  estar  zerado  (j  que  
decrementado a cada byte comparado).

    Esta   outra caracterstica das instrues que manipulam blocos
(as que  so  precedidas  de  REP,  REPNE  ou  REPE):  O  contador 
decrementado a cada operao da instruo associada (no  nosso  caso
SCASB), bem como os demais operandos implicitos (SI no caso acima) 
incrementado a cada passo.

    Se  quisermos  encontrar  o primeiro byte DIFERENTE de espao na
rotina acima,  basta  trocar  REPNE  por  REPE  (Repete enquanto for
IGUAL).

    REPE e REPNE no foram mencionados antes  porque  no  funcionam
com LODS? e STOS?.



