Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 135 di 198] 

    

    OUTS - Spedisce ad una porta (dispositivo) il dato assunto da una stringa
     
bulletQuesta istruzione non appartiene al Set dell'8088/86; si usa solo con 80286/486.
bulletEssa 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).
bulletIl 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.
bulletNonostante 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).
bulletIl 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]
         
Suggerimento 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... 
     
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
OUTS   Destinazione (porta) << Sorgente  (DS:SI)
 

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

OUTS

DX,[Depo01]

no 5 14 17 1 1                     

OUTS

DX,ES:[Depo01]

         
bulletLa 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]
         
bulletE' 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).
bulletRiassumendo, in dettaglio l'istruzione si comporta in questo modo:
bulletIl dato prelevato dalla memoria e spedito alla porta specificata da DX ha la dimensione di un byte, di una word o di una doubleword.
bulletil segmento dell'area Sorgente è per default, DS e l'offset è per default SI; è possibile forzare un altro registro di segmento con l'override.
bulletper questo è assolutamente necessario inizializzare il registro SI (insieme alla flag DF) prima di utilizzarlo.
bulletdopo 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):
bulletse 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).
bulletse 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).
bullet 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).
bulletl'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.
bulletQuesta 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
     
bulletPrima 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.
bulletData 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
     
bulletL'analisi del codice suggerisce queste considerazioni:
bulletla presenza dell'istruzione CLD impone la lettura della memoria in avanti.
bullet per inizializzare l' offset SI del puntatore si è fatto uso l'uso dell'istruzione LEA.
bulletil segment delle locazioni sorgente si ritiene quello di default, DS (e quindi può anche non essere scritto esplicitamente).
bulletil contatore CX è stato caricato con la dimensione della tabella, cioè il numero dei suoi caratteri.
bulletil puntatore di periferica DX è assunto normalmente, con MOV.
bulletl'azione del LOOP copia i dati assunti dalla tabella e lo spedisce alla porta, finchè non ce ne sono più.
bulletPer confrontare i bytes compilati dall'assemblatore viene proposta anche la versione che utilizza il prefisso REP.

    

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 135 - OUTS

    

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