Calcolatori elettronici/Architettura 8086
Il processore Intel 8086 è caratterizzato da:
- spazio di indirizzamento: la quantità di memoria che è in grado di indirizzare (220 indirizzi da 1 byte = 1 MB);
- parallelismo: le lunghezze di parole con cui i moduli sono in grado di operare (16 bit).
La memoria è suddivisa in due porzioni, definite per dimensioni e posizione: una contiene i dati del programma, l'altra contiene il codice macchina del programma.
Registri
modificaL'instruction set architecture (ISA) è l'insieme delle informazioni pubblicate dal produttore del processore.
Classificazione
modifica- special register: (es. PC, IR) non possono essere acceduti dal programmatore in modo diretto, anche se ad esempio l'istruzione
JMP
accede indirettamente al PC; - user register: (es. AX, DI) possono essere usati dal programmatore in modo esplicito nelle istruzioni.
- registri di dato: (AX, BX, CX, DX) sono 4 registri da 16 bit, ciascuno dei quali è costituito da una coppia di registri da 8 bit (H e L);
- registri indice: (es. DI, BX) oltre a poter contenere i dati, possono essere usati anche per passare un indirizzo (es.
vett[DI]
); - registri contatore (es. CX);
- registri di segmento (CS, DS, SS, ES);
- registri puntatore (es. IP, SP, BP).
Ci possono anche essere dei registri di servizio, che il progettista ha destinato solo all'uso interno.
Status register
modificaLo status register è un modulo da 16 bit, 9 dei quali contengono i flag di condizione e di controllo, che vengono letti continuamente tra un'istruzione e l'altra:
- flag di controllo: definiscono alcune modalità di comportamento del processore (per es. l'IF acceca il processore ai segnali di interrupt);
- flag di condizione: il processore deve poter valutare le condizioni delle istruzioni
if
e saltare allesub
appropriate → a differenza dell'istruzioneJMP
, che è un'istruzione di salto incondizionato che ne scrive l'indirizzo nel PC senza valutare alcuna condizione di istruzioniif
, le istruzioni di salto condizionatoJN<nome_flag>
decidono se scrivere o no l'indirizzo nel PC a seconda di certi flag di condizione<nome_flag>F
, che accompagnano l'uscita della ALU al termine di un'operazione.
Accesso alla memoria
modificaIl BHE è un segnale di enable che, nel caso di indirizzi di memoria pari, specifica se la memoria deve restituire una coppia di byte, cioè la word intera (BHE = 0), oppure un singolo byte (BHE = 1):
A0 (bit meno significativo) | BHE | Byte restituiti |
---|---|---|
0 (pari) | 0 | 2 |
1 | 1 | |
1 (dispari) | 0 | 1 |
1 | don't care |
Un numero su 2 byte viene memorizzato in memoria con la rappresentazione little endian, ovvero il byte meno significativo precede quello più significativo.
Alcune parti della memoria predefinite sono riservate per esempio al bootstrap (Reset Bootstrap) e alla gestione degli interrupt (Interrupt Vector Table).
Ogni istruzione in codice macchina richiede da 1 a 6 byte, e comprende il codice operativo che identifica il tipo di operazione, e per ogni operando alcuni bit per identificarne il tipo (es. registro dati) e altri per il suo indirizzo.
Indirizzi di memoria
modificaIl processore raggiunge ogni cella di memoria tramite un indirizzo fisico su 20 bit, che è la somma binaria di due sotto-indirizzi: il segment address e l'effective address. Questo meccanismo impedisce che un programma esca dai segmenti di memoria ad esso riservati, anche se le operazioni sugli indirizzi richiedono un certo tempo.
Segment address
modificaIl segment address è l'indirizzo di partenza del segmento che contiene la cella di memoria.
La memoria dell'8086, di dimensioni totali pari a 220 byte, è suddivisa in paragrafi da 16 byte → i 4 bit meno significativi dell'indirizzo di partenza di ogni paragrafo risultano sempre uguali a 0 → bastano 16 bit per identificare un paragrafo. Siccome la posizione iniziale di un paragrafo coincide anche con la posizione iniziale di un segmento da 64 KB = 216 byte, il segment address ha una lunghezza pari a 16 bit anziché 20 bit.
I primi 16 bit dei segment address, tipicamente relativi ai segmenti di memoria codice (CS), dati (DS) e stack (SS), sono memorizzati nei registri di segmento. L'ES è usato per i segmenti di memoria maggiori di 64 KB.
Effective address
modificaL'effective address è l'offset della cella di memoria rispetto all'indirizzo di partenza del segmento.
L'effective address richiede 16 bit perché ogni segmento ha dimensione pari a 64 KB.
I registri puntatore IP, SP e BP memorizzano gli effective address correnti, da sommare agli opportuni segment address. Anche i registri indice SI e DI possono essere usati come registri puntatore.
Segmento di stack
modificaNella memoria, a ogni programma è assegnato, oltre ai segmenti dati e codice, un terzo segmento di memoria detto stack, che implementa una coda LIFO. Nello stack, il processore non opera direttamente sugli indirizzi di memoria, ma compie solo delle operazioni di push (inserimento) e pop (estrazione).
Il registro Stack Segment (SS) contiene il segment address, cioè l'indirizzo della testa dello stack. Lo stack si riempie a partire dalla coda verso la testa. Lo Stack Pointer (SP) è uno special register, invisibile al programmatore, che memorizza l'effective address, cioè l'indirizzo della prima cella correntemente libera dello stack; viene decrementato e incrementato di 2 byte rispettivamente dalle operazioni di push e pop. Il processore non si accorge se lo stack è vuoto → esiste il rischio di eccesso di operazioni di pop.