vuoi
o PayPal
tutte le volte che vuoi
MODI DI INDIRIZZAMENTO
Le macchine a registri si suddividono in due categorie:
1. Architettura Load-Store: che consente di fare operazioni di tipo aritmetico logico
solo fra operandi che sono nei registri, quindi non si può fare la somma fra un dato
che è in un registro e un dato che è in memoria, o ancor peggio la somma di
due dati che sono in memoria. Bisogna solo fare operazioni aritmetico logiche
che riguardano due operandi che sono già presenti nei registri. In sostanza si
accederà alla memoria solo attraverso operazioni tipiche della memoria. Quindi
questo tipo di macchina sarà una macchina a registri LOAD-STORE per
significare che la memoria sarà usata solo con istruzioni di tipo LOAD STORE.
Quindi per fare un'operazione aritmetica fra due dati che sono in memoria prima
bisogna eseguire la LOAD di questi due dati , per esempio prendere il primo dato e
inserirlo nel registro R1 , leggere un secondo dato e inserirlo nel registro R2 e solo
ora è possibile fare le operazioni fra R1 ed R2; il risultato andrà in un altro
registro che può anche essere uno dei due che si è appena usato, ma non si
può scrivere il dato in memoria se non attraverso l’operazione di STORE
2. Architettura Registro-Memoria: invece prevede di usare l’ALU per fare calcoli ma
nell’ambito della stessa istruzione anche di accedere a memoria. Questo tipo di
struttura però prevederà un codice operativo che dovrà contenere sia la specifica di
un registro (per l’operando) sia la specifica di un registro del risultato e sia un
indirizzo. Quindi siccome per indirizzare un registro tipicamente bastano pochi
bit, con 32 registri è sufficiente un insieme di 5 bit. Con 5 bit infatti si possono
codificare numeri compresi tra 0 e 31;scrivendo il numero 7 si intende il registro R7.
Per specificare un indirizzo non bastano 5 bit, attraverso 5 bit si indirizza solo
una porzione della memoria. Tipicamente per specificare un indirizzo si
necessitano dipiù bit, almeno che per specificare un indirizzo non si utilizza
un artefatto:scrivere l’indirizzo di memoria in un registro. Quindi nell’istruzione
si andrà solamente a specificare l’indirizzo del registro, che contiene l’indirizzo di
memoria, attraverso i 5 bit
1. Indirizzamento Diretto
C’è un registro che direttamente contiene l'indirizzo dell'area di memoria. Nell'istruzione si
andrà a specificare solamente l’indirizzo del registro che contiene l’indirizzo di memoria a cui
accedere.
2. Indirizzamento con Immediato
È possibile scrivere l’indirizzo direttamente nell'istruzione stessa. Quindi l’istruzione dovrà
contenere oltre anche varie altre informazioni fra cui una di queste è l’indirizzo.
3. Indirizzamento con Spiazzamento (con offset)
L’indirizzo con spiazzamento viene calcolato sommando al contenuto di un registro un
numero (INDIRIZZO BASE) codificato nell'istruzione stessa. Nell'istruzione verrà specificato
quindi un registro per esempio R9 e un immediato(indirizzo base), e l’indirizzo di memoria
verrà calcolato sommando questo indirizzo base che e il contenuto di R9. Ci si può chiedere,
ma non era meglio inserire tutto l’immediato di per sé? Si però se questa istruzione va
eseguita all’interno di un loop e ad ogni ciclo si ha la necessità di accedere a un dato
diverso bisogna avere un indirizzo diverso. Con l’indirizzamento con scostamento l’istruzione
contiene una un immediato e un registro da sommare così che nel loop ogni volta verrà
cambiato il valore dell’immediato.
4. Indirizzamento indiretto
l’indirizzamento che prende il nome di REGISTRO INDIRETTO è un indirizzamento secondo
il quale il registro contiene un indirizzo che non è l’indirizzo del dato di destinazione ma è
ancora un altro indirizzo e quindi si va due volte in memoria.
Tecnologie per la produzione di processori
Un transistor è semplicemente un interruttore acceso/spento, controllato da un
segnale elettrico. Il circuito integrato (IC) ha permesso di inserire da qualche decina a
qualche centinaio di transistor in un singolo frammento di silicio, detto
chip. La produzione di un chip inizia dal silicio, una sostanza che si trova nella sabbia; dato
che il silicio non conduce bene l’elettricità, è detto semiconduttore.
Il processo produttivo dei circuiti integrati è fondamentale per determinare il costo dei chip
ed è quindi di grande importanza per i progettisti di calcolatori. Si inizia con un lingotto di
silicio cristallino, che ha un diametro compreso tra 20 e 30 cm e una lunghezza tra 30 e 60
cm. Il lingotto viene successivamente tagliato in dischi sottili, chiamati wafer, che hanno uno
spessore non superiore a 2,5 mm.
I wafer vengono lavorati nei forni di drogaggio, dove vengono trattati per ottenere le
caratteristiche elettriche necessarie. In seguito, si effettuano simulazioni logico-funzionali per
verificare che il sistema funzioni come richiesto dalle specifiche. Vengono poi eseguite
simulazioni logico-fisiche, che determinano come i componenti logici si posizioneranno
all'interno del chip.
Si crea quindi un diagramma temporale che consente di verificare come, in funzione degli
ingressi, si comportano le uscite. Questo passo è essenziale per determinare la latenza di
ciascun componente e la frequenza massima di funzionamento del sistema.
L'output del processo di simulazione influenza il trattamento dei wafer attraverso il
drogaggio, ottenendo così wafer lavorati che contengono un certo numero di chip di forma
quadrata. L'area di ciascun quadrato dipende dal numero di transistor che il sistema
richiede. Poiché il wafer è di forma circolare, vengono scartati i quadrati che non sono
perfetti.
I wafer contengono anche una certa probabilità di impurità, e quindi alcuni chip potrebbero
risultare non funzionanti. Questo problema viene risolto aumentando la suddivisione dei
wafer e applicando tecniche di ridondanza, ovvero dotando il sistema di un numero di
componenti superiori a quelli effettivamente necessari (come nel caso delle doppie ruote dei
camion). Infine, i chip vengono inseriti nel loro case, saldati sulla scheda e sottoposti a test
per verificarne il corretto funzionamento.
CAPITOLO 5
ISTRUZIONI DEL PROCESSORE MIPS
Il processore di riferimento è il processore MIPS. È sviluppato con filosofia RISC, ha un
numero ridotto di istruzioni ma che hanno tutte una struttura molto simile tra di loro. Inoltre è
un processore di tipo Load Store, le uniche operazioni che possono accedere a memoria
sono le istruzioni LOAD e STORE. Il processore MIPS è costituito da 32 registri interi da 64
bit di utilizzo generale (GPR, general-purpose register), denominati RO, R1,..., R31. Ci sono
inoltre registri per numeri in virgola mobile (FPR, floating-point register), denominati FO,
F1,...,F31. E infine c'è anche un piccolo numero di registri "speciali". I tipi di dati presenti
sono: byte (8 bit), half word (16bit), word (32bit) e double word (64bit). Esistono solo due
modalità di indirizzamento, immediato e con scostamento. Le istruzioni di questo processore
sono di 32 bit e presentano tutte un codice operativo costituito da 6 bit. Le istruzioni sono
fondamentalmente di tre tipi: tipo R, tipo I e tipo J.
Formato R (Register)
Formato I ( Immediate)
Formato J (Jump)
Le operazioni svolte dall’hardware del calcolatore
Istruzioni Aritmetiche
Le istruzioni aritmetiche in MIPS utilizzano l'ALU (Arithmetic Logic Unit) per eseguire calcoli
sui registri.
add $s1, $s2, $s3
● $s1 = $s2 + $s3
○ Significato: $s2 $s3
○ Funzionamento: i registri e contengono valori a 32 bit.La CPU
legge i valori dai registri in seguito l' ALU esegue la somma binaria dei due
$s1.Se si verifica un
operandi e il risultato viene scritto di nuovo nel registro
overflow, viene generata un’eccezione.
sub $s1, $s2, $s3
● $s1 = $s2 - $s3
○ Significato: add,
○ Funzionamento: come per ma l’ALU esegue una sottrazione. $s3
Internamente, la sottrazione si fa sommando il complemento a due di a
$s2.Anche qui, in caso di overflow, si lancia un’eccezione.
addi $s1, $s2, 20
● $s1 = $s2 + 20
○ Significato: 20
○ Funzionamento interno: è un immediato a 16 bit che la CPU estende a
32 bit con estensione del segno. L’ALU somma il valore esteso al contenuto
$s2.Risultato $s1.Anche
di scritto in qui può verificarsi overflow
Istruzioni di Trasferimento Dati
Queste istruzioni servono a spostare dati tra la memoria e i registri. MIPS usa
indirizzamento base + offset per calcolare l'indirizzo effettivo.
lw $s1, 20($s2)
● $s1 = Memoria[$s2 + 20]
○ Significato: $s2. 20 $s2
○ Funzionamento: la CPU legge il contenuto di Somma l'offset a
per ottenere l’indirizzo effettivo. Accede alla memoria e legge 4 byte
$s1. Se l’indirizzo non è
consecutivi (1 parola).Carica i 4 byte nel registro
allineato (multiplo di 4), si genera un bus error.
sw $s1, 20($s2)
● Memoria[$s2 + 20] = $s1
○ Significato: $s1
○ Funzionamento: calcola l’indirizzo come sopra. Prende i 32 bit da e li
scrive in memoria a quell’indirizzo. Anche qui, un indirizzo non allineato
provoca errore.
lh, lhu
● (lettura mezza parola unsigned e non)
lh:
○ carica 16 bit con estensione del segno.
lhu:
○ carica 16 bit con riempimento a zero.
○ Funzionamento :l’indirizzo è calcolato come prima. Si leggono 2 byte dalla
memoria. La differenza sta nell’estensione:
lh:
■ riempie i 16 bit superiori con il bit più significativo (sign
extension).
lhu: 0.
■ riempie i 16 bit superiori con
lb, lbu
● (lettura byte)
lb:
○ carica 8 bit con estensione del segno.
lbu:
○ carica 8 bit con riempimento a zero.
○ Funzionamento : si legge 1 byte dalla memoria. Se serve, i bit rimanenti
sono riempiti come sopra.
ll sc
● (load linked) & (store conditional)
○ Usati per implementare operazioni atomiche:
ll:
■ carica un valore dalla memoria e imposta un bit di lock.
sc:
■ scrive in memoria solo se il bit di lock è ancora attivo (cioè nessun
altro processore ha modificato la memoria).
■ Utile per implementare mutex o spinlock in sistemi multiprocessore.
lui $s1, 20
● $s1 = 20 * 2^16
○ Significato:
○ Funzionamento : carica il valore immediato nei 16 bit superiori del
0.
registro, lasciando i 16 bit inferiori a Usato per caricare numeri grandi o per
preparare indiriz