Implementazioni di costrutti ad alto livello in Assembly RISC-V
Istruzioni RISC-V
Comâè fatta unâistruzione?
Ogni istruzione ha una lunghezza totale fissa di 32 bit, e in linea di massima (ma ci sono diversi formati delle istruzioni) ha come campi:
- OpCode (7 bit)(operation code): lââetichettaâ che codifica il tipo di operazione da eseguire,
- funct3 (3 bit): una parte aggiuntiva dellâOpCode nel caso esso non sia sufficiente a specificare lâoperazione, non è adiacente allâOpCode,
- funct7 (7 bit): unâaltra parte aggiuntiva dellâOpCode, non è adiacente allâOpCode,
- rs1 (5 bit): (first register source): lâindirizzo del registro in cui è memorizzato il primo argomento dellâistruzione,
- rs2 (5 bit): (second register source): lâindirizzo del registro in cui è memorizzato il secondo argomento dellâistruzione,
- rd (5 bit): (register destination): lâindirizzo del registro in cui va scritto il risultato dellâoperazione.
Formati delle istruzioni
Non tutte le istruzioni necessitano degli stessi campi, quindi si usano diversi formati per diverse categorie di istruzioni.
Pseudoistruzioni
Sono istruzioni non implementate in hardware, ma che possono essere tradotte in istruzioni macchina, un modo compatto ed intuitivo per specificare un insieme di istruzioni o istruzioni ricorrenti.
La traduzione in linguaggio macchina è effettuata dallâassemblatore.
mv x10, x11 â addi x10, x11, 0
li, x9, 123. â addi x9, x0, 123
Modi di indirizzamento delle istruzioni
I modi di indirizzamento sono le tecniche utilizzate dai processori per determinare il dato da utilizzare (contenuto in memoria o in un registro o immediato), dato un indirizzo e spesso anche unâoffset (spiazzamento).
Etichette (label)
Gli indirizzi di salto sono noiosi da calcolare e possono indurre in facili errori, quindi esistono le etichette per semplificare il lavoro ai programmatori:
Lâetichetta associa alla parola lâindirizzo dellâistruzione dove è scritta, potrĂ essere usata nel codice assembly al posto dellâindirizzo della memoria (RAM) che rappresenta (cioè alla riga del programma in esecuzione), come se fosse una costante numerica nei linguaggi ad alto livello.
- Lâassemblatore converte le etichette in salti o in indirizzi
- Le pseudoistruzioni possono usare come argomenti le etichette
Esempio: etichetta per una funzione
sum: # Etichetta "sum"
add a0, a0, a1 # Somma a0 + a1 e salva in a0
ret # Ritorna (usa ra per tornare)
Esempio: etichetta per un ciclo
loop:
addi t0, t0, 1 # Incrementa t0 di 1
blt t0, t1, loop # Se t0 < t1, salta a "loop"
Esempio: etichetta per dati in memoria
.data
message: .asciz "Hello, RISC-V!\n"
.text
la a0, message # Carica l'indirizzo base di "message" in a0
Direttive per lâassemblatore
Indicano lo scopo delle varie sezioni del programma (quindi della parte della RAM che contiene le istruzioni del programma da eseguire).
nome | sezione |
---|---|
.data | definizione dei dati statici |
.text | definizione del programma |
.asciiz | stringa terminata da \0 |
.byte | sequenza di byte |
.double | sequenza di double |
.float | sequenza di float |
.half | sequenza di half words |
.word | sequenza di words |
System Calls
Sono delle richieste che il programma in esecuzione fa al sistema operativo.
Si preparano:
- mettendo nel registro
a7
il numero che identifica la chiamata - Gli eventuali argomenti da mettere in
a0
ea1
.
Si eseguono con lâistruzione senza argomenti ecall
: lâeventuale risultato andrĂ in a0
.
Alcune SysCalls importanti
Syscall (a7) | Descrizione | Argomenti (a0âŚ) | Risultato |
---|---|---|---|
1 | Stampa intero | Intero in a0 | - |
5 | Leggi intero | - | in a0 |
4 | Stampa stringa | Indirizzo base della stringa in a0 | - |
8 | Leggi stringa | indirizzo buffer in a0 e numero di caratteri in a1 | in a0 |
11 | Stampa carattere | Carattere in a0 | - |
12 | Leggi carattere | - | in a0 |
10 | exit con code 0 | - | - |