✅
Lezione 08/10/2021
Classificazione processori
Set di istruzioni
Classificazione processori
I processori possono essere classificati in base a:
set di istruzioni;
tipologia di struttura dati interna;
accesso ai dati;
tipo di dati elaborati.
Set di istruzioni
Un processore può essere di due tipi:
CISC: Complex Instruction Set Computer.
RISC: Reduced Instruction Set Computer.
La differenza principale sta nelle modalità di accesso alla memoria centrale. In una macchina
RISC gli accessi in memoria avvengono solo con operazioni di LOAD (carica dalla memoria
al processore) e STORE (immagazzina dal processore alla memoria).
Esempio: somma di i1 e i2. Nel caso di un processore con set di istruzioni CISC, il tutto può
essere effettuato in un'unica istruzione
ADD i1 i2 i3 (M[i1] + M[i2] + M[i3])
Lezione 08/10/2021 1
Nel caso di un processore RISC:
LOAD i1 x (M[i1] -> x)
LOAD i2 y (M[i2] -> y)
ADD x y x (sovrascrive x) oppure ADD x y z (x + y -> z)
STORE x i3 (x -> M[i3]) oppure STORE z i3 (z -> M[i3])
Le istruzione possono essere strutturate secondo due logiche differenti:
lunghezza costante: ogni istruzione ha la stessa lunghezza; questo semplifica la fase di
fetch dell'istruzione in quanto il numero dei bit che devono essere copiati dalla memoria
è sempre uguale (il program counter viene incrementato di una quantità costante);
lunghezza variabile: le istruzioni hanno lunghezza differente; il fetch risulta essere più
complesso; una volta determinata la banda di memoria (massimo numero di bit
prelevabili in una volta) è possibile definire il numero di fetch da effettuare facendo
riferimento al codice operativo dell'istruzione che, tramite il firmware, permette di
risalire al numero di byte da caricare.
Lezione 08/10/2021 2
✅
Lezione 14/10/2021
Classificazione processori (cont.)
Tipo di struttura dati interna
Architettura ad accumulatore
Architettura a registri
Architettura a pila (stack)
Notazione polacca
Accesso ai dati
Indirizzamento immediato
Indirizzamento diretto o indicizzato
Indirizzamento con spiazzamento
Indirizzamento indiretto
Altre modalità
Classificazione processori (cont.)
Le istruzioni sono costituite come una sequenza di bit: i primi sono dedicati al codice operativo e vengono decisi in
fase di progettazione del processore. Ad esempio, con 6 bit dedicati per le operazioni si possono memorizzare, e
6
2
quindi eseguire, operazioni. Questo meccanismo è utile perché permette di eseguire più di una operazione (per 30
5
2 = 32
operazioni, ad esempio, ho bisogno di quindi 5 bit con scarto di 2 operazioni eventualmente
implementabili in futuro).
Nel caso di macchina CISC gli altri bit a disposizione sono utilizzati in maniera eterogenea, mentre in una macchina
RISC i bit sono utilizzati in maniera più eterogenea in quanto è possibile effettuare un solo accesso in memoria per
istruzione. 2 k
Identificazione byte in memoria: byte possono essere indirizzati da bit e ciascun byte può essere identificato da
k
un indice (i-esimo byte)
ℹ REGISTRO: struttura HW del processore in cui vengono memorizzati i dati in determinate celle (fisso
un numero di registri, ad esempio 32 o 64, per cui ho bisogno 5 o 6 bit per localizzare il dato all'interno
di essi).
Posso applicare delle convenzioni per utilizzare gli operandi ad esempio: R1 e R31 sono registri di input e R27 è il
registro in cui memorizzare il risultato dell'operazione che utilizza R1 e R31 come operandi.
Tipo di struttura dati interna
Lezione 14/10/2021 1
Architettura ad accumulatore
Rappresenta la struttura più semplice, che prevede la presenza di un'unica unità di memorizzazione all'interno del
processore interessate per le operazioni di input e quelle di output. Ad esempio, nel caso di una ADD, un solo
operando che deve essere preso dalla memoria (per questo non è una macchina RISC). Un altro vantaggio
conseguente dall'utilizzo di una sola struttura di memorizzazione, è quello della semplicità nella gestione dell'ALU.
L'indirizzo dell'operando è l'unico indirizzo contenuto nella sequenza di bit che identificano l'istruzione ed è grazie a
questo indirizzo che la LMD riesce a prelevare l'operando dalla memoria. Un selettore decide se utilizzare il nuovo
valore dell'accumulatore oppure il valore dalla LMD.
Lezione 14/10/2021 2
ℹ LMD (Load Memory Data): registro specifico nel processore, connesso alla porta dati in uscita della
memoria e in ingresso all'ALU e all'accumulatore.
Gli svantaggi di questa architettura derivano dalla necessità di trasferire il dato di interesse nell'accumulatore e
salvare il dato attualmente presente nell'accumulatore in memoria.
Architettura a registri
Un architettura di questo tipo presenta nel processore locazioni di memoria (registri) da cui è possibile accedere ai
n
dati richiesti, ed è possibile memorizzare il risultato delle operazioni. E' la migliore architettura da un punto di vista
prestazionale, ma è la più complicata (e costosa) da realizzare.
Dai registri i dati vengono portati nell'ALU tramite dei selettori, e il risultato dell'operazione viene poi trasferito in
un registro tramite un derivatore.
Architettura a pila (stack)
Lo stack è un'area di memoria con una certa dimensione (prevede quindi il caricamento di un certo numero di dati):
con accesso di tipo LIFO (Last In First Out) che permette di prelevare solo l'ultimo dato inserito in modo inverso
rispetto all'ordine in cui vengono inseriti.
Il vantaggio è quello di non dover specificare gli operandi, ma solo l'operazione da eseguire, dato che gli operandi
vengono prelevati dalla pila nell'unico modo possibile, ovvero LIFO. Analogamente l'output verrà memorizzato
sempre secondo il meccanismo di inserimento in pila.
Questa struttura quindi permette la memorizzazione multipla di dati ma è limitata dal punto di vista di utilizzo degli
stessi. Esistono algoritmi che sfruttano la notazione polacca (codifica dell'espressione quindi sia operazione che
operandi vengono memorizzati in una pila trattati in modo LIFO fino all'utilizzo degli operandi necessari) per
superare questo limite.
Notazione polacca
Lezione 14/10/2021 3
Esiste in modo diretto o in modo inverso (RPN Reverse Polish Notation) (Ogni lettera utilizzata negli esempi indica
un indirizzo/registro).
Esempio 1
Z = A + (B * C) -> A B C * + //<- STACK
PUSH A
PUSH B
PUSH C
PUSH * //PRODOTTO TRA GLI ULTIMI INSERITI OVVERO B e C
PUSH + //SOMMA TRA GLI ULTIMI OPERANDI OVVERO A e B*C
POP Z //ESTRAE L'ULTIMO DATO INSERITO OVVERO LA SOMMA PRECEDENTE CONSIDERANDO UNA VARIABILE DI MEMORIZZAZIONE Z
Ogni risultato viene memorizzato alla fine della pila ma l'estrazione/accesso utilizza questi ultimi elementi.
Esempio 2
Z=((A * B )+ (C - D)) / E -> A B * C D - + E //<- STACK
PUSH A
PUSH B
MULT //MOLTIPLICA A e B (ultimi inseriti) lo memorizzo come X
PUSH C
PUSH D
SUB //SOTTRAE C e D (ultimi inseriti) lo memorizzo come Y
//STACK: X,Y
ADD //SOMMA X e Y e lo memorizza in T
PUSH E
DIV //DIVIDE T e E e lo salva come Z
POP Z //ESTRAE IL RISULTATO FINALE
Una rappresentazione alternativa o ibrida può consistere nello specificare il secondo operando omettendo il primo
dato che viene prelevato dalla pila.
Esempio 3
PUSH A
MULT B //MOLTIPLICA A e B senza pushare B
PUSH C
SUB D //SOTTRAE C e D senza pushare D
ADD -- // codice operativo diverso dato che non utilizza un operando
DIV E // DIVIDE la somma precedente per E senza pushare E
POP Z
Il codice operativo di un'operazione può variare in base al numero di operandi utilizzati.
Una macchina CISC deve necessariamente avere lunghezza variabile perchè posso utilizzare un numero variabile di
operandi. Ogni istruzione ha delle sotto-operazioni elementari o fasi che compongono il ciclo di istruzione.
Per le istruzioni a lunghezza costante il fetch è più semplice perchè preleva l'istruzione considerando un set di bit
costante e lo carica nell'instruction register.
A lunghezza variabile invece è più complesso perchè il set di bit non è omogeneo. La fase di fetch viene gestita
ponendo delle condizioni: viene definito un range di bit in cui le istruzioni possono essere memorizzate (es. 32-64).
In fase di fetch quindi prelevo dal Program Counter un determinato set di bit (es. 32) e devo valutare se ho prelevato
l'intera istruzione oppure no. L'obiettivo è prelevare in ogni caso il codice operativo in modo da determinare la
tipologia dell'istruzione da eseguire, in ogni caso poi completo di volta in volta il fetch delle altre parti
dell'istruzione (caricate di volta volta nell'IR) fino a quando non ho completato il caricamento di tutta l'istruzione.
Lezione 14/10/2021 4
Accesso ai dati
Indirizzamento immediato
L'indirizzo è fornito come un numero nell'istruzione ma richiede spazio sufficiente per memorizzarne il valore. Per
ridurre lo spazio richiesto per memorizzare l'indirizzo il numero immediato consiste in uno spiazzamento quindi un
indirizzo può essere compresso in un numero inferiore di bit associato ad una base specifica già presente nei registri.
M[n] // accesso in memoria con n numero dell'indirizzo
Indirizzamento diretto o indicizzato
L'indirizzo è scritto in un registro identificato da un numero. Per accedere all'area di memoria identificata da
quell'indirizzo si utilizza direttamente il numero del registro.
M[R1] // Accesso in memoria con R1 contenente l'indirizzo di memoria
Indirizzamento con spiazzamento
Specifico nell'istruzione un numero che si somma al valore contenuto nel registro specificato. In questo modo
suddivido la composizione dell'indirizzo totale in più locazioni.
M[R1+n] //Sommo il numero n al valore contenuto nel registro base
⚠ Questa metodologia è utile, per esempio, per effettuare l' accesso ad un vettore perchè il registro che
contiene l'inizio del vettore dovrà semplicemente modificare iterativamente lo spiazzamento. Tuttavia,
questo meccanismo non è applicabile all'immediato perchè quello è un indirizzo fisso non iterabile.
Indirizzamento indiretto
Ogni indirizzo di memoria si riferisce ad un altro indirizzo che potrà contenere un valore oppure ricorsivamente un
altro indirizzo
M[M[...] //Accesso in memoria multiplo
Altre modalità
ESEMPIO: indirizzo può essere dato dalla somma di due registri
M[R1+R2] /* L'indirizzo a cui accedere è dato dalla somma
dei valori contenuti in R1 ed R2 */
Le modalità vengono distinte tramite codice operativo associato all'operazione che quindi dovrà utilizzare la
modalità d'accesso corrispondente al codice attraverso le modalità previste dal determinato indirizzamento (lo
svantaggio è che i codici operativi sono molti). L'uso di tanto codici operativi non è vantaggioso per cui è possibile
utilizzare una sola modalità, ovvero quella a spiazzamento: codice operativo + bit del registro + bit spiazzamento;
Lezione 14/10/2021 5
impostando a 0 il bit del registro oppure o i bit di spiazzamento è possibile ricondursi alle altre due modalità di
indirizzamento.
Lezione 14/10/2021 6
✅
Lezione 15/10/2021
Complemento a 2
Numeri Floating Point
Complemento a 2
Es. A = 01110100
Scrivo l'opposto del numero di bit (complemento ad 1 di A)
Complemento a 2 = 10001011 (c. a 1) + 1
10001011 +
1 =
------------
10001100 //<- complemento a 2 del numero di partenza A
Le operazioni di complemento realizzano esse stesse la loro operazione inversa
//compl a 1
01110011 +
//aggiungo 1
1 =
------------
01110100 // applicando il compl a 2 al numero ricavato ritorno al numero binario A
A = 116 in decimale
A(compl a 2) = 10001100 = -116 in decimale compl a 2 = 140 in binario puro
Se considero il primo bit come bit di segno, considerando un byte:
Unsigned char: 0 - 255 (binario puro)
Char: (-128) - 127 (complemento a due)
L'esempio visto è l'applicazione su numeri binari interi
Numeri Floating Point
Lezione 15/10/2021 1
Singola Precisione (32 bit)
1 = segno
8 = esponente
23 = mantissa
Doppia Precisione (64 bit)
1 = segno
11 = esponente
52 = mantissa
Per effettuare operazioni in floating point deve esistere una ALU specifica analogamente ad
una ALU dedicata per operazioni con numeri binari interi
Una ALU per soli numeri interi tratta il problema in floating point utilizzando unicamente
numeri interi in modo da poi ricomporre il floating point risultato (tutto questo avviene
attraverso una subroutine specifica che però richiede più istruzioni per raggiungere il
risultato)
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b740747b-db90-4488-
9d1e-77ab2621690b/Guida_conversione_IEEE-754.docx
Lezione 15/10/2021 2
✅
Lezione 21/10/2021
Formati dei dati gestiti dal processore
Formati interi
Formati floating point
Instruzioni gestite dal processore MIPS
Trasferimento dei dati
Operazioni logico-aritmetiche
Tipologie di istruzioni
Istruzioni di tipo R
Istruzioni di tipo I
Formati dei dati gestiti dal processore
Formati interi
Byte [0, 255]
unsigned: 8 bit puro [−128, +127]
signed: 8bit di cui 1 di segno
Half : Metà word da16bit
Word : 32bit
Double Word : Doppia word da 64bit
Formati floating point
a singola precisione: 32bit divisi in segno 1, esponente 8 e mantissa 23
a doppia precisione: 64bit divisi in segno 1, esponente 11 e mantissa 52
Instruzioni gestite dal processore MIPS
Il processore preleva dalla memoria l'istruzione che verrà subito eseguita in base alla
codifica.
Lezione 21/10/2021 1
Esistono due tipologie di istruzioni per le operazioni con interi e in virgola mobile perchè sia
l'hardware che i dati sono diversi.
GPR = General Purpose Register
S = STORE
L = LOAD
B = BYTE
H = HALF
W = WORD
D = DOUBLE
U = UNSIGNED
I = IMMEDIATE
Trasferimento dei dati
Operazioni che trasferiscono i dati tra registri e memoria oppure tra strutture interne (registri
particolari) del processore. E' l'unica categoria di istruzioni che possono accedere in memoria
secondo filosofia RISC e modalità spiazzamento a 16 bit.
Solo i tipi DOUBLE non hanno una modalità UNSIGNED perchè questo tipo di dato utilizza
tutti i 64bit di cui è formato.
Dato che per eseguire le operazioni aritmetiche ho bisogno di troppo hardware perchè ogni
tipo di dato dovrebbe avere una sua ALU dedicata, l'obiettivo è quello di compattare
l'hardware implementato utilizzandone uno solo e ottimizzandolo. Conviene utilizzare moduli
aritmetico-logici per valori a 64bit in modo da rendere possibili le operazioni con questi
valori ma i dati di valore inferiore verranno riempiti in modo da risultare comunque da 64bit.
Lezione 21/10/2021 2
Il riempimento avviene con 0 per i bit più significativi oppure viene utilizzato il bit più
significativo come bit di segno.
Operazioni logico-aritmetiche
La propagazione di un Carry (riporto) può portare ad un overflow
ℹ Parola di Stato: è un registro che codifica eventuali problematiche/eccezioni che
si verificano durante le operazioni
MADD //moltiplica e aggiungi
X += Z * Y /* <=> */ X = X + Z * Y
SLT/SLTI //confronta due valori o un valore e un immediato e se il primo
//è minore del successivo allora imposta 1 al registro iniziale
//altrimenti imposta 0
SLT R1 R2 R3
SLTI R1 R2 100
Tipologie di istruzioni
Istruzioni di tipo R
Sono istruzioni che rientrano nella categoria delle istruzioni logico-aritmetiche perchè
richiedono 3 operandi ovvero due sorgenti e una destinazione
COMPOSIZIONE DI UN'ISTRUZIONE DI TIPO R
CO(6bit) + RD(5bit) + RS1(5bit) + RS2(5bit) + EXT(11bit)
/*
Lezione 21/10/2021 3
CO: Codice Operativo
RD: Registro Destinazione
RS: Registro Sorgente
EXT: Estensione */
Istruzioni di tipo I
Nelle istruzioni di tipo I un operando è codificato all'interno dell'istruzione come termine
noto (solo uno dei due operandi può essere noto) quindi non verrà prelevato dalla memoria.
COMPOSIZIONE DI UN'ISTRUZIONE DI TIPO I
CO(6bit) + RD(5bit) + RS1(5bit) + EXT(16bit)
/* CO: Codice Operativo
RD: Registro Destinazione
RS: Registro Sorgente
EXT: Estensione */
Il termine noto viene codificato nella parte 'Estensione' della composizione dell'istruzione
Esempio:
Y = 4 + Z
/* Il codice operativo utilizzato è un'operazione immediata
Il valor del secondo registro non esiste ma la sezione 'Estensione'
viene estesa a 16 per memorizzare il valore immediato che è codificato
nell'istruzione stessa */
R3 <- M[M[R6+28]] //Load Indiretta
//equivale a
LX R3 R6 (28) //ind. immediati
LX R3 R3 (0)
Lezione 21/10/2021 4
✅
Lezione 22/10/2021
Istruzioni di tipo J: BRANCH e JUMP
Istruzioni di Controllo
Istruzione LUI (Load Upper Immediate): Viene caricato un immediato da 16 bit nella parte
alta di un registro da 64 bit (dal bit 31 al 47) che viene espanso in segno. Dal bit 30 in giù i bit
sono posti a 0.
Istruzioni di tipo J: BRANCH e JUMP
La sequenzialità di esecuzione delle istruzioni non è efficiente al fine di ottimizzare
l'algoritmo in se dato che non è detto che le istruzioni vengano eseguite puramente in modo
sequenziale (a causa di cicli o costrutti condizionali)
In assembler vengono gestite le istruzioni di salto ovvero istruzioni che indicano la prossima
esecuzione di una specifica istruzione (eventualment
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Appunti Calcolatori Elettronici
-
Appunti lezione Calcolatori elettronici
-
Appunti lezione Calcolatori elettronici
-
Appunti Calcolatori elettronici - parziale