|
Tutorial
|
Dettaglio Istruzioni |
|
|
 |
Istruzioni
della Cpu 80x86 |
SCHEDA n° 07 [I/
135
di 198] |
 |
|
OUTS - Spedisce
ad una porta (dispositivo) il dato assunto da una stringa |
|
 | Questa istruzione non
appartiene al Set dell'8088/86; si usa solo con 80286/486. |
 | Essa trasferisce alla porta
specificata dal secondo operando (destinazione, per default DX)
il
dato assunto da una o più locazioni di memoria
consecutive (sorgente, per default
puntata da DS:SI) la dimensione
delle quali dipende dalla pseudooperazione che segue la loro etichetta (DB per byte,
DW per word o DD per doubleword,
ma solo con 80386/486). |
 | Il nome della locazione sorgente 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 DS
e può essere cambiato con l'override. |
 | Nonostante la necessità di dichiarare
l'operando destinazione (solo per motivi di corretta compilazione) i dati sono
comunque letti dalla locazione puntata da DS:SI, per
cui l'uso di questa istruzione ha senso solo se, in precedenza, il registro
puntatore, SI, è stato inizializzato con
la rispettiva etichetta specificata come operando,
per esempio anticipando la OUTS
DX,Tabel01
con LEA
SI,Tabel01 , vedi esempio successivo). |
 | Il secondo operando, sempre DX,
esprime il nome
della periferica coinvolta in scrittura, 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 OUT;
il registro DX va caricato prima di
effettuare l'input: |
MOV
DX,0378H
OUTS DX,[Depo01] |
|
 |
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
): |
| OUTS |
Destinazione (porta) << Sorgente (DS:SI) |
| |
|
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 |
OUTS
|
DX,[Depo01]
|
no |
5 |
14 |
17 |
1 |
1 |
|
|
|
|
|
|
|
|
|
OUTS
|
DX,ES:[Depo01]
|
 | 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 |
|
6E
6F
66 6F |
|
|
OUTS DX,[Depo01]
OUTS DX,[Depo02]
OUTS DX,[Depo04] |
|
 | E' interessante osservare che, comunque sia scritta,
al netto dell'eventuale byte di override, viene
sempre codificata con il byte 6E (se
tratta bytes) o 6F
(se tratta word). |
 | Riassumendo, in dettaglio l'istruzione si
comporta in questo modo:
 | Il dato prelevato dalla memoria e spedito
alla porta specificata da DX ha la dimensione di un byte,
di una word o di
una doubleword. |
 | il segmento
dell'area Sorgente è
per default, DS e l'offset è per
default SI; è possibile
forzare un altro registro di segmento con l'override. |
 | per questo è assolutamente necessario inizializzare
il registro SI (insieme alla flag DF)
prima di utilizzarlo. |
 | dopo aver spedito il dato alla porta aggiorna il valore
del registro di offset (SI o ESI),
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
sorgente è 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è OUTSB,
se i dati manipolati sono bytes, OUTSW
se sono word, o OUTSD se
doubleword. |
|
 | Questa potente istruzione esegue con un solo
codice operativo il compito di 3 istruzioni, cioè equivale all'esecuzione del seguente codice: |
MOV AL,DS:[SI]
OUT DX,AL
INC SI |
 | Prima di concludere è opportuno sottolineare che questa
istruzione può fruire dell'operatore di autoripetizione REP: anteponendolo al suo mnemonico il processo di
lettura e uscita dati viene ripetuto automaticamente CX
volte, con
conseguente copia automatica sulla porta di tutta l'area sorgente 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 0378
8D 36 0100
B9 0012
6E
E2 FD ----------------
FC
BA 0378
8D 36 0100
B9 0012
F3 6E |
|
next:
-------
REP |
CLD
MOV DX,0378H
LEA SI,Tabel
MOV CX,18
OUTS DX,Tabel
LOOP next
----------------------
CLD
MOV DX,0378H
LEA SI,Tabel
MOV CX,18
OUTS DX,Tabel |
|
 | L'analisi del codice suggerisce queste considerazioni:
 | la presenza dell'istruzione CLD
impone la lettura della memoria in avanti. |
 | per inizializzare l' offset SI
del puntatore si è fatto uso l'uso dell'istruzione LEA. |
 | il segment delle locazioni sorgente
si ritiene quello di default, DS
(e quindi può anche non 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 tabella e lo spedisce alla porta, finchè non
ce ne sono più. |
|
 | 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
|