In RISC-V non esistono costrutti ad alto livello come if, for, ecc. — si usano salti condizionati (beq, bne, blt, bge, ecc.) e etichette (label:) per simulare la logica dei linguaggi ad alto livello:


if (condizione) then { ... } else { ... }

branch Else 
# codice da eseguire se la condizione è vera
j EndIf
Else:
# codice da eseguire se la condizione è falsa
Endif:
# codice seguente

**Esempio:

Codice in C:

int x = 3
int y = 4;
 
if (x >= y) {
	a0 = 1;
}
else {
	a0 = 0;
}

Codice in assembly:

li t0, 3        
li t1, 4        
 
blt t0, t1, Else 
li a0, 1
j EndIf
 
Else:
li a0, 0
 
EndIf:

N.B. la condizione è al contrario (se x < y allora salta a Else)


while (condizione) { ... }

LoopStart:
branch LoopEnd
# codice nel while
j LoopStart
LoopEnd:
# codice seguente

**Esempio:

Codice in C:

int i = 0;
 
while (i < 5) {
    i++;
}

Codice in assembly:

li t0, 0            
li t1, 5
 
LoopStart:
bge t0, t1, LoopEnd 
addi t0, t0, 1      
j LoopStart
 
LoopEnd:

N.B. la condizione è al contrario (se i >= 5 y allora salta a LoopEnd)


do { ... } while (condizione)

LoopStart:
# codice nel while
branch LoopStart
LoopEnd:
# codice seguente

**Esempio:

Codice in C:

int i = 0;
 
do {
    i++;
} while (i < 5);

Codice in Assembly:

li t0, 0
li t1, 5
 
LoopStart:
addi t0, t0, 1       
blt t0, t1, LoopStart
 
LoopEnd:

for (init; cond; update) { ... }

LoopStart:
branch LoopEnd       
# codice nel for
j LoopStart
LoopEnd:
# codice seguente

**Esempio:

Codice in C:

for (int i = 0; i < 5; i++) {
    a0 = i + 10;
}

Codice in Assembly:

li t0, 0
li t1, 5
 
LoopStart:
bge t0, t1, LoopEnd
addi a0, t0, 10
addi t0, t0, 1
j LoopStart
 
LoopEnd:

switch (x) { case ... }

# confronti multipli
beq x, val0, Case0
beq x, val1, Case1
 
j Default
 
Case0:
# codice del caso 0
j SwitchEnd
 
Case1:
# codice del caso 1
j SwitchEnd
 
Default:
# codice in caso tutti i casi sono FALSE
 
SwitchEnd:
# codice seguente

**Esempio:

Codice in C:

int x = 2;
 
switch (x) {
    case 0: a0 = 100; break;
    case 1: a0 = 200; break;
    case 2: a0 = 300; break;
    default: a0 = -1;
}

Codice in Assembly:

li t0, 2
 
li t1, 0
beq t0, t1, Case0
 
li t1, 1
beq t0, t1 Case1
 
li t1, 2
beq t0, t1, Case2
 
j Default
 
Case0:
li a0, 100
j SwitchEnd
 
Case1:
li a0, 200
j SwitchEnd
 
Case2:
li a0, 300
j SwitchEnd
 
Default:
li a0, -1
 
SwitchEnd:

N.B. beq non funziona con valori immediati, quindi ogni volta va caricato un valore su t1 per poter verificare l’uguaglianza con il valore salvato in t0