if/else
per eseguire un semplice if/else del tipo
if (x>0) <istruzione>
else
si utilizza l’istruzione blez
(branch at less than or equal to zero) - e si scrive il codice per la condizione falsa (se x ⇐ 0)
.text
blez $t0, else
#codice se la cond. è vera
#(se non branch-o)
j endIF #esco dall'if
else:
#codice se la cond. è falsa
endIf:
#codice per dopo
blez
- branch-a, se il contenuto del registro $t0 è minore o uguale a 0, alla riga con scritto “else”- dopo
blez
si scrive il codice se non si va nel branch j endIF
- (jump) salta al punto “endIF
”, uscendo così dall’if che abbiamo creatoelse
qui c’è il codice a cui si branch-a se la condizione è falsaendIF
- punto a cui si salta dal codice per la condizione vera (e a cui si arriva senza dover saltare se la condizione è falsa)
altro esempio:
if(i==j): f = g+h
else: f = g-h`
.text
bneq $s3, $s4, else
add $s0, $s1, $s2
j endIf
else:
sub $s0, $s1, $s2
endIF:
loop
per ricreare un do while (x!=0)
.text
do:
#codice da ripetere
bnez $t0, do
- se x è diversa da 0, branch-a all’inizio del codice da ripetere (a
do
)
invece, per un while do (x!=0)
.text
while:
beqz $t0, endWhile
#codice da ripetere
j while #loop
endWhile:
#codice seguente
- se x è uguale a zero, branch-a (esce quindi dal while)
invece, per ricreare un for(i=0; i<N; i++)
.text
#t0 contiene l'indice, t1 il valore limite N
xor $t0, $t0, $t0
li $t1, N #load-o N
cicloFor:
bge $t0, $t1, endFor
#codice da ripetere
addi $t0, $t0, 1
j cicloFor
endFor
#codice seguente
xor $t0, $t0, $t0
fa uno xor tra t0 - serve per azzerare il valore di $t0, visto che uno xor tra due cose uguali darà sempre 0.li
load immediato di un valore in un registrobge
- branch if greater than or equal to, va aendFor
se le condizioni del for non valgono più, quindi se l’indicet0
è diventato maggiore di o uguale aN
addi
a “fine for” aggiunge uno all’indice (ricordo che èaddi
e nonadd
perché si aggiunge un numero e non il contenuto di un registro)