Fare matematica

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.

Operazione aritmetica
t2, t0, t1←add
t0 = 7t1 = 5+t2 = 12

add mette t0 + t1 in t2.

Le due linee che entrano da sinistra sono 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.

Registra aritmetica
add t2, t0, t1 # t2 = t0 + t1
sub 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: .

💡
aggiunge una costante. aggiunge due registri. Confondere i due è l'errore più comune dei principianti.

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.

Moltiplicazione, divisione, resto
mul t2, t0, t1 # t2 = t0 * t1
div t2, t0, t1 # t2 = t0 / t1 (intero)
rem t2, t0, t1 # t2 = t0 % t1 (resto)

Mettiamo tutto insieme

Somma due numeri e visualizza il risultato
li t0, 7
li t1, 5
add t1, t0, t1 # t1 = 7 + 5 = 12
mv a0, t1 # il servizio di stampa legge a0
li a7, 1
ecall
li a7, 10
ecall

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.

Moltiplicare per 8 utilizzando gli spostamenti
li t0, 5 # inizia con 5
# scorrimento a sinistra di 3 bit (5 * 2^3 = 5 * 8)
sll a0, t0, 3 # a0 = 40
li a7, 1 # stampa intero
ecall
li a7, 10
ecall

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.

Moltiplicare tramite spostamento
5sll a0, t0, 0
×2 →
10sll a0, t0, 1
×2 →
20sll a0, t0, 2
×2 →
40sll a0, t0, 3
0
0
0
0
0
1
0
1

5 spostato a sinistra di 0 bit rimane 5.

Le otto caselle sono la forma binaria del numero sopra di esse, un bit ciascuna, lette da sinistra a destra come al solito. Spostare l'intera riga di una posizione verso sinistra è la stessa operazione del moltiplicare per 2, perché spostare una cifra di una posizione verso sinistra in qualsiasi base moltiplica il suo valore per quella base. Il binario ha solo due cifre, quindi il moltiplicatore è 2. Spostare tre volte compone questo in una moltiplicazione per 8, che corrisponde a ciò che fa al numero 5.