Istruzioni aritmetiche

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.
Pasted image 20230312175419.png
La terza cella di memoria della memoria ha valore 00111010.