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.
vuoi
o PayPal
tutte le volte che vuoi
Operazioni con la pila
PUSH CPUSH * //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
operandoDIV E // DIVIDE la somma precedente per E senza pushare EPOP 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) + 110001011 +1 =
------------
10001100 //<- complemento a 2 del numero di partenza A
Le operazioni di complemento realizzano esse stesse la loro operazione inversa
compl a 101110011 +
aggiungo 11 =
------------
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)
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
Istruzioni 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 da 16bit
Word : 32bit
Double Word : Doppia word da 64bit
Formati floating point
a singola precisione: 32bit divisi in segno 1, esponente 8
e mantissa 23a 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 allacodifica.
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. È 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 modularità 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. 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 caric