Tutorial |
Dettaglio Istruzioni |
Istruzioni della Cpu 80x86 |
SCHEDA n° 07 [I/ 026 di 198] |
|
|
Questa istruzione analizza il contenuto di 2 locazioni di memoria e modifica le flag in funzione del risultato. | |
In pratica simula la sottrazione del sorgente dalla destinazione senza però alterare il contenuto 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. | |
Per funzionare correttamente è necessario specificare entrambi gli operandi, di solito con l'etichetta del primo dei dati di ciascuna area; in questo modo l'assemblatore è in grado di stabilire la dimensione del dato da assumere e collocare in memoria; se gli operandi non vengono dichiarati l'assemblatore segnala errore. | |
Si tratta di una istruzione piuttosto efficiente, nata per confrontare il contenuto di 2 aree di memoria, per esempio 2 stringhe di caratteri. | |
Nonostante la necessità di dichiarare l'operando sorgente (solo per motivi di corretta compilazione) per default utilizza comunque le coppie di registri DS:SI per puntare in minuendo (destinazione) e ES:DI per puntare il sottraendo (sorgente), per cui l'uso di questa istruzione ha senso solo se, in precedenza, i registri SI e DI sono stati inizializzati con le etichette usate come operandi, per esempio anticipando la CMPS Depo01,ES:Depo02 con LEA SI,Depo01 e LEA DI,Depo02, vedi esempio successivo). | |
In 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): prendiamone atto senza farci intimorire.... | |
L'istruzione è particolarmente utile per confrontare 2 stringhe o tabelle; per trovare un determinato byte o carattere in una stringa o in una tabella è disponibile la SCAS che si basa sul medesimo principio di funzionamento. |
Le sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni ): |
CMPS
Destinazione, Sorgente CMPS DS:[SI], ES:[DI] |
Cambia le Flag simulando { DS:[SI] - ES:[DI] } | |||||||||||||||
Esempio di Applicazione |
Cicli di Clock |
Mem Acces |
N° Bytes |
Flag influenzate | ||||||||||||
Mnemonico | Operandi | 86 | 268 | 386 | 486 | O | D | I | T | S | Z | A | P | C | ||
CMPS |
Byte Ptr[SI],[DI] |
22 | 8 | 10 | 8 | 2 | 1 | # | # | # | # | # | # | |||
CMPS |
Word Ptr[SI],[DI] |
30 | 8 | 10 | 8 | 2 | 1 | # | # | # | # | # | # |
La tabella evidenzia la tipologia degli
operandi: sono entrambi riferimenti a memoria e la cosa è decisamente
inconsueta; ciò è dovuto al suo particolare modo di funzionare, che va al di
là di un semplice confronto. Per questo sottolineiamo la sua capacità
gestionale:
| |||||||||||||||||||
Questa 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 INC influisce su di loro), cioè equivale all'esecuzione del seguente codice: |
MOV AL,DS:[SI] CMP AL,ES:[DI] PUSHF INC SI INC DI POPF |
La figura seguente mostra alcuni modi alternativi di scrivere questa istruzione: |
|
E' interessante osservare che, comunque sia scritta, al netto dell'eventuale byte di override, viene sempre codificata con il byte A6 (se tratta bytes) o A7 (se tratta word). | |
Prima 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. | |
Data l'utilità di questa tecnica viene proposto un esercizio d'esempio: |
|
L'analisi del codice suggerisce queste considerazioni:
|
|
Scheda n° 07 | Istruzioni Cpu 80x86 | |||||||
Istruzione 026 - CMPS |
|
|
|
Home |
|
|||||||
|
Motore Ricerca |
|