Leggere e scrivere la RAM
Un programma non potrebbe fare molto senza utilizzare la memoria RAM per tanti motivi:
- le istruzioni sono nella RAM;
- i dati sono nella RAM;
- i risultati vengono scritti nella RAM;
- …
Serve quindi un modo per poter leggere e scrivere dalla RAM. Le istruzioni assembly che fanno queste operazioni sono
LOAD
(LD
) legge dati dalla RAM e li scrivi nei registriSTORE
(ST
) scrive dati nella RAM prendendoli dai registri
Architetture Load-Store
Alcune architetture di processori vengono dette Load-Store perché non permettono solo questo tipo di operazioni con la RAM. In queste architetture, quindi, la ALU può fare operazioni solo sui registri. Di conseguenza prima di poter fare operazioni aritmetico-logiche (es. sommare due numeri) tutti gli operandi devono essere messi nei registri (se già non lo sono) utilizzando operazioni LOAD
. Allo stesso modo il risultato dell’ALU viene messo in un registro, se il risultato va memorizzato nella RAM, serve un’operazione di STORE
.
Somma in RISC-V (architettura load-store)
lw a0, 0(x0)
lw a1, 4(x0)
add a0, a0, a1
sw a0, 8(x0)
Somma in x86 (architettura non load-store)
mov eax, dword ptr [0]
add eax, dword ptr [4]
mov dword ptr [8], eax
Indirizzamento della RAM
Quando si legge o scrive dalla RAM è necessario avere un modo per indicare l’indirizzo della cella di memoria da leggere o scrivere, il modo in cui si indica la cella di memoria viene detto indirizzamento della memoria (memory addressing).
Si potrebbe pensare di usare i numeri “fissi” delle celle, ma questa soluzione presenta molti problemi:
- non è detto che istruzioni e dati vengano sempre messo nelle stesse celle della memoria;
- il programmatore deve ricordarsi di tutti gli indirizzi in cui sono i dati;
- …
L’indirizzamento che utilizza il numero della cella di memoria viene detto indirizzamento assoluto (absolute addressing) ed è usato molto raramente per i motivi spiegati sopra.
- Indirizzamento immediato (immediate addressing)
- Indirizzamento con registro (register addressing)
- Indirizzamento indiretto (indirect addressing)
- Indirizzamento con registro base (base register addressing)
I vari modi di indirizzamento non sono sempre possibili in tutte le architetture. Solitamente le architetture RISC hanno meno tipi di indirizzamento, mentre le architetture CISC ne hanno un numero elevato.
Link per approfondimenti
Esempi
Le slide sotto mostrano un esempio di esecuzione di un’istruzione di Load cioè di copia di valori dalla memoria ai registri. È importante notare che nell’esempio non viene descritta la fase di fetch dell’istruzione in quanto si parte dalla situazione in cui l’istruzione è già arrivata dall’IR
al circuito di decode.