Fare matematica
Tutti i calcoli avvengono tra registri. Un'istruzione aritmetica nomina prima la destinazione, seguita dalle due sorgenti che legge: significa dest = src1 + src2.
add mette t0 + t1 in t2.
t0 e t1, sempre in quest'ordine. Entrano nella stessa forma indipendentemente dall'operazione in esecuzione: addizione, sottrazione, moltiplicazione, divisione o resto. Due valori entrano, un'operazione avviene, e un risultato esce in t2 a destra. nomina t2 per primo perché è lì che arriva il risultato, il che corrisponde all'unica regola di ordinamento che ogni istruzione aritmetica in questa lezione segue.Somma e sottrazione
prende i numeri contenuti in due registri e memorizza la loro somma in un terzo. fa lo stesso per la sottrazione: calcola t0 - t1. Entrambe le istruzioni leggono solo dai registri.
add t2, t0, t1 # t2 = t0 + t1sub t2, t0, t1 # t2 = t0 - t1
Una cosa da sapere: un registro contiene solo 32 bit, quindi c'è un tetto. Se un risultato è troppo grande per starci, non viene sollevato alcun errore. Il valore silenziosamente torna indietro a numeri molto bassi e l'esecuzione continua. I valori quotidiani non raggiungeranno questo limite, ma vale la pena conoscere il tetto.
Per usare un numero fisso al posto di un secondo registro, aggiungi la lettera i, che sta per immediato: aggiunge la costante 1. Non esiste subi, quindi per sottrarre una costante si aggiunge una negativa: .
Moltiplicazione e divisione
moltiplica due registri. li divide come numeri interi e scarta la frazione, quindi 7 / 2 dà 3. dà il resto, quindi 7 % 2 dà 1. La divisione non causa mai un crash. La divisione per zero restituisce -1.
mul t2, t0, t1 # t2 = t0 * t1div t2, t0, t1 # t2 = t0 / t1 (intero)rem t2, t0, t1 # t2 = t0 % t1 (resto)
Mettiamo tutto insieme
li t0, 7li t1, 5add t1, t0, t1 # t1 = 7 + 5 = 12mv a0, t1 # il servizio di stampa legge a0li a7, 1ecallli a7, 10ecall
carica 7 in t0. carica 5 in t1. li somma e scrive 12 in t1. copia il risultato in a0, perché il servizio di stampa legge sempre il suo valore da a0. Poi seleziona il servizio di stampa di interi e lo esegue. Infine, e terminano il programma.
Bonus: moltiplicare con gli spostamenti
Quando il fattore è una potenza di due, esiste un metodo più veloce di . (shift left logical) sposta i bit di un registro verso sinistra, e ogni posizione spostata raddoppia il valore: sposta di 1 per moltiplicare per 2, di 2 per 4, di 3 per 8. Lo spostamento costa meno della moltiplicazione, quindi i compilatori lo usano spesso.
li t0, 5 # inizia con 5# scorrimento a sinistra di 3 bit (5 * 2^3 = 5 * 8)sll a0, t0, 3 # a0 = 40li a7, 1 # stampa interoecallli a7, 10ecall
mette 5 in t0. sposta i suoi bit di tre posizioni verso sinistra. Ogni posizione raddoppia il valore, quindi 5 raddoppia tre volte (5, 10, 20, 40), dando 40 in a0. Il resto segue lo schema di stampa di prima. Prova a cambiare il 3 in 1 o 2 e prevedi il risultato prima di eseguirlo.
5 spostato a sinistra di 0 bit rimane 5.
