|
Tutorial
|
Dettaglio Istruzioni |
|
|
 |
Istruzioni
della Cpu 80x86 |
SCHEDA n° 07 [I/
044
di 198] |
 |
|
INS - Inserisce
in una stringa il dato assunto da una porta (dispositivo) |
|
 | 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: |
MOV DX,0379H
INS [Depo01],DX |
|
 |
Per
le scelte fatte dai primi progettisti di personal computer (IBM
compatibili) per pilotare le periferiche sono state utilizzate solo
le prime 10 linee d'indirizzo, da ADD0 a ADD9; per questa
ragione per i nomi dei dispositivi sono previsti solo
i numeri da 0000H (0) a 03FFH (1023=210),
sebbene DX consenta la specifica di numeri di gran lunga maggiori.
solo i dispositivi più moderni cominciano a riferirsi a nomi
al di fuori di questo range... |
 | Le sue caratteristiche sono riassunte nella
seguente tabella (leggi le istruzioni
): |
INS
Destinazione, Sorgente
INS Memoria, NomePorta |
Destinazione (ES:DI) << Sorgente (dato) |
| |
|
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 |
INS
|
[Depo02],DX
|
no |
5 |
15 |
17 |
1 |
1 |
|
|
|
|
|
|
|
|
|
INS
|
ES:[Depo02],DX
|
 | La tabella evidenzia che l'istruzione non
modifica alcuna flag. La figura seguente mostra le risorse
richieste da questa istruzione in funzione degli operandi
coinvolti (leggi le
istruzioni): |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
0100
0101
0103 |
|
55
55AA
55AA1188 |
|
.386p
Depo01
DB 55H
Depo02 DB
55AAH
Depo04 DD
55AA1188H |
| ---- |
|
---------------- |
|
------- |
---------------------- |
0107
0108
0109 |
|
6C
6D
66 6D |
|
|
INS ES:[Depo01],DX
INS ES:[Depo02],DX
INS ES:[Depo04],DX |
|
 | 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: |
IN
AL,DX
MOV ES:[DI],AL
INC DI |
 | Prima di concludere è opportuno sottolineare che questa
istruzione può fruire dell'operatore di autoripetizione REP: anteponendolo al suo mnemonico il processo di
lettura e spostamento dati viene ripetuto automaticamente CX
volte, con
conseguente stoccaggio automatico di tutta l'area destinazione di memoria;
naturalmente il numero di dati, CX, va
caricato preventivamente. |
 | Data l'utilità di questa tecnica viene proposto un
esercizio d'esempio: |
|
Addr |
|
Codifica
Masm |
|
Istruzione |
|
| 0100 |
|
20 20 20 20 20 20
20 20 20 20 20 20
20 20 20 20 20 20 |
|
Tabel
DB "
" |
| ---- |
|
---------------- |
|
------- |
---------------------- |
0112
0113
0116
011A
011D
011E----
0120
0121
0124
0128
012B |
|
FC
BA 0379
8D 3E 0100
B9 0012
6C
E2 FD ----------------
FC
BA 0379
8D 3E 0100
B9 0012
F3 6C
|
|
next:
-------
REP |
CLD
MOV DX,0379H
LEA DI,Tabel
MOV CX,18
INS ES:Tabel,DX
LOOP next
----------------------
CLD
MOV DX,0379H
LEA DI,Tabel
MOV CX,18
INS ES:Tabel,DX |
|
 | L'analisi del codice suggerisce queste considerazioni:
 | la presenza dell'istruzione CLD
impone la lettura della memoria in avanti. |
 | per inizializzare l'offset DI
del puntatore si è fatto uso l'uso dell'istruzione LEA. |
 | il segment delle locazioni destinazione si ritiene quello di default,
ES
(e quindi deve essere scritto esplicitamente). |
 | il contatore CX è stato caricato con la dimensione
della tabella, cioè il numero dei suoi caratteri. |
 | il puntatore di periferica DX
è assunto normalmente, con MOV. |
 | l'azione del LOOP
copia i dati assunti dalla porta nella tabella vuota; alla fine
conterrà i dati. |
|
 | Per confrontare i bytes compilati dall'assemblatore viene
proposta anche la versione che utilizza il prefisso REP. |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|