Tutte le istruzioni aritmetiche hanno esattamente 3 operandi. L'ordine degli operandi è fisso.
Addizione:
In linguaggio C:
a = b + c;
a = b + c;
In RISC-V:
add a, b, c
add a, b, c
In linguaggio C:
a = b + c;
In RISC-V:
add a, b, c
ovvero in a, deve essere salvato il valore della somma tra b e c.
=== end-multi-column
Sottrazione:
In linguaggio C:
a = b - c;
a = b - c;
In RISC-V:
sub a, b, c;
sub a, b, c;
In linguaggio C:
a = b - c;
In RISC-V:
sub a, b, c;
=== end-multi-column
Gli operandi delle operazioni devono sempre essere registri compresi tra x0, ..., x31, la ALU ha come input solo il contenuto dei registri. I numeri interi sono rappresentati in complemento a 2. Le istruzioni precedenti diventano:
In linguaggio C:
a = b - c;
a = b - c;
In RISC-V:
add x5, x20, x21;
add x5, x20, x21;
In linguaggio C:
a = b - c;
In RISC-V:
add x5, x20, x21;
=== end-multi-column
A volte può essere necessario cambiare il segno di un valore, questo è quello che fa l'operatore sub per esempio, per effettuare la differenza tra due valori.
In linguaggio C:
a = - a;
a = - a;
In RISC-V:
sub x19, x0, x19
sub x19, x0, x19
ovvero nel registro x19 viene salvata la differenza tra 0 e il contenuto di x19. Ricordiamo che il registro x0 contiene sempre 0.
In linguaggio C:
a = - a;
In RISC-V:
sub x19, x0, x19
ovvero nel registro x19 viene salvata la differenza tra 0 e il contenuto di x19. Ricordiamo che il registro x0 contiene sempre 0.
=== end-multi-column
Una operazione come la seguente in linguaggio C:
f = a + b - c;
si traduce in RISC-V:
add x19, x20, x21
sub x19, x19, x22
Altro esempio:
In linguaggio C:
f = (g + h) - (i + j)
/*
f = x19,
g = x20,
h = x21,
i = x22,
j = x23
*/
f = (g + h) - (i + j)
/*
f = x19,
g = x20,
h = x21,
i = x22,
j = x23
*/
In RISC-V:
add x5, x20, x21
add x6, x21, x22
sub x19, x5, x6
add x5, x20, x21
add x6, x21, x22
sub x19, x5, x6
In linguaggio C:
f = (g + h) - (i + j)
/*
f = x19,
g = x20,
h = x21,
i = x22,
j = x23
*/
--- column-end ---
In RISC-V:
add x5, x20, x21
add x6, x21, x22
sub x19, x5, x6
=== end-multi-column
Quando le variabili utilizzare in un programma sono maggiori del numero di registri a disposizione, per esempio quando si utilizzano strutture dati complesse (vettori, liste,...) i dati sono salvati in memoria centrale. La memoria centrale può essere immaginata come un grande vettore monodimensionale.
La terza cella di memoria della memoria ha valore 00111010.