# Personal computer/Linguaggio Macchina/8086

Personal computer
* Storia dei calcolatoriPersonal computer/Storia
* Architettura del calcolatorePersonal computer/Architettura
** CPUPersonal computer/Architettura/CPU
** MemoriaPersonal computer/Architettura/Memoria
** Input/OutputPersonal computer/Architettura/IO
* Linguaggio MacchinaPersonal computer/Linguaggio Macchina
** DLXPersonal computer/Linguaggio Macchina/DLX
*** Operazioni DLXPersonal computer/Linguaggio Macchina/DLX/Operazioni
*** DLX sequenzialePersonal computer/Linguaggio Macchina/DLX/DLX_sequenziale
*** DLX in pipelinePersonal computer/Linguaggio Macchina/DLX/DLX_pipeline
** 8086-8088Personal computer/Linguaggio Macchina/8086
* Mapping di Memorie ed InterfaccePersonal computer/Mapping
** Integrati NotevoliPersonal computer/Mapping#Caratteristiche_e_funzionamento_degli_integrati_notevoli
*** DriverPersonal computer/Mapping/Driver
*** CPUPersonal computer/Mapping/CPU
*** Memoria PrincipalePersonal computer/Mapping/Memorie
*** Interfacce I/OPersonal computer/Mapping/Interfacce
** Gestione delle interfacce tramite programmaPersonal computer/Mapping#Gestione_delle_interfacce_tramite_programma
* Standard alla base di un personal computerPersonal computer/Standard
* Appendici e RiassuntoPersonal computer/Appendici
Modifica il sommario

# 8086

L'Intel 8086 nasce come un'estensione del 8080, una macchina ad accumulatore. È quindi sostanzialmente un ibrido, perché pur avendo 14 registri, nessuno di questi è ad uso generale in quanto ognuno ha un uso ben specifico.
L'architettura è a 16 bit così come i registri, ma per ottenere un'indirizzabilità maggiore i progettisti hanno aggiunto dei segmenti che estendono lo spazio di indirizzamento a 20 bit.
Fanno parte della stessa famiglia, sono quindi molto simili, i processori 80186, 80286 (indirizzamento a 24 bit), 80386 (indirizzamento e parallelismo a 32 bit), 80486 (poche novità rispetto all'80386 ma con prestazioni notevolmente migliorate).

## Registri e indirizzamento

Un indirizzo a 20 bit si ottiene da un indirizzo effettivo a 16 bit (offset, registro di indirizzo) sommandogli un indirizzo base a 20 bit, con lo scorrimento verso sinistra di quattro posizioni del contenuto di un registro segmento a 16 bit.
I 14 registri dell'8086 sono raggruppabili in 4 categorie: Dato, Indirizzo, Segmento e Controllo.
* Dato: Usati per mantenere dati o per operare su di essi:
** AX Usato per moltiplicazioni, divisioni, I/O o operando implicito.
** BX Può essere un registro per contenere l'indirizzo base.
** CX Usato per le operazioni tra stringhe o istruzioni di ciclo.
** DX Usato per moltiplicazioni, divisioni e I/O.
* Indirizzo: Usati per formare un indirizzo effettivo di memoria a 16 bit (interno al segmento):
** SP Puntatore alla sommità dello stack.
** BP Registro base: usato nell'indirizzamento tramite base.
** SI Registro indice: usato anche come base per l'indirizzo di una stringa.
** DI Registro indice: usato anche come base per l'indirizzo di destinazione di una stringa.
* Segmento: Usati per costruire indirizzi di memoria a 20 bit:
** CS Segmento di codice: è usato per gli accessi alle istruzioni.
** SS Segmento dello stack: è usato per i riferimenti allo stack.
** ES Segmento aggiuntivo: usato per le operazioni destinate a una stringa.
** DS Segmento dati: usato per tutti gli altri casi.
* Controllo: Usati per il controllo dello stato e del programma:
** IP Instruction Pointer: fornisce l'offset dell'istruzione corrente in esecuzione (16 bit meno significativi del PC).
** FLAGS Contiene 6 bit relativi alle condizioni (riporto, zero, segno, prestito, parità e overflow) e 3 bit per il controllo dello stato.
Le istruzioni ALU sono di tipo Memory-Register (2,1) e consentono l'uso di un operando immediato.
Le modalità di indirizzamento sono
* Registro indiretto: BX, SI, DI.
* Base + offset a 8 o 16 bit: BP, BX, SI, DI.
* Indicizzato: l'indirizzo è la somma di due registri BP+SI, BP+DI, BX+SI, BX+DI.
* Indicizzato + offset a 8 o 16 bit: l'indirizzo è la somma dell'offset con il contenuto di due registri.

## Operazioni

Possono essere suddivise in quattro categorie:
* Trasferimento dati, comprendono spostamenti (move), inserimento (push) ed estrazione (pop) di dati dallo stack.
* Istruzioni ALU
* Istruzioni di controllo del flusso, comprendono le diramazioni con e senza condizione, le chiamate e i ritorni dalle chiamate (l'utilizzo dello stack piuttosto che un registro come nel DLX permette il nesting-annidamento delle chiamate a procedura)
* Istruzioni su stringhe, come spostamento e confronto.
Alcune delle istruzioni tipiche sono:
* Trasferimento dati
** MOV Sposta un dato tra due registri o tra un registro e la memoria
** PUSH Metti un operando nello stack
** POP Leggi un operando dallo stack e mettilo in un registro
** LES Carica ES e uno dei GPR dalla memoria
* Istruzioni ALU
** ADD Addizione tra operando sorgente e operando destinazione
** SUB Sottrazione dell'operando sorgente da quello di destinazione
** CMP Confronto tra operando sorgente e destinazione
** SHL,SHR Scorrimento logico rispettivamente a sinistra e a destra
** RCR Rotazione a destra attraverso il riporto
** CBW Conversione di un byte in AL in una parola AX
** TEST And logico tra le configurazione dei flag sorgente e distinazione
** INC,DEC Incremento o decremento dell'operando destinazione
** OR OR logico
** XOR OR esclusivo
* Controllo
** JNZ,JZ Salta se è verificata la condizione IP + 8 bit di offset (in alternativa anche JN e JE)
** JMP,JMPF Salto non condizionato
** CALL,CALLF Chiamata a subroutine, l'indirizzo di ritorno è inserito nello stack
** RET,RETF Leggi dallo stack l'indirizzo di ritorno e salta ad esso
** LOOP Diramazione di ciclio: decrementa CS, se diverso da zero salta a IP + 8 bit di offset.
* Istruzioni su stringhe
** MOVS Copia la stringa sorgente in quella destinazione
** LODS Carica un byte o una parola di stringa nel registro A.
Per le istruzioni di stringa esiste un prefisso di ripetizione, questo significa che l'operazione deve essere ripetuta tante volte quanto indicato dal valore nel registro CX.
Le istruzioni di controllo di flusso devono essere in gradi di gestire sia trasferimenti vicini (all'interno del segmento di memoria indirizzabile con i 16 bit del registro) sia trasferimenti lontani (suffisso F, segmenti che richiedono indirizzi a 20 bit). Nei salti lontani all'OpCode seguono due quantità da 16 bit, una di queste è il puntatore all'istruzione, l'altra è caricata in CS e diventa il nuovo codice di segmento. Un ritorno lontano legge dalla cima dello stack sia il puntatore all'istruzione, sia il codice di segmento.
La codifica delle istruzioni dell'8086 è piuttosto complessa e presenta diversi formati che possono variare a da uno a sei byte. Inoltre molte delle istruzioni contengono un campo da un bit w che specifica se l'operazione è di un byte o di una parola (2 byte). Alcune istruzioni contengono insieme con l'OpCode la modalità di indirizzamento e il registro, altre istruzioni ancora usano un byte aggiuntivo, il postbyte, con le informazioni sulla modalità di indirizzamento (è usato spesso per le istruzioni che indirizzano la memoria)