Concetti Introduttivi
Per architettura di un calcolatore si intende l’insieme di istruzioni interpretabili da quella specifica CPU, quindi l’ISA(Instruction Set Architecture).ARM,RISC-V,CISC sono esempi di architetture.
Ci sono delle istruzioni native,cioè implementate dall’hardware, dalla CPU.Poi esistono altri tipi di istruzioni,come le pseudoistruzioni che non sono implementate dall’hardware ma vengono espanse in più istruzioni native dall’assembler(il vantaggio è utilizzare una sola linea di codice al posto di più righe).
In elenco, alcuni dei concetti introduttivi più importanti da sapere, per capire il funzionamento di un calcolatore:
- Per poter leggere o salvare qualsiasi dato in RAM, bisogna prima caricarlo nei registri della CPU(a.e. mediante le istruzioni di load o store)
- i registri rappresentano anche le primitive usate.In RISC-V i registri sono 32(general purpose)
- una parola(word) è il numero di bit a cui si accede più facilmente.In RISC-V è 32 bit.
- I registri risc-v sono numerati da 0 a 31.Si possono chiamare utilizzando la notazione x10 ad esempio, cioè x + NUMERO REGISTRO oppure secondo la ABI(s1,s0,t0,t1 etc…).
- siccome le strutture dati come struct e array richiedono uno spazio molto superiore a quelli che sono i registri della CPU, vengono memorizzati in RAM.
- In RISC-V le operazioni aritmetiche richiedono che gli operandi siano sempre presenti già nei registri.Si devono quindi usare delle istruzioni di trasferimento dati che trasferiscono dati tra memoria centrale e registri.Per accedere ad una parola presente in memoria bisogna fornirne l’indirizzo.Per spostare una word dalla memoria ad un registro è necessaria l’istruzione load.
- sia A un array di 100 word e il primo elemento(il cui indirizzo è detto indirizzo base) si trovi in x22.Come posso caricare in un registro(x9 ad esempio), il valore contenuto in A[8]?
lw x9,32(x22)
Siccome l’indirizzamento è al byte,per individuare la posizione 8 nell’array devo esprimerla in byte.Siccome ogni elemento dell’array occupa un ingombro di 4 byte(1 word),l’offset(lo spiazzamento dall’indirizzo base,quindi per individuare l’ottava posizione nell’array) deve essere di 4x8=32 byte, 4 che è l’ingombro(in byte) di un elemento dell’array e 8 è la posizione del “cassetto”, l’indice dell’elemento dell’array che voglio trovare.
- Dato che gli indirizzi delle istruzioni load e store sono espressi in binario, gli indirizzi delle D-RAM sono a base 2 e non 10.
- Add immediate(addi) consente la somma di una costante:
addi x22,x9,15 #somma il contenuto di x9 + 15 e salva il risultato in x22
- Ci sono varianti della ISA come la RV32 che hanno registri grandi 32 bit e quindi indirizzi di memoria da 32 bit.In quel caso la massima memoria RAM consentita è di 2^32 bit.
- MSB(Most Significant Bit) e LSB(Less Significant Bit): quando rappresentiamo un numero in binario la cifra che ha valore maggiore è quella più a sinistra(MSB):
- Rappresentazione delle istruzioni nel calcolatore:
ciascuna delle parti che compongono un’istruzione è chiamata field.La combinazione del primo,quarto e sesto campo indica al processore che questa è un’operazione di somma.Il secondo field indica il numero del registro che contiene il primo operando (21), il 3° field indica il secondo operando,il 5° è il registro in cui viene memorizzata la somma.
La scomposizione dei campi è detta formato dell’istruzione.
- siccome molti calcolatori hanno dimensioni delle memorie multiple di 4, è spesso utilizzata la base 16(HEX)
- Campi delle istruzioni RISC-V:
ai diversi campi delle istruzioni viene associato un nome:
- CODOP:operazione base dell’istruzione, detta codice operativo
- FUNZ3:un codice operativo aggiuntivo
- RS1:registro primo operando sorgente
- RS2:registro secondo operando sorgente
- FUNZ7:un codice operativo aggiuntivo
Un problema che può nascere però è se una istruzione richiede un campi di dimensioni maggiori.Allora per ovviare al problema si è scelto di mantenere la stessa dimensione delle istruzioni, ma con formati diversi:
Nelle I il campo immediate è l’offset in byte, rispetto al registro di base rappresentato da rd.
lw x9, 32(x22) # x9 prende il valore contenuto in A[8],dove A è un array
il field immediato è diviso in 7 bit più significativi e 5 meno significativi.
- OPERAZIONI LOGICHE:furono introdotte perchè ci si rese conto che era utile poter operare su gruppi di bit.
- SHIFT:
- AND
and x9, x10, x11 // reg x9 = reg x10 & reg x11
- BRANCH:SALTI CONDIZIONATI:
- Branch if Equal(beq):ciò che distingue un calcolatore da una semplice calcolatrice è la sua capacità decisionale.L’assembler RISC-V ha due istruzioni per implementare un processo di decisione, simili a un costrutto if seguito da un goto.
beq rs1,rs2,L1 # vai all'istruzione con etichetta L1 se il valore in rs1 è uguale a quello in rs2
- Branch not Equal(bne): funziona al contrario: se la condizione non è vera allora salta a quell’istruzione.
- Branch if Equal(beq):ciò che distingue un calcolatore da una semplice calcolatrice è la sua capacità decisionale.L’assembler RISC-V ha due istruzioni per implementare un processo di decisione, simili a un costrutto if seguito da un goto.
COMPLEMENTO A 2
11111111 11111111 11111111 11111101₂
+ 1₂
______________________________________
11111111 11111111 11111111 11111110₂
invertiamo tutti i bit:
00000000 00000000 00000000 00000001₂
e aggiungiamo 1…
+ 1₂
______________________________________
00000000 00000000 00000000 00000010₂
il risultato è di nuovo 2 in base decimale
Dimensioni in byte dei tipi in C