| Questa istruzione non
appartiene al Set dell'8088/86; si usa solo con 80286/486. |
| Essa trasferisce il
dato assunto dalla porta
specificata dal secondo operando (sorgente, per default DX)
nel primo operando (destinazione), una o più locazioni di memoria
consecutive (destinazione, per default puntata da ES:DI)
in funzione della dimensione dichiarata
dalla pseudooperazione che segue la sua etichetta (DB per byte,
DW per word o DD per doubleword,
ma solo con 80386/486). |
| Il nome della locazione destinazione deve
dunque essere sempre fornito al fine di stabilire la
dimensione del dato da leggere dal dispositivo; in ogni caso il segmento di
riferimento per lo stoccaggio è sempre ES
(e va dichiarato esplicitamente nell'istruzione), e non può essere cambiato
(cioè non può essere forzata con nessun altro registro di segmento, con l'override). |
| Se l'override ES:
non viene scritto nell'istruzione l'assemblatore segnala errore perchè,
come è noto, le etichette senza esplicita dichiarazione vengono compilate
con riferimento al segmento DS, cosa
impossibile in questo caso! |
| Nonostante la necessità di dichiarare
l'operando destinazione (solo per motivi di corretta compilazione) i dati sono
comunque scritti nella locazione puntata da ES:DI, per
cui l'uso di questa istruzione ha senso solo se, in precedenza, il registro
puntatore, DI, è stato inizializzato con
la rispettiva etichetta specificata come operando,
per esempio anticipando la INS
ES:Tabel01,DX
con LEA
DI,Tabel01, vedi esempio successivo). |
| Il secondo operando, sempre DX,
esprime il nome
della periferica coinvolta in lettura, cioè un numero intero da 0 a 65535 (da
0000H a FFFFH); non è possibile dunque passare un numero
immediato a 8 bit, come per l'istruzione IN;
il registro DX va caricato prima di
effettuare l'input: |
| E' interessante osservare che, comunque sia scritta,
al netto dell'eventuale byte di override, viene
sempre codificata con il byte 6C (se
tratta bytes) o 6D
(se tratta word). |
| Riassumendo, in dettaglio l'istruzione si
comporta in questo modo:
| Il dato prelevato dalla porta specificata
da DX ha la dimensione di un byte,
di una word o di
una doubleword. |
| il segmento
dell'area Destinazione è
per default, ES e l'offset è per
default DI; non è possibile
forzare un altro registro di segmento ed è necessario scrivere
esplicitamente l'override
ES:, per evitare
che l'assemblatore creda che si voglia coinvolgere DS:
(in altre occasioni assunto per default, se manca altra indicazione). |
| per questo è assolutamente necessario inizializzare
il registro DI (insieme alla flag DF)
prima di utilizzarlo. |
| dopo aver spostato il dato nella locazione
aggiorna il valore del registro di offset (DI o EDI),
in funzione del valore della flag di direzione DF
(che va quindi predisposta con certezza
prima di iniziare il
confronto):
| se DF=0
(direzione in avanti) al puntatore viene sommato 1 (cioè è
incrementato, se l'operando è un byte), 2 (se è una
word) o 4
(se ha dimensione doubleword). |
| se DF=1
(direzione indietro) al puntatore viene sottratto 1
(cioè è decrementato, se l'operando è un byte), 2 (se è una
word) o 4 (se ha dimensione doubleword). |
|
| la presenza dell'operando
destinazione è richiesta dalla sintassi
per consentire all'assemblatore di capire la dimensione
dei dati da trattare; esso deve dunque essere dichiarato con la specifica della
dimensione dei dati a cui fanno riferimento (Byte o
Word o Dword Ptr).
|
| l'assemblatore compila comunque questa istruzione con il medesimo unico byte di
codice operativo con cui tratta le istruzioni da essa derivate, tutte
prive di operando, cioè INSB,
se i dati manipolati sono bytes, INSW
se sono word, o INSD se
doubleword. |
|
| Questa potente istruzione esegue con un solo
codice operativo il compito di 3 istruzioni, cioè equivale all'esecuzione del seguente codice: |