Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 029 di 198] 

    

    CMPSW - Confronta le Words di 2 aree di memoria modificando le flags
     
bulletQuesta istruzione analizza le words contenute in 2 locazioni di memoria e modifica le flag in funzione del risultato.
bulletIn pratica simula la sottrazione dei 16 bit della locazione sorgente da quelli della locazione destinazione senza però alterare la  word della destinazione (come farebbe invece l'effettiva sottrazione, SUB); questo basta per modificare le flag coinvolte dal risultato e a favorire gli eventuali salti condizionati (Jxx) conseguenti.
bulletSi tratta di una istruzione piuttosto efficiente, nata per confrontare il contenuto di 2 aree di memoria; per default utilizza le coppie di registri DS:SI per puntare in minuendo (destinazione) e ES:DI per puntare il sottraendo (sorgente).
bulletIn questo è evidente una incongruenza con le convenzioni Intel, per cui il registro indice Sorgente per eccellenza è SI (Source Index) e quello Destinazione è DI (Destination Index): prendiamo atto senza farci intimorire....
bulletL'istruzione è particolarmente utile per confrontare 2 tabelle; per trovare una determinata word in una tabella è disponibile la SCASW che si basa sul medesimo principio di funzionamento.
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
  CMPSW  Cambia le Flag    simulando  { DS:[SI]  -  ES:[DI] }
 

Esempio di Applicazione

Cicli di Clock Mem
Acces

Bytes
Flag   influenzate
Mnemonico Operandi 86 268 386 486 O D I T S Z A P C

CMPSW

 

22 8 10 8 2 1 #       # # # # #
         
bulletLa tabella evidenzia l'assenza di operandi: in realtà, essendo un'applicazione particolare della CMPS, pur non dichiarandoli esplicitamente l'istruzione coinvolge i dati a 16 bit presenti nelle locazioni messe a confronto; in dettaglio:
bulletIl dato prelevato dalle 2 locazioni di memoria ha la dimensione di una word.
bulletil segmento dell'area Sorgente (usata per puntare il sottraendo) è sempre ES. e quello dell'area Destinazione (usata per puntare il minuendo) è sempre DS.
bulletdopo aver modificato le flag in funzione del confronto aggiorna il valore dei registri di offset (SI,DI), in funzione del valore della flag di direzione DF (che va quindi predisposta con certezza prima di iniziare il confronto):
bulletse DF=0 (direzione in avanti) ad entrambi i puntatori viene sommato 2.
bulletse DF=1 (direzione indietro) ad entrambi i puntatori viene sottratto 2.
bullet la presenza di operandi non è necessaria: la lettera W posta dopo lo mnemonico CMPS fa capire all'assemblatore che i dati da trattare sono a 16 bit.
bulletin tutti i casi non va dimenticato che queste istruzioni usano per default i puntatori DS:SI e ES:DI, per cui è assolutamente necessario inizializzarli (insieme alla flag DF) prima di utilizzarle.
bulletQuesta potente istruzione esegue con un solo codice operativo il compito di ben 4 istruzioni (anche se a rigor di logica dovremmo mettere in conto anche il salvataggio e il recupero delle flag, dato che ADD influisce su di loro), cioè equivale all'esecuzione del seguente codice:
         
MOV   AX,DS:[SI]
CMP   AX,ES:[DI]
PUSHF
ADD   SI,2
ADD   DI,2
POPF
     
bulletLa figura seguente mostra le caratteristiche di questa istruzione:
          

Addr

Codifica Masm

Istruzione

0100
0164
0032 [.. 00..]
0032 [.. 00..]
Depo01 DW  50 DUP (00H)
Depo02 DW  50 DUP (00H)
---- ---------------- ------- ----------------------
01C8 A7 CMPSW 
         
bulletPrima di concludere è opportuno sottolineare che questa istruzione può fruire dell'operatore di autoripetizione REPE o REPNE: anteponendolo al suo mnemonico il processo di confronto viene ripetuto automaticamente CX volte su tutta l'area sotto test, a meno che non venga trovata una coppia di valori uguali (E) o diversi (NE); per il corretto uso dei questo prefisso è dunque necessario caricare preventivamente CX con il numero di confronti da eseguire.
bulletData l'utilità di questa tecnica viene proposto un esercizio d'esempio:
          

Addr

Codifica Masm

Istruzione

0100
0164

-----
01C8
01C9
01CC
01D0
01D4
01D6


01DA
01DB

01DD
01E0


01E3
0032  [ ?? ]
0032  [ ?? ]
-----------
FC
B9 0032
8D 36 0100  
8D 3E 0164
F3 A7
0F 85 1DD


90
EB 06

83 EE 02
83 EF 02


90
Depo01 
Depo02

----------------






;---------------
tutte_uguali:


;---------------
trovata_diversa:



continua:
      DW    50 DUP (?)
      DW    50 DUP (?)
-------------------------------
      CLD
      MOV   CX,50
      LEA   SI,Depo01
      LEA   DI,Depo02
REPE  CMPSW
      JNE   trovata_diversa
;---------------------------
; servizio coppie uguali       
      NOP                      
      JMP  SHORT continua      
;------------------------------

      SUB   SI,2               
      SUB   DI,2               
; servizio prima coppia diversa
;------------------------------
 
      NOP
         
bulletL'analisi del codice suggerisce queste considerazioni:
bulletprendiamo nota della tecnica con cui viene riservata memoria per le 2 aree da confrontare, con la pseudoistruzione Dup.
bulletnotiamo la presenza dell'istruzione CLD, per imporre un'analisi in avanti.
bullet per inizializzare gli offset dei 2 puntatori si è fatto uso l'uso dell'istruzione LEA.
bulleti segment si ritengono quelli di default, DS e ES.
bulletil contatore CX è stato caricato con la dimensione di entrambe le aree e il prefisso REPE provvederà a ripetere automaticamente il confronto se le 2 word assunte dalla coppia di locazioni sono uguali tra loro, fino all'esaurimento di tutti gli elementi.
bulletse le coppie di word sono tutte uguali il processo ha termine regolarmente e, essendo E la condizione d'uscita, l'istruzione JNE non verrà eseguita e il programma proseguirà subito sotto, nella zona di programma indicata dall'etichetta tutte_uguali.
bulletse viene rilevata una coppia diversa il processo verrà immediatamente interrotto prima della fine e, essendo ora NE la condizione d'uscita, l'istruzione JNE verrà eseguita e il programma proseguirà più in basso, nella zona di programma indicata dall'etichetta trovata_diversa.: le prime istruzioni da eseguire sono, in questo caso, il ripristino dei puntatori DI e SI, sottraendo ad entrambi 2, così da favorire la localizzazione dei dati trovati diversi.

    

Pagina Precedente Scheda n° 07 Pagina Successiva Istruzioni Cpu 80x86 Torna al Menu delle Schede del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
Istruzione 029 - CMPSW

    

SCHEDE » 1.Header EXE 2.PseudoOp MASM 3.Differenza tra Macro e Procedure
4.
Tabella Vettori 5.PSP 6.Stack 7.Istruzioni 80x86
8.La misura dell'Informazione 9.Numeri e Logica Binaria
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati