# Calcolatori elettronici/Architettura 8086

Calcolatori elettronici
Copertina Tutti i moduli · Sviluppo
    CopertinaCalcolatori elettronici/Copertina
* L'evoluzione dei sistemi di elaborazioneCalcolatori elettronici/L'evoluzione dei sistemi di elaborazione
* Il progetto di circuiti logiciCalcolatori elettronici/Il progetto di circuiti logici
* I processoriCalcolatori elettronici/I processori
* Architettura 8086Calcolatori elettronici/Architettura 8086
* Unità di controlloCalcolatori elettronici/Unità di controllo
* Introduzione alle memorieCalcolatori elettronici/Introduzione alle memorie
* Le memorie ad accesso casualeCalcolatori elettronici/Le memorie ad accesso casuale
* Le memorie cacheCalcolatori elettronici/Le memorie cache
* Le memorie ad accesso serialeCalcolatori elettronici/Le memorie ad accesso seriale
* La memoria virtualeCalcolatori elettronici/La memoria virtuale
* La gestione dei dispositivi input/outputCalcolatori elettronici/La gestione dei dispositivi input/output
* Intel 8255Calcolatori elettronici/Intel 8255
* Intel 8259Calcolatori elettronici/Intel 8259
* I busCalcolatori elettronici/I bus
* Le architetture a pipelineCalcolatori elettronici/Le architetture a pipeline
* Assembler 8086
          IntroduzioneCalcolatori elettronici/Introduzione
   * Informazioni generaliCalcolatori elettronici/Informazioni generali
   * Istruzioni di trasferimento datiCalcolatori elettronici/Istruzioni di trasferimento dati
   * Istruzioni aritmeticheCalcolatori elettronici/Istruzioni aritmetiche
   * Istruzioni per il controllo del flussoCalcolatori elettronici/Istruzioni per il controllo del flusso
   * Istruzioni per la manipolazione dei bitCalcolatori elettronici/Istruzioni per la manipolazione dei bit
   * Le procedureCalcolatori elettronici/Le procedure
   * Istruzioni per il controllo del processoreCalcolatori elettronici/Istruzioni per il controllo del processore
   * Formato delle istruzioni macchina, tempi di esecuzioneCalcolatori elettronici/Formato delle istruzioni macchina, tempi di esecuzione
Modifica il sommario
Il processore Intel 8086 è caratterizzato da:
* spazio di indirizzamento: la quantità di memoria che è in grado di indirizzare (2$^{20}$ 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

L'instruction set architecture (ISA) è l'insieme delle informazioni pubblicate dal produttore del processore.

### Classificazione

* 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

Lo 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 alle sub appropriate → a differenza dell'istruzione JMP, che è un'istruzione di salto incondizionato che ne scrive l'indirizzo nel PC senza valutare alcuna condizione di istruzioni if, le istruzioni di salto condizionato JN<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

Il 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):
| A$_0$ (bit meno significativo) | BHE | Byte restituiti |
| 0 (pari) | 0 | 2 |
| 0 (pari) | 1 | 1 |
| 1 (dispari) | 0 | 1 |
| 1 (dispari) | 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

Il 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

Il segment address è l'indirizzo di partenza del segmento che contiene la cella di memoria.
La memoria dell'8086, di dimensioni totali pari a 2$^{20}$ 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 = 2$^{16}$ 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

L'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

Nella 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.