solo ad alto livello
componenti:
strutturati secondo il modello di Von Neumann
modello di Von Neumann:
l'alternativa era il modello di Harvard:
I/O <--> uc <--> mem dati
^
|
V
mem prog
bus
---------------
^ ^ ^
| | |
V V V
mem uc i/o
una linea unica connette i vari dispositivi
ci passano i dati in uc→mem
ma anche in i/o→uc, ecc.
sono la parte più visibile:
ma anche:
la connessione spesso è bidirezionale anche se non sembra
(es, sulla tastiera ci sono i led)
+-------+
0 | 192 |
+-------+
1 | 0 |
+-------+
2 | 4032 |
+-------+
3 | 10921 |
+-------+
.. | ... |
+-------+
0 | 192 |
+-------+
1 | 0 |
+-------+
indirizzo ---> 2 | 4032<--- contenuto, valore 4032
+-------+
3 | 921 |
+-------+
... | ... |
il contenuto della locazione di indirizzo 2 è il valore 4032
+----------+ +----------+
| | | |
| | | |
| | indirizzo (numero) | |
| | rw (booleano) | |
| | valore (numero) | |
| UC |<---------------------->| MEM |
| | | |
| | | |
| | | |
| | | |
| | | |
+----------+ +----------+
+----------+ indirizzo (numero) +----------+
| |----------------------->| |
| |----------------------->| |
| |----------------------->| |
| | | |
| | rw (booleano) | |
| UC |----------------------->| MEM |
| | | |
| | valore (numero) | |
| |<---------------------->| |
| |<---------------------->| |
| |<---------------------->| |
+----------+ +----------+
i numeri (indirizzo e valore) sono rappresentati in binario
sono più bit ognuno
+-------+
0 | 192 |
+-------+
1 | 0 |
+-------+
2 | 4032 |
+-------+
3 | 10921 |
+-------+
.. | ... |
esempio:
l'unità centrale richiede il contenuto della cella numero
2
+-------+
0 | 192 |
+-------+
1 | 0 |
+-------+
2 | 4032 |
+-------+
3 | 10921 |
+-------+
.. | ... |
leggere (non scrivere) l'indirizzo 2
leggere = rw vale true
indirizzo = 2
l'unità centrale invia 2 e true
+----------+ 2 indirizzo +----------+
| |----------------------->| |
| |----------------------->| |
| |----------------------->| |
| | | |
| | true rw | |
| UC |----------------------->| MEM |
| | | |
| | valore | |
| |<---------------------->| |
| |<---------------------->| |
| |<---------------------->| |
+----------+ +----------+
+-------+
0 | 192 |
+-------+
1 | 0 |
+-------+
2 | 4032 |
+-------+
3 | 10921 |
+-------+
.. | ... |
il valore della cella è 4032
la memoria invia il valore 4032
+----------+ 2 indirizzo +----------+
| |----------------------->| |
| |----------------------->| |
| |----------------------->| |
| | | |
| | true rw | |
| UC |----------------------->| MEM |
| | | |
| | valore <-- 4032 | |
| |<---------------------->| |
| |<---------------------->| |
| |<---------------------->| |
+----------+ +----------+
+-------+ +-------+
0 | *192*| *0* | *34*|
+-------+ +-------+
1 | 0 | 1 | 0 |
+-------+ +-------+
2 | 4032 | ---> 2 | 4032 |
+-------+ +-------+
3 | 921 | 3 | 921 |
+-------+ +-------+
... | ... | ... | ... |
esempio:
l'unità centrale richiede che sia scritto 32 nella cella
0
+-------+ +-------+
0 | 192 | 0 | 32 |
+-------+ +-------+
1 | 0 | 1 | 0 |
+-------+ +-------+
2 | 4032 | ---> 2 | 4032 |
+-------+ +-------+
3 | 921 | 3 | 921 |
+-------+ +-------+
... | ... | ... | ... |
scrivere, non leggere = rw vale false
l'unità centrale invia i valori 0, false e 32
+----------+ 2 indirizzo +----------+
| |----------------------->| |
| |----------------------->| |
| |----------------------->| |
| | | |
| | true rw | |
| UC |----------------------->| MEM |
| | | |
| | 32 --> valore | |
| |<---------------------->| |
| |<---------------------->| |
| |<---------------------->| |
+----------+ +----------+
UC
+------------------------+
| +---+ +---+ |
| |ALU| ----> |REG| ---->|-----> indirizzo
| | | <---- | | <--->|<----> dato
| +---+ +---+ |
| ^ ^ |
| | | |
| +-----------+ |
| | controllo | ------>|-----> RW
| +-----------+ |
+------------------------+
registri
il programma
nell'architettura di Von Neumann, si trova in memoria
è rappresentato da una sequenza di numeri
vengono letti uno per volta
esecuzione del programma
... | ... |
+-------+
132 | 1921 |
+-------+
133 | 992 |
+-------+
134 | 10063 |
+-------+
135 | 56 |
+-------+
... | ... |
la sequenza 1921 - 992 - 10063 - 56 sono quattro istruzioni
l'unità centrale legge 1921 e la esegue
poi legge 992 e la esegue
poi legge 10063 e la esegue
poi legge 56 e la esegue
ciclo di esecuzione di un programma
... | ... |
+-------+
132 | 1921 |
+-------+
133 | 992 |
+-------+
134 | 10063 |
+-------+
135 | 56 |
+-------+
... | ... |
PC=132 IR=... lettura da memoria della locazione 132 incremento PC PC=133 IR=1921 controllo esegue l'istruzione 1921 lettura da memoria della locazione 133 incremento PC PC=134 IR=992 controllo esegue l'istruzione 992 ...
fasi dell'esecuzione di un'istruzione
fetch
dal punto di vista della memoria è una normale lettura:
PC → MEM 1 → MEM MEM → IR
dal punto di vista del processore, l'unica differenza è che il valore letto va in IR invece che in uno dei registri generali
decode
sulla base di quello che c'è in IR, il controllo decide cosa fare
execute
il controllo sa quali passi effettuare
es: i valori di due registri vanno ad ALU, che li somma, e il risultato va in un terzo registro
se l'istruzione è una lettura da memoria, allora verrà fatta una seconda lettura
tipi di istruzioni
quelle di controllo non sono semplici come in Python
istruzioni di controllo
di norma, dopo una istruzione si esegue la successiva
es. dopo l'istruzione alla locazione 134 si esegue quella alla locazione 135
esistono solo due tipi di istruzioni per alterare quest'ordine:
entrambi scrivono un valore in PC
salti incondizionati
esempio: salta a indirizzo 291
si esegue mettendo 291 in PC
al prossimo fetch, l'istruzione che verrà eseguita non è quella che si trova all'indirizzo 134 ma quella che si trova all'indirizzo 153
poi prosegue come al solito con l'istruzione all'indirizzo 292, 293 ecc.
salti condizionati
simili, ma il salto si esegue solo in certi casi:
linguaggio macchina
l'unità centrale è in grado di eseguire solo istruzioni molto semplici
un'istruzione Python richiede in genere più istruzioni macchina per venire eseguita
ECAR
esempio di processore semplice, non esiste nella realtà
quattro registri R1, R2, R3, R4
istruzioni molto semplici:
HALT LOAD X IND LOADC X VALORE STORE X IND ADD X,Y,Z SUB X,Y,Z MULT X,Y,Z DIVIDE X,Y,Z SQRT X,Y READ IND WRITE IND JUMP IND JUMPIFZERO X, IND JUMPIFNEG X, IND
X, Y e Z sono registri
LOAD e LOADC
cambia il metodo di indirizzamento
esempio di programma
READ 1000 READ 1001 READ 1002 LOAD R1 1000 LOAD R2 1001 LOAD R3 1002 ADD R1,R2,R4 ADD R4,R3,R4 STORE R4 1003 WRITE 1003 HALT
somma i contenuti delle locazioni 1000, 1001 e 1002 e scrive il risultato nella locazione 1003
equivalente in Python: d=a+b+c
traduzione in linguaggio macchina
scrivere direttamente in linguaggio macchina è:
di norma si usano linguaggi ad alto livello come Python, Java, C, PHP, ecc.
vengono poi tradotti in modo automatico in linguaggio macchina
soluzioni equazione di secondo grado
se i coefficienti sono alle locazioni 100, 101 e 102:
LOAD R1 100 LOAD R2 101 LOAD R3 102 LOADC R4 4 MULT R2 R2 R2 MULT R4 R1 R4 MULT R4 R3 R4 SUB R2 R4 R4 JUMPIFNEG R4 1023 SQRT R4 R4 LOADC R2 0 LOAD R3 101 SUB R2 R3 R2 LOADC R3 2 MULT R3 R1 R1 ADD R2 R4 R3 DIV R3 R1 R3 STORE R4 103 SUB R2 R4 R3 DIV R3 R1 R3 STORE R4 104 WRITE 103 WRITE 104 HALT
richiede che il programma sia memorizzato a partire dalla locazione
1000
(se non è così, la JUMPIFNEG porta alla locazione
sbagliata)
conclusione: a parte casi molto particolari, si evita di scrivere programmai direttamente in linguaggio macchina