Il processore 8086

Materie:Appunti
Categoria:Informatica

Voto:

2.5 (2)
Download:111
Data:22.03.2001
Numero di pagine:27
Formato di file:.doc (Microsoft Word)
Download   Anteprima
processore-8086_1.zip (Dimensione: 26.15 Kb)
trucheck.it_il-processore-8086.doc     110 Kb
readme.txt     59 Bytes



Testo

IL PROCESSORE 8086
1.1 INTRODUZIONE
Questo documento illustra le caratteristiche del microprocessore 8086. In particolare gli argomenti trattati sono:
1. Il microprocessore 8086
2. Sistemi ed interfacce del modo minimo e massimo
3. Architettura interna del microprocessore 8086
4. Il generatore di clock 8284 e il ciclo di bus dell’ 8086
5. Esecuzione dell’istruzione nel sistema 8086
1.2 IL MICROPROCESSORE 8086
L’8086, annunciato per la prima volta nel 1978, fu il primo microprocessore a 16-bit introdotto dall’ Intel Corporation. Ad esso sono seguiti altri componenti come il microprocessore 8088, il coprocessore numerico 8087, e il processore 8089 I/O.
L’8086 è fabbricato usando tecnologia metallo-ossido-semiconduttori ad alte-prestazioni (HMOS) e il numero di circuiti nel chip è approssimativamente eqivalente a 29,000 transistor. Esso è racchiuso in un contenitore a 40-pin come mostrato in figura 2.1. Molti dei suoi pin hanno funzioni multiple. Per esempio, le linee indirizzi A0 - A15 e le linee bus dati D0 - D15 utilizzano gli stessi pin. Per questa ragione, questi comandi sono etichettati AD0 - AD15.
L’8086 è un vero microprocessore con trasferimenti dati interni ed esterni a 16-bit. Puo’ indirizzare fino a 1Mbyte di memoria attraverso un bus indirizzi a 20 bit e fino a 64k byte o 32K word porte di I/O.
1.3 MODO MINIMO E MASSIMO DI FUNZIONAMENTO
Il microprocessore 8086 può essere configurato per lavorare in 2 modi diversi: modo minimo e modo massimo.
Il modo minimo viene selezionato applicando il valore logico 1 al comando di ingresso MN/MX. I sistemi basati sul modo minimo sono tipicamente più piccoli e contengono un solo microprocessore. Ponendo il valore logico 0 sul pin MN/MX si seleziona il modo massimo. Questo configura l’ 8086 per l’uso con processori multipli in modo da soddisfare meglio diverse esigenze.
A seconda del modo di funzionamento alcuni pin hanno significati diversi.
(Guidolin)
PAG. 16
Come mostrato in figura 2.1 , le funzioni dei pin specificati fra parentesi sono quelle che riguardano un sistema in modo massimo .
L’ elenco completo dei segnali, comuni, del modo minimo e del modo massimo e’ nelle figure 2.2(a),(b),e (c) , rispettivamente, dove sono riportati il nome , la funzione e il tipo per ogni segnale . Per esempio, il segnale RD è nel gruppo comune ed e’utilizzato come segnale di controllo della lettura: segnala alla memoria o all’ interfaccia di I/O quando il bus di sistema dell’ 8086 è pronto per l’ ingresso dei dati .
(Malosso pag 17)
Inoltre, si noti che i segnali hold request (HOLD) e hold acknowledge (HOLDA) sono utilizzati solo in modo minimo. Se l’ 8086 e’ impostato per funzionare in modo massimo i due segnali sono sostituiti dalle linee request/grant del bus (RQ/GT) (RQ/GT)
1.4 INTERFACCIA DI MODO MINIMO
Quando e’ impostato in funzionamento in modo minimo , l'8086 stesso provvede a generare tutti i segnali necessari per gestire la memoria e l’ I/O .
La figura 2.3 mostra un diagramma a blocchi della configurazione di modo minimo dell'8086.
I segnali di modo minimo possono essere raggruppati in segnali per bus di indirizzi e dati , segnali di stato, segnali di controllo, segnali di interrup e DMA. Per semplicita’, nel disegno le linee con doppio significato sono rappresentate come indipendenti.
( Furlanetto pag.17)
BUS INDIRIZZI E BUS DATI
Analizziamo dapprima i bus indirizzi e dati. In un sistema 8086 queste linee adempiono a due funzioni. Come bus indirizzi sono usate per indirizzi alla memoria e alle porte I/O.
Il bus indirizzi è lungo 20 bit e le linee che portano i segnali sono indicate con A0 - A19. A19 rappresenta il bit più significativo (MSB) e A0 il meno significativo (LSB). Un indirizzamento a 20 bit permette all’8086 di accedere ad 1 Megabyte di memoria ed ad uno spazio di I/O indipendente di 64K.
Le 16 linee del bus dati (da D0 a D15) sono condivise con le rispettive linee indirizzi da A0 ad A15. Cioe’ il bus lavora come un bus indirizzi durante un intervallo di tempo, e come bus dati in un altro intervallo di tempo.
D15 è il più significativo (MSB) e D0 il meno significativo (LSB).
Quando funziona come bus dati, queste linee portano dati scritti e letti dalla memoria, dati I/O per i dispositivi di I/O, e codici di tipo interruzioni da un controllore di interruzioni.

(Tonello)
PAGINA 18/19(SOLO 2° CAPORIGA)
SEGNALI DI STATO
Anche le quattro linee di indirizzo più significative, A19 - A16 sono condivise con i segnali di stato S6 - S3. Questi bit di stato sono presenti in uscita sul bus contemporaneamente al dato. I bit S4 e S3 identificano quale registro di segmento interno del 8086 è usato per generare l' indirizzo fisico presente sul bus indirizzi durante il ciclo di bus corrente. La codifica dei registri e’ rappresentata in figura 2.4. Si noti che il codice S3,S4 = 00 identifica un registro conosciuto come extra segment come fonte dell' indirizzo di segmento.
La lineea di stato S5 rappresenta il livello logico del flag interno di abilitazione degli interrupt. L'ultimo bit di stato S6 è sempre a livello logico 0.
SEGNALI DI CONTROLLO
I segnali di controllo hanno il compito di gestire l'interfaccia di memoria e di I/O. Indicano ad esempio quando sul bus e’ presente un indirizzo valido o in quale direzione il dato deve essere trasferito nel bus, quando e’ presente un dato per la scrittura o la lettura sul bus dati. Per esempio, address latch enable(ALE) (indirizzo abilitato) è un impulso che se posto ad 1 segnala alla circuiteria esterna quando c’ e’ un indirizzo valido sul bus .Questo indirizzo deve essere memorizzato nella circuiteria esterna durante la transizione da 1 a 0 del segnale ALE.
Un altro segnale di controllo prodotto durante il ciclo di bus è BHE (bank hight enable)(banco di memoria alto abilitato). Il valore logico 0 su questa linea è usato per abilitare il byte piu’ significativo del bus dati, tra D8 e D15. Questa linea ha anche la funzione di segnalatore di stato S7.
(Castellano pag. 19)
Usando le linee M/IO(Memoria /IO) e DT/R (dati trasmessi/ricevuti) , l'8086 segnala quale tipo di ciclo di bus è in fase di esecuzione e in quale direzione i dati devono essere trasferiti sul bus. Il livello logico di M/IO indica ai dispositivi esterni se sta per iniziare sul bus un trasferimento da/verso la memoria o l’ I/O. Il livello logico 1 segnala una operazione di memoria e il livello logico 0 un'operazione di I/O. La direzione dei dati trasferiti sul bus è segnalata dal livello logico del segnale DT/R. Quando questa linea è a livello logico 1 durante la parte di trasferimento dei dati di un ciclo bus , il bus è nel "modo di trasmittente". Quindi, i dati sono scritti in memoria o nel dispositivo di output. Se il livello logico del DT/R e’ 0, segnala che il bus è nel "modo ricevente". Questo corrisponde a leggere i dati dalla memoria o dall'ingresso. I segnali leggi (RD) e scrivi (WR) , indicano rispettivamente che un ciclo di bus di lettura o scittura è in fase di esecuzione. L'8086 mette WR a livello logico 0 per segnalare ai dispositivi esterni che e’ ci sono dati validi nel bus. Invece RD indica che l'8086 sta eseguendo una lettura di dati dal bus. Durante le operazioni di lettura , e’ attivo anche un altro segnale di controllo DEN (abilitazione dati): esso segnala ai dispositivi esterni quando possono depositare i dati nel bus.
Infine, nelle operazioni di I/O è anche il segnale di lettura. Esso può essere usato per inserire stati di attesa nel ciclo bus che possono durare diversi periodi di clock. Questo segnale e’ prodotto da un generatore esterno e puo’ essere utilizzato dalla memoria o da dispositivi di I/O per segnalare all'8086 quando essi sono pronti per completare il trasferimento dei dati.
SEGNALI DI INTERRUPT
I segnali di interrup sono 2: segnale per le interruzioni richieste (INTR) e quello per le interruzioni riconoscute (INTA) . INTR è in input all' 8086 e può essere usato da un dispositivo esterno per segnalare che necessita di essere servito.
(Fantinato-Saretta -Anonimo pag. 20)
Questo segnale è controllato nell’ultimo periodo di clock di ciascun ciclo di istruzione.
Il valore logico 1 su INTR rappresenta una richiesta di interrupt attiva.
Quando una richiesta di interupt è stata riconosciuta dall'8086 esso indica questo evento ai circuiti esterni con un impulso al valore logico 0 sul pin INTA.
Anche il segnale TEST, in input, e’utilizzato per la gestione degli interrupt. L' esecuzione di una istruzione di WAIT nell’ 8086 controlla il livello logico del segnale TEST.
Se il valore logico è 1 il mP sospende l’esecuzione ed entra in quello che è conosciuto come stato di IDLE .
L' 8086 non esegue istruzioni ma controlla continuamente il segnale di TEST in attesa che passi al valore logico 0.
Non appena TEST assume il valore 0, riprende lésecuzione della istruzione successiva.
Questa caratteristica può essere usata per sincronizzare operazioni interne dell'8086 con un evento hardware esterno.
Ci sono due ulteriori segnali di input : l'interupt non mascherabile (NMI) e l'interupt di reset (RESET). Nella transizione dal livello 0 al livello 1 dell' NMI il controllo passa ad una routine di servizio dell' interupt non mascherabile .
Il RESET è usato per inizializzare l' hardware dell’ 8086. Ponendo RESET a valore logico 0 vengono inizializzati i registri interni dell'8086 e avviata una routine di servizio per l' azzeramento hardware.
SEGNALI DI INTERFACCIA DEL DMA
I segnali per l’ accesso diretto alla memoria, nel modo minimo del sistema dell'8086 consiste nei segnali segnali HOLD e HLDA.
Quando un dispositivo esterno vuole prendere il controllo del bus di sistema , segnala questo evento all'8086 settando l' HOLD al valore logico 1.
Al completamento del ciclo corrente del bus , l’8086 entra nello stato di HOLD.
con le linee di segnali l'AD0 - AD15, AD16/S3 - AD19/S6 , BHE, M/IO, DT/R,QD,WR,DEN e INTR tuttenello stato di alta impedenza
L’8086 segnala ai dispositivi esterni che e’in questo stato portando al valore logico 1 la linea HOLDA.
2.5 FUNZIONAMENTO IN MODO MASSIMO
Quando l'8086 è impostato per il funzionamento in modo massimo genera dei segnali per lavorare in un ambiente multiprocessore/coprocessore.
Con "ambiente multiprocessore " si intende che più processori stanno eseguendo il loro proprio programma. Di solito in questo caso ci sono alcune risorse di sistema comuni a tutti i processori chiamate risorse globali.
Altre risorse, assegnate ad ogni specifico processore sono chiamate risorse locali o private.
"Ambiente coprocessore" significa che c'è un secondo processore nel sistema.
In questo caso i due processori non accedono al bus nello stesso momento, uno passa il controllo del bus di sistema all'altro e sospende le sue operazioni.
Nel modo massimo ci sono funzioni per allocare le risorese globali e per passare il controllo del bus ad altri microcomputer o processori.
(Milani G.- pag.21- 7gg ritardo))
Guardando il diagramma a blocco del modo massimo in figura 2.5 noi vediamo che l'8086 non provvede direttamente a tutti i segnali che sono richiesti per controllare la memoria, l'inpute, l'output e le interfacce di interruzione. Specificatamente, i segnali WR, M/IO, DT/R, DEN, ALE e INTA non sono più generati dall'8086. Invece, esso manda in uscita i tre segnali di stato S0 S1 S2 precedenti all'inizio di ogni ciclo del bus.
Questi tre bit del codice di stato identificano che tipo di ciclo del bus sta seguendo.
S2 S1 S0 sono dati che in input dal dispositivo esterno del controllo del bus, l'8288, che li decodifica per identificare il tipo di ciclo dell'MPU bus.
In risposta, il bus controller genera i comandi di tempo e i segnali appropiati.
La figura 2.6 mostra la relazione tra i codici di stato e i tipi di ciclo del bus. Mostra anche quali sono i segnali di output che sono generati per riferire al circuito esterno che tipo di ciclo di bus sta prendendo posto. Questi segnali di output sono: - comando di lettura della memoria (MRDC), comando di scrittura della memoria (MWTC), comando avanzato di scrittura della memoria (AMWC), comando di lettura di input e output (IORC), comando di scrittura di input e output (IOWC), comando avanzato di scrittura di input e output (AIOWC) e il comando di riconoscimento degli interrupt (INTA).
L'8288 produce uno o due di questi otto segnali di comando per ogni ciclo del bus. Per esempio, quando l'8086 manda in output la codifica di S2 S1 S0 come 001, esso indica che un ciclo di lettura di un I/O sta per essere eseguito. A sua volta mette il suo interrutore di uscita IORC in logica 0. Dall'altra parte, se il codice 111 è in output dall'8086, esso sta segnalando che nessuna attività del bus sta prendendo posto.
Gli output di controllo prodotti dall'8288 sono DEN, DT/R e ALE. Questi tre segnali provvedono alle stesse funzioni come quelle descritte per il sistema a modo minimo. Questa serie di commandi del bus e di segnali di controllo è compatibile con il Multibus (bus multiplo) in standard industriale per interfacciare i sistemi di microprocessori.
- The 8289 Bus Arbitrer
Guardando la figura 2.5, noi vediamo che un gestore del bus 8289 è anche stato addizionato nel sistema a modo massimo. E' questo dispositivo che permette ai processori multipli di risiedere nel bus di sistema.
Esso fa questo complementando il protocollo arbitrato del multibus in un sistema base 8086.
In aggiunta al controllore del bus 8288 e all' arbitro del bus 8289 sono dati un numero piedini dell'8086 usati per produrre segnali di controllo che sono richiesti per supportare i processori multipli. Il blocco di percedenza del bus (LOCK) è uno di questi segnali.Esso è dato in input dall'arbitro del bus assieme ai segnali di stato S0 e S1. Gli output dell'8289 sono segnali di arbitraggio: bus occupato(BUSY), richieste del bus comune(CBRQ), uscite di precedenza del bus(BPRO), ingressi di precedenza del bus(BPRN), richieste del bus(BREQ), e blocco del bus(BCLK).
Essi corrispondono ai segnali di cambio di bus del multibus e sono usati per chiudere fuori dal sistema dei bus gli altri processori durante l'esecuzione di un'istruzione da parte dell'8086.In questo modo il processore può essere assicurato di un continuo accesso alle risorse del sistema comune come la memoria globale.
(Minato-Melara-Anonimo pagg.22-23)
SEGNALI DELLO STATO DELLA CODA :
Due nuovi segnali che sono prodotti dal 8086 nel sistema di modo massimo
sono output di stati della coda QS0 e QS1.
Assieme essi formano un codice di stato della coda a 2-bit, QS1QS0.
Questo codice dice al circuito esterno quale tipo di informazione Š stata
rimossa dalla coda durante il precedente ciclo di clock.
La figura 2.7 mostra i 4 differenti stati della coda. Notare che QS1QS0=01
indica che il primo byte di una istruzione Š stato prelevato dalla coda.
Come mostrato, il successivo byte di una istruzione che viene preso, Š
identificato dal codice 11.
Ogni qual volta il resettamento della coda ,dovuto a un trasferimento di
controllo , viene emesso il codice riinizializzato 10.
SEGNALI DEL BUS LOCALE DI CONTROLLO - SEGNALI DI RICHIESTA/CONCESSIONE
Nella configurazione di moda massimo ,l'interfaccia del modo minimo HOLD,
HLDA viene cambiata.
Questi due segnali sono riprodotti dalle linee richiesta/concessione
RQ/GT0 e RQ/GT1 rispettivamente.
Loro forniscono un meccanismo di accesso al bus prioritario per accedere
al bus locale.
figura 2.7
QS1 QS0 stati coda
0 0 Nessuna operazione. Durante il precedente ciclo di
clock niente Š stato prelevato dalla coda.
0 1 Primo byte. Il byte prelevato dalla coda Š il primo
byte dell'istruzione.
1 0 Coda vuota. La coda Š stata riinizializzata come un
risultato dell'esecuzione di una istruzione trasferita.
1 1 Sottosequenza byte. Il byte preso dalla coda Š un byte di sottosequenza dell'istruzione.
(Rocco-anonimo- pag. 24-25)
2,6 ARCHITETTURA INTERNA DEL 8086
L'architettura interna di un microprocessore descrive i suoi componenti funzionali e la loro interazione. La figura 2,8 mostra un diagramma a blocchi del architettura interna del microprocessore 8086.
Blocchi interni del 8086
Nel microprocessore 8086,le funzioni interne sono divise tra due unità di lavorazione separate. Esse sono l' unita di interfaccia bus(BIU) e l'unità di esecuzione (EU). In genere, la BIU è responsabile del effettuazione di tutte le operazioni sui bus, come il il recupero di istruzioni, la lettura ed la scrittura degli operandi per la memoria, e l'immissione o emissione di dati per unità periferiche. Dall'altra parte l'EU è responsabile dell'esecuzione delle istruzioni. Entrambe le unità operano asincronamente per dare all' 8086 un recupero delle istruzioni ed un meccanismo di esecuzione dell'istruzione intrecciati. In essenza, questa lavorazione parallela della BIU e dell'EU elimina il tempo necessario per recuperare molte delle istruzioni. Questo ha come conseguenza un uso efficiente dei bus di sistema e un significativo miglioramento delle prestazioni del sistema.
Unità Interfaccia Bus
L'unità d'interfaccia bus è l'interfaccia verso il mondo esterno del 8086. Essa provvede completamente ad un bus dati bidirezionale a 16-bit e ad un bus indirizzi a 20-bit. L'unità d'interfaccia bus è responsabile del esecuzione di tutte operazioni dei bus esterni. Specificamente, ha le funzioni seguenti: recupero delle istruzioni, accodamento delle istruzioni, recupero e salvataggio degli operatori, dislocamento degli indirizzi, e controllo dei bus. Per compiere queste funzioni, la BIU contiene i registri di segmento, i registri di comunicazione interni, il puntatore all'istruzione, la coda del codice delle istruzioni, il sommatore degli indirizzi, e la logica del controllo dei bus. Questi componenti sono identificati in figura 2.8. La BIU usa un meccanismo noto come coda di scorrimento delle istruzioni per adempiere ad un architettura del pipeline. Questa coda permette un prerecupero fino a sei byte di codice delle istruzioni. Quando la coda della BIU non è piena, c'é posto per almeno ancora due byte, ed allo stesso tempo, l'EU non richiede di leggere o scrive operandi in memoria., la BIU è libera di guardare avanti nel programma prerecuperando la prossima istruzione sequenziale. Queste istruzioni prerecuperate sono tenute nella sua first in, first out (FIFO) coda. Con il suo bus dati a 16-bit la BIU recupera due byte delle istruzioni in un solo ciclo di memoria. Dopo che un byte è caricato nella coda, esso automaticamente schifta attraverso la FIFO fino alla posizione vuota più vicina all'output. L'EU accede alla coda dalla fine. Legge un byte delle istruzioni dopo l'altro dall output del coda.
Se la coda è piena ed l'EU non richiede alcun accesso agli operandi in memoria, la BIU non compie alcun ciclo di bus. Questi intervalli di inattività del bus, che possono accadere tra i cicli di bus, è noto come stato inattivo. Inoltre, se la BIU è già nel processo di recupero di un'istruzione quando l'EU richiede di leggere o scrivere operandi in memoria o in I/ O, la BIU completa il ciclo di bus per il recupero dell'istruzione prima di iniziare il ciclo di lettura/scrittura degli operandi.
La BIU contiene anche un sommatore riservato il quale è usato per generare l'indirizzo fisico a 20-bit che è emesso sul bus indirizzi. Questo indirizzo è formato sommando indirizzo di segmento a 16-bit ed un indirizzo di spiazzamento a 16-bit. Per esempio l'indirizzo fisico della prossima istruzione da recuperare è formata combinando i contenuti correnti del registro del codice di segmento (CS) ed i contenuti correnti del registro puntatore all'istruzione (IP).
La BIU è anche responsabile della generazionedei segnali di controllo dei bus necessari per il controllo dei circuiti nella memoria e dei sottosistemi di I/O.
(Colombana pagg. 26-27)
L'unit… esecutiva (EU) estrae le istruzioni dalla cima della coda nell'unit…
di interfaccia bus (BIU),le codifica,genera indirizzi se necessario,li passa
alla (BIU) e li richiede per eseguire i cicli di lettura e scrittura della
memoria o I/O ed esegue l'operazione specificata dall'istruzione sugli
operandi.
Durante l'esecuzione dell'istruzione,l'EU testa gli stati e il controllo dei
flag e li aggiorna basandosi sul risultato dell'operazione.
Se la coda Š vuota,l'EU aspetta il byte dell'istruzione successiva per
prenderla e spostarla sulla cima della coda.
Quando l'EU esegue un'operazione di jump,trasferisce il controllo alla
locazione corispondente ad un altro set di istruzioni sequenziali.
Ogni qualvolta questa istruzione appare,la BIU risetta automaticamente la coda
e poi comincia ad andare a prendere le istruzioni da questa nuova locazione
per riempire la coda.
REGISTRI INTEGRALI DELL'8086
L'8086 ha quattro gruppi di registri interni accessibili all'utente.
Essi sono: il puntatore all'istruzione (IP),quattro registri per i dati,
quattro registri puntatore e indice,e quattro registri segmento.
Essi rappresentano un totale di tredici registri a 16 bit ma in aggiunta a
questi c'Š un altro registro a 16 bit chiamato registro di stato con 9 dei
suoi 16 bit implementati per gli stati e il controllo dei flag.
PUNTATORE ALLE ISTRUZIONI
Il puntatore alle istruzioni Š un registro a 16 bit all'interno dell'8086 che
identifica la locazione dell'istruzione successiva da eseguire nella coda di
segmento corrente.
Esso Š simile al 'program counter' comunque.L'IP infatti contiene un puntatore
offset invece di un dell'indirizzo fisico dell'istruzione successiva,questo
perchŠ l'8086 ha registri e memorie a 16 bit ma richiede un indirizzo a 20
bit.
L'offset deve essere combinato con i contenuti di un altro registro,in questo
caso con il registro codice segmento (CS),per generare l'indirizzo fisico
dell'istruzione.Questo registro Š allocato fisicamente nella BIU.
Ogni volta che un'istruzione viene presa dalla memoria,la BIU aggiorna il
valore nell'IP,in modo da puntare alla prossima sequenza di istruzioni in
memoria.
REGISTRI DATI
Come mostrato in figura 2.8 ci sono quattro registri di dati generali che sono
allocati all'interno della EU dell'8086.
Durante l'esecuzione del programma essi sono utilizzati per memorizzare
temporaneamente i risultati intermedi.
Il vantaggio di memorizzare questi dati in registri interniinvece che nella
memoriaŠ che ad essi si p—o accedere molto pi— velocemente.
I registri dati sono mostrati in maggior dettaglio in figura 2.9a.
Qu vediamo che i quattro registri dati sono:registro accumulatore (A),
registro base (B),registro contatore (C) e registro dati (D).
Ogni registro Š accessibile sia come 1 da 16 bit che come 2 da 8 bit.
I riferimenti ad un registro a 16 bit sono identificati da una 'x' dopo la
lettera del registro.Per esempio il registro accumulatore Š AX e nello stesso
modo gli altri tre registri sono nell'ordine BX,CX,DX.
Quando invece ci riferiamo al byte alto o a quello basso,queste parti vengono
rispettivamente indicate con una 'h' o una 'l' dopo la lettera del registro.
Per il registro A la parte pi— significativa Š AH,quella meno significativa Š
AL.Gli altri byte vengono anch'essi divisi in BH-BL,CH-CL e DH-DL.
Molti dei registri dati generali possono essere usati per operazioni di tipo
aritmetico e logico come la somma o l'AND.
Comunque,per alcune operazioni come quelle eseguite da stringhe di istruzioni,
sono usati registri specifici.
Nel caso di una stringa di istruzioni il registro C Š usato per memorizzare un
numero che rappresenta il numero di byte da muovere.—
Questa Š la ragione per la qaule il suo nome Š 'registro contatore'.
Un altro esempio di uso dedicato al registro dati Š che tutte la operazioni
di I/O richiedono che i dati che vengono messi input o output devono essere nel
registro A mentre il registro DX tiene l'indirizzo della porta di I/O.
La figura 2.9b riporta le funzioni dei registri generali.
REGISTRI PUNATORE E INDICE
Ci sono altri quattro registri generali,mostrati in figura 2.8,due registri
puntatore e due registri indice.
Essi sono utilizzati per memorizzare gli indirizzi delle locazioni di memoria
relativi ai registri di segmento.
I valori tenuti in questi registri possono essere caricati o modificati
attraverso programmi.Questo Š fatto eseguendo l'istruzione che si riferisce al
registro di indirizzo di offset.
In questo modo l'istruzione specifica semplicemente quale registro contiene
l'indirizzo di offset
Figura 2.9a
H L
|
15 8|7 0
É-------------------
| AX |
-------------------- ACUMULATORE
| AH | AL |
È-------------------
É-------------------
| BX |
-------------------- BASE
| BH | BL |
È-------------------
É-------------------
| CX |
-------------------- CONTATORE
| CH | CL |
È-------------------
É-------------------
| DX |
-------------------- DATI
| DH | DL |
È-------------------

Figura 2.9b
-----------------------------------------
| REGISTRO | OPERAZIONI |
-----------------------------------------
| AX | Moltiplicazione di word |
| | Divisione di word |
| | Operazioni di I/O con word |
-----------------------------------------
| AL | Moltiplicazione con byte |
| | Divisione con byte |
| | Operazioni di I/O con byte |
| | Numeri dacimali |
-----------------------------------------
| AH | Moltiplicazione con byte |
| | Divisione con byte |
-----------------------------------------
| BX | Trasferisce |
-----------------------------------------
| CX | Operazioni con stringhe |
| | Cicli |
-----------------------------------------
| DX | Moltiplicazione di word |
| | Divisione di word |
| | Operazioni di I/O indirette|
-----------------------------------------
(Coro’-Baldassa-pagg.28-29)
Figura 2.10 mostra che i due registri puntatori sono il puntatore di pila (SP) e puntatore di base (BP) .Il puntatore di pila permette un facile accesso alle locazioni nel segmento di memoria del puntatore di pila (stack).Il valore in SP rappresenta l' indirizzo della prossima locazione di memoria dello stack che può essere raggiunta in relazione all indirizzo corrente nel registro segmento della pila (SS);che è sempre diretto alla sommità della pila. BP rappresenta anche un indirizzo dal registro SS. Comunque è usato per accedere ai dati senza
il segmento di pila. I registri indice sono usati per mantenere lo l ' indirizzo di spiazzamento per una istruzione che accede ai dati memorizzati ne segmento dei dati della memoria. Per questa ragione sono sempre riferiti al valore del registro del segmento dei dati (DS).Il registro indice sorgente (SI) è usato per immagazzinare un indirizzo di spiazzamento per una sorgente dell' operando e il registro indice di destinazione (DI) è usato per la memorizzazione di uno spiazzamento che identifica la locazione di una destinazione dell' operando. Per esempio , un istruzione stringa che richiede uno spiazzamento dalla locazione di una sorgente o destinazione dell' operando userebbe questi registri.
REGISTRI SEGMENTO
Come indichiamo più presto ,l' indirizzo fisico di un 8086 è ampio 20 bits ma i suoi registri e le locazioni di memoria che contengono l' indirizzi logici sono proprio ampi 16 bits. Questi ammettono 1 M-byte di spazio di indirizzo. Comunque , lo spazio di indirizzo è diviso in 64K
segmenti di byte e proprio quattro segmenti possono essere attivati in una volta. E' per la selezione dei quattro segmenti attivati che i 16-bit dei registri segmento sono provvisti senza la BIU del 8086.
Questi quattro registri sono registro segmento di codice (CS),registro segmento dei dati (DS), segmento di stack(SS), registro segmento extra (ES).Questi registri sono mostrati in fig.2.11.Sono caricati indirizzi a 16bit che identificano quali segmenti di memoria sono attivi. Per esempio, il valore in CS identifica l 'indirizzo d' inizio del segmento di 64K-byte conosciuto come il segmento di codice. Per " indirizzo d' inizio ", intendiamo i più bassi byte indirizzati nel segmento di codice attivo. I valori mantenuti in questi registri per esempio ,l' indirizzo corrente del codice segmento , sono frequentemente riferiti ai correnti valori del registro segmento. Il segmento di codice della memoria contiene istruzioni del programma I contenuti del CS identificano la locazione iniziale del corrente segmento di codice in memoria. Per accedere alle locazioni immagazzinate di un istruzione nel codice di segmento attivo, l' 8086 deve generare l' indirizzo fisico a 20-bit.
Per fare questo , esso combina i contenuti del registro puntatore all' istruzione (IP) con il
valore di CS per produrre l' indirizzo fisico che sarà emesso sul bus indirizzi.
L' effettivo codice del segmento può essere cambiato dalla semplice esecuzione di una
istruzione che carica un nuovo valore nel registro CS. Per questa ragione, possiamo usare
uno qualsiasi dei segmenti indipendenti della memoria per la memorizzazione del codice.
I contenuti del registro segmento data DS individuano la locazione d' inizio del corrente
segmento data nella memoria.Questo è un secondario segmento attivo con capacità 64k
che provvede una lettura/scrittura nello spazio memoria nel quale il dato è stato memo-
rizzato. Gli operandi di molte istruzioni sono portati da questo segmento. Comunque,un
prefisso può essere incluso con un istruzione per ottenere gli operandi da uno qualsiasi
degli altri segmenti.I valori nel registro indice sorgente (SI) o nel registro indice destina-
zione (DI) sono combinati con il valore di DS per formare l' indirizzo fisico, da 20-bit,
della sorgente o destinazione dell' operando del segmento data.
Il registro segmento stack (SS) contiene un indirizzo logico che identifica la locazione
d' inizio del corrente segmento stack in memoria.Esso è un segmento da 64k che contiene
i valori del puntatore all' istruzione (IP),la condizione dei flag, e altri registri vi vengono
spinti ogni qualvolta un interruzione hardware, un interruzione software,o una sottoroutine
viene chiamata.Dopo che la routine di servizio o la sottoroutine è completata, la condi-
zione originale del sistema è restituita dallo stack con l' esecuzione di istruzioni pop e un'
istruzione di ritorno. La prossima locazione nella quale una parola può essere spinta o
dalla quale può essere presa identifica la combinazione del corrente valore di SS con
quello del puntatore stack SP.
L' ultimo registro segmento identifica la quarta effettiva area di memoria da 64k.
Questa area è chiamata segmento extra (ES).Il segmento extra è solitamente usato per
memorizzare dati. Per esempio, le istruzioni stringa usano il valore di ES con il contenuto
di DI come un offset che specifica l' indirizzo destinazione.
REGISTRO FLAG
Il registro flag è un registro a 16-bit dentro l' EU. Comunque,come mostra la figura 2.1
appena nove dei suoi bit sono riempiti. Sei di questi bit rappresentano lo stato dei flag.
Essi sono: il flag di riporto CF,il flag di parità PF,il flag di riporto ausiliario AF,il flag di
zero ZF,il flag di segno SF,e il flag di overflow OF.
Lo stato dei flag indica le condizioni prodotte dai risultati dell' esecuzione di un' istruzione
aritmetica o logica.I bit dei flag vengono posti a 1 o a 0 alla completazione dell' esecuzio-
ne dell' istruzione.
Per prima cosa riassumiamo l' operazione di questi stati di flag:
(Campigotto-Battistetti-Mason- pagg. 30-31)
1.Il flag di carry (cf):CF è a uno se c’è un riporto o un prestito per il bit più
significativo durante l’esecuzione di un’istruzione aritmetica.Altrimenti ,CF è a 0.
2.Il flag di parità (PF) :PF è a 1 se il risultato prodotto dall’istruzione è ancora di parità,se esso contiene un’altro numero di bits al primo livello logico.Se la parità è dispari ,PF è a 0.
3.Il flag di roporto ausiliario(AF):AF è a uno se c’è un riporto sul semibyte basso verso il semibyte alto o un prestito dal semibyte alto al semybyte basso del byte più basso in una parola a 16 bit.Altrimenti AF è a 0.
4.Il flag di zero (ZF):ZF è a 1 se il risultato di una operazione aritmetica o logica è a zero .Altrimenti ZF è a 0.
5.Il flag di segno(SF):il bit più significativo del risultato è copiato nel SF.Questo SF è a 1 se il risultato è un numero negativo o a 0 se è positivo.
6.Il flag di overflow(OF):quando OF è a 1 indica che il risultato segneto è fuori dal range.Se il risultato non è fuori dal range , OF resta a 0.
Per esempio, al completamento dell’esecuzione dell’istruzione di addizione di un byte,il flag di carry(CF) potrebbe essere a 1 per indicare che la somma deglui operandi causa una condizione di riporto.Il flag di riporto ausiliario potrebbe anche essere a 1 all’esecuzione dell’istruzione . Questo dipende se sia o meno necessario una realizzazione del semibyte meno significativo al più significativo quando vengono aggiunti i byte operandi.Il flag di segno (SF) è anche influenzato e ririfletterà il livello logico del bit più significativo(MSB)del risultato.
I flag di stato sono solo letti ,perciò, possono solo essere testati.L’8086 provvede istruzio all’interno del suo set di istruzioni che abilitano l’uso di questi flag per alterare la sequenza nella quele il programma è esequito.Per esempio ZF equivalente alla logica 1 potrebbe essere testato come la condizione che implica un salto su un’altra parte del programma.
Gli altri 3 bit di flag implementati sono i flag di controllo.
Essi sono i flag di direzione(DF),il flag di abilitazione dell’interrupt (IF)e il flag di trappola(TF).Questi 3 flag controllano le funzioni dell’8086 come segue:
1.Il flag di trappola (TF):se TF è a 1,l’8086 lavora nella modalità di singola istruzione.Quando lavora in questo modo esegue un‘istruzione alla volta .Questo tipo di istruzione è moltìo adatta per il debug dei programmi.
2. Il flag di interrupt (IF):Perchè l’8086 riconosca la richiesta di interrupt mascherabile come suo ingresso di interrupt ,il flag IF deve essere ad 1. Quando IF e’ a zero le richieste di interrupt sono eseguite e le interfacce di input mascehrabile sono disabilitate.
3. il flag di direzione (DF): il livello logico di DF determina la direzione nella quale le operazioni di stringhe succederanno. Quando e’ a zero autoindicante la stringa delle istruzioni decrementa l’ indirizzo. Percio’, la stringa dati trasferisce ....... da altro indirizzo a basso indirizzo. Nell’altro caso, impostando DF ad 1, l’indirizzo della stringa viene incrementato. In questo modo, il trasferimento procede da indirizzi bassi ad indirizzi alti.
i BIT cf, df, if E tf DEL REGISTRO DEI FLAG POSSONO ESSERE MODIFICATI in un altro punto del programma attraverso l’uso del software. Cioe’ istruzioni speciali sono stabilite nella serie di istruzioni dell’ 8086 come quelle che possono essere attivate o disattivate. Per esempio, all’ inizio di una routine di gestione interrupt, IF puo’ essere azzerat. Questo richiede l’evento di un altro interrupt mascherabile. Alla fine della routine di servizio, puo’ essere attivato un’altra volta per abilitare gli interrupt mascherabili.
2.8 CLOCK DI SISTEMA
Il tempo base per la sincronizzazione delle operazioni interne ed esterne dell’8086
e’ provvisto di un segnale di ingresso chiamato clock. Attualmente, l’ 8086 e’ disponibile con 2 diverse velocita’. La parte standard opera a 5 Mhz e l’8086-2 opera a 8 Mhz.
Il clock e’ generato esternamente da un generatore di clock 8284 e il driver IC.
La figura 2.13 e’ un diagramma a blocchi di questo dispositivo.
(Milani-Sgarbossa)
32
Il modo normale nel quale questo clock chip è usato è per connettere sia un cristallo 15-MHz che uno 24-MHz tra i suoi X1 e X2 ingressi. Questo circuito connesso è illustrato nella Fig. 2.14. Avviso che una serie di condensatori CL è anche richiesta. Il suo tipico valore quando è usato con il cristallo 15-MHz è 12pF. La frequenza fondamentale del cristallo è divisa in tre dentro l' 8284 per dare sia un segnale di clock a 5-MHz che a 8-MHz. Questo segnale è prodotto e mandato fuori al CLK. Il CLK può essere direttamente connesso dal CLK dell' 8086.
La forma d'onda del CLK è illustrata in Fig. 2.15. Quì noi vediamo che il segnale è compatibile ai livelli di voltaggio MOS e non a quelli TTL. I suoi minimi e massimi bassi livelli logici sono VLmin =-0.5V e VLmax =0.6V, rispettivamente. Inoltre, i minimi e massimi alti livelli logici sono rispettivamente VHmin =3.9V e VHmax =Vcc+1V. Il periodo del segnale del clock a 5-MHz può variare da un minimo di 200ns a un massimo di 500ns, e il massimo sale e riempie il tempo alla sua estremità pari a 10ns.
In Fig. 2.13 noi vediamo che ci sono due ulteriori segnali di clock d'uscita nell' 8284.
Essi sono clock periferici (PCLK) e clock oscillatori (OSC). Questi segnali sono provvisti epr pilotare periferiche ICs. Il segnale clock d' uscita APCL è sempre metà della frequenza di CLK. Esso è sia 2.5 MHz che 4 MHz. Esso è anche compatibile ai livelli TTL piottosto che ai livelli MOS. Dall' altro canto, il OSC d' uscita è alla frequenza fondamental di clock la quale è di tre periodi di clock. Queste relazioni sono illustrate in Fig. 2.16.
L' 8284 può essere anche pilotato da una fonte esterna di clock. Il segnale di clock esterno è applicato dalla frequenza esterna di ingresso (EFI). L'ingresso F/C(segnato) è provvisto per la fonte di selezione di clock. Quando esso è legato al livello di logica 0, il cristallo è usato tra i suoi X1 e X2. D'altro canto applicando la logica 1 all' F/C(segnato) seleziona l' EF1 come fonte del clock. Il segnale di ingresso clock sync (CSYNC) può essere usato per sincronizzazioni esterne nei sistemi che impiegano clock multipli.
Figura 2.14: Connessione del 8284 con l'8086.
Figura 2.15: Voltaggio e sincronizzazione delle caratteristiche di CLK.
Figura 2.16: Relazione tra CLK e PCLK.
2.9 CICLI DI BUS
Il ciclo di bus dell' 8086 è usato per accedere in memoria, I/O dispositivi, oppure per controllare l' interrupt. Come illustrato in Fig. 2.17(a), esso corrisponde alla sequenza di eventi che iniziano con un indirizzo d' uscita nel sistema di bus seguiti da una lettura o scrittura dei dati trasferiti. Durante queste operazioni, una serie di segnali di controllo sono anche prodotti dall' 8086 per controllare la direzione e la sincronizzazione del bus.
Il ciclo del bus del processore 8086 consiste al minimo di quattro periodi di clock.
Questi quattro stati sono chiamati T1, T2, T3 e T4. Durante T1, il BIU trasferisce un indirizzo nel bus. Per un ciclo di scrittura in memoria, i dati sono trasferiti nel bus durante il periodo T2 e sono mantenuti nel T3, e T4. Quando il ciclo di lettura è eseguito, il bus è il primo messo nello stato di alta Z durante T2 e poi i dati devono essere letti e messi nel bus durante T3 e T4. Questi quattro stati di clock danno un ciclo di bus con durata di 125ns X 4 =500ns in 8-MHz nel sistema 8086.
Se non sono richiesti i cicli di bus, il BIU esegue quelli che sono conosciuti come stati di inattività. Durante questi stati non c'è attività del bus. Ciascun stato di inattività è un lungo periodo di clock e ciascun numero di essi può essere inserito tra due cicli di bus. Fig. 2.17(b) mostra i due cicli di bus separati da stati inattivi. Sono anche eseguiti stati inattivi se la coda è piena e l'EU non richiede il BU per leggere o scrivere operandi dalla memoria
Figura 2.17: (a) Periodi di clock del ciclo di bus; (b) Ciclo di bus con stati inattivi; (c) Ciclo di bus con stati di attesa.

(Pellizzato- Anonimo)
1° parte di pag. 34
Gli stati di attesa possono anche essere inseriti in un ciclo di bus.
Questo viene fatto in risposta ad una richiesta di un evento nell'hardware
esterno invece di un'evento interno come una coda piena.
In fatti l'imput READY dell'8086 e previsto specificatamente per questo scopo.
La figura 2.17(c) mostra che lo 0 logico di questo imput indica che
il corrente ciclo di bus non è stato completato.
Per il tempo in cui READY è tenuto a livello 0, gli stati di attesa sono
inseriti fra il periodo T3 e T4 del corrente ciclo di bus e il dato che era
sul bus durante T3 viene mantenuto. Il ciclo di bus non viene completato
finché l'hardware esterno non ritorna indietro READY a livello logico 1.
Questo estende la durata del ciclo di bus, permettendo così una minor
quantità di memoria del sistema.
(Sparisi -pag. 34)
10. SEQUENZA PER L'ESECUZIONE DELLE OPERAZIONI
Durante il normale periodo operativo,l'8086 preleva istruzioni una dopo l'altra dalla memoria programmi e la esegue. Dopo che l'istruzione è stata prelevata, essa deve essere codificata all'interno dell'8086,e se necessario viene prelevato il suo operando in altre memorie dati o dai registri interni. L'operazione specificata dall'istruzione è eseguita sugli operandi e il risultato è riscritto su dei registri interni o in una locazione di memoria dati.L'8086 è adesso pronto per eseguire l'istruzione sucessiva La figura 2.18 mostra in dettaglio il sovrapporsi della fase di prelievo ed esecuzione del 8086. Nota che mentre la EU ste esguemdo la prima precedente istruzione, la BIU preleva gia' la sucessiva sul bus dati di sistema. Dopo questo, una terza istruzione è prelevata dall'uscita della coda. Essa è estratta dalla coda della EU e eseguita. Nello stesso momento,l a BIU usa il bus per scrivere il risulltato della prima istruzione nella memoria.Nell'istante sucessivo,la quarta istruzione è prelevata dalla BIU e messa nella coda. Durante il quinto periodo, un operando richiesto dalla terza istruzione, è letto sul bus. Alla fine la terza istruzione è eseguita e una quinta è prelevata. Nota che durante questo intervallo di tempo 4 nuove istruzioni sono state prelevate e caricate nella coda e tre sono state eseguite. Un programma in linguaggio Assembler e il suo equivalente 8086 codice macchina sono mostrati in figura 2.19(a).Questo programma è un ciclo che si ripete continuamente. Nota che le istruzioni sono codificate usando 1,2,3,4 byte. Per esempio l'istruzione MOV AX,OFO2H è rappresentata con tre byte B8,O2 e F8.Dall'altra parte .PUSH AX occupa un solo file che è 50.
Il programma è memorizzato nel segmento di codice della memoria in byte consecutivi come mostrato in figura 2.19(b).Nota che esso occupa 16 byte indirizzato per contenere l'intero programma.
Ricorda che lo stato della coda e del bus sono dei segnali di autput del massimo-modo 8086.Qs1, Qs0 identificano le istruzioni dello stato della coda inizializzata dalla EU nel colpo di clock precedente.Inoltre,il codice di S2 S1 S0 dice al controllore esterno del bus 8288 che tipo di ciclo è in esecuzione.
(Pellizzato anonimo)
Pag. 35
Anche ricordando che l'interazione tra BIU e EU è in qualche modo di coda
per le istruzioni di prefetch, codice operativo e operandi immediati.
Per gli altri cicli di bus deve esserci la richiesta della BIU per mezzo
della EU per accedere agli operandi in memoria.
La figura 2.19(c) mostra in dettaglio le relazioni tra i segnali, bus attivo
e gli stati di coda interni che sono importanti per capire le sequenze
di istruzione execute dell'8086. Questo diagramma include il periodo di
clock (CLK), il codice degli stati di bus (S2,S1,S0), tipi di cicli di bus
(attività BIU), il contenuto della coda (QUEUE), il codice degli stati della
coda (QS1,QS0) e il ciclo di esecuzione delle istruzioni (EU esecuzione
istruzioni). Noi ora tracciamo le operazioni dell'8086 passo dopo passo
attraverso l'esecuzione di una istruzione del programma in figura 2.19(a).
In questo esempio noi assistiamo ad una istruzione di salto JMP $-14 che è
stata caricata fuori dalla coda per mezzo di EU. Perciò durante i periodi di
clock dal 1° al 7° la EU sta eseguendo queste operazioni. Nel 1° periodo di
clock in Fig. 2.19(c), noi vediamo che la coda è stata inizializzata con
del codice non valido. Perciò durante questo periodo gli stati della coda
QS1,QS2
(Volpato-Simioni)
Pagine 36-37
Š l'uscita. Questo indica che la coda di istruzioni Š vuota. Inoltre, il bus
Š inattivo (TI) per i periodi di clock 1 e 2.
I prossimi quattro tempi di clock, da 3 a 6, rappresentano un ciclo di bus
di prelevamento del codice. Nota che l' attivit… del bus identifica i quattro
periodi di clock da T1 a T4 di un ciclo di lettura. Durante questo ciclo di
bus, B806h Š prelevato da un programma di memorizzazione e caricato dentro la
coda delle istruzioni. Il codice dello stato di ricerca del codice S2S1S0=100
Š l' uscita del 8086 durante i periodi T1 e T2 del ciclo di bus.
I prossimi quattro tempi di clock, da 7 a 10, rappresentano un altro ciclo
di lettura. Questo ciclo corrisponde al prelevamento di F850h ed i suoi posi_
zionamenti nella coda delle istruzioni. Ma allo stesso tempo, l' EU legge il
primo dei due bytes dell' istruzione MOV dalla coda delle istruzioni.
Il primo byte, che Š B8h, Š accompagnato dalla posizione del codice di coda
del primo byte, QS1QS0=01, e il secondo byte, 02h, Š accompagnato dal codice
di stato QS1QS0=11. Ricorda che ci• Š il terzo byte dell' istruzione e l' ul_
timo byte, che Š F8h, che fu appena prelevato dentro la coda delle istruzioni.
Alla fine di questo ciclo di bus di prelevamento della seconda istruzione, noi
troviamo che appena due bytes, F8h e 50h, rimangono nella coda delle istruzio_
ni. Essi rappresentano l' ultimo byte dell' istuzione MOV e l' istruzione PUSH
completa.
Durante i tempi di clock da 11 a 14, ha luogo un altro ciclo di bus di pre_
levamento del codice. Inoltre, durante la prima met… del ciclo di bus, l' EU
rimuove il terzo byte dell' istruzione MOV dalla coda delle istruzioni. Questo
comleta l' esecuzione dell'istruzione MOV AX,0F802h. L' esecuzione delle is_
truzioni rimanenti procedono similarmente.

Esempio