Una calcolatrice in Assembler MIPS

.data
somma: .ascii "+"
differenza: .ascii "-"
moltiplicazione: .ascii "x"
divisione: .ascii ":"
richiesta: .asciiz "Scegli l'operazione da compiere <+, -, x, :> "
exit: .ascii "e"
spazio: .ascii " "
errore: .asciiz "Operazione inesistente\n"
primo: .asciiz "Valore primo membro: "
secondo: .asciiz "Valore secondo membro: "
risult: .asciiz "Il risultato è: "
capo: .asciiz "\n"

.text
.globl main

main:
li $t0, 0 #registro simboli
# $f1 è il primo membro dell'operazione
# $f2 è il secondo
li $t1, 0# offset
li $t2, 0# registro operazione scelta
operazione:
la $a0, richiesta
li $v0, 4
syscall
la $a0, spazio
li $v0, 8
syscall
lb $t2, spazio($t1)
ric_somma:
lb $t0, somma($t1)
beq $t2, $t0, sum
ric_differenza:
lb $t0, differenza($t1)
beq $t2, $t0, diff
ric_moltiplicazione:
lb $t0, moltiplicazione($t1)
beq $t2, $t0, mol
ric_divisione:
lb $t0, divisione($t1)
beq $t2, $t0, divs
ric_exit:
lb $t0, exit($t1)
beq $t2, $t0, esci
err:
la $a0, errore
li $v0, 4
syscall
j operazione

sum:
#primo
la $a0, primo
li $v0, 4
syscall
li $v0, 6
syscall
# posto in $f0 lo trasferisco in $f1
mov.s $f1, $f0
#secondo
la $a0, secondo
li $v0, 4
syscall
li $v0, 6
syscall
# posto in $f0 lo trasferisco in $f2
mov.s $f2, $f0
#eseguo operaione
add.s $f12, $f1, $f2
#scrivo risultato
la $a0, risult
li $v0, 4
syscall
li $v0, 2
syscall
la $a0, capo
li $v0, 4
syscall
#richiede operazione
j operazione

diff:
#primo
la $a0, primo
li $v0, 4
syscall
li $v0, 6
syscall
# posto in $f0 lo trasferisco in $f1
mov.s $f1, $f0
#secondo
la $a0, secondo
li $v0, 4
syscall
li $v0, 6
syscall
# posto in $f0 lo trasferisco in $f2
mov.s $f2, $f0
#eseguo operaione
sub.s $f12, $f1, $f2
#scrivo risultato
la $a0, risult
li $v0, 4
syscall
li $v0, 2
syscall
la $a0, capo
li $v0, 4
syscall
#richiede operazione
j operazione

mol:
#primo
la $a0, primo
li $v0, 4
syscall
li $v0, 6
syscall
# posto in $f0 lo trasferisco in $f1
mov.s $f1, $f0
#secondo
la $a0, secondo
li $v0, 4
syscall
li $v0, 6
syscall
# posto in $f0 lo trasferisco in $f2
mov.s $f2, $f0
#eseguo operaione
mul.s $f12, $f1, $f2
#scrivo risultato
la $a0, risult
li $v0, 4
syscall
li $v0, 2
syscall
la $a0, capo
li $v0, 4
syscall
#richiede operazione
j operazione

divs:
#primo
la $a0, primo
li $v0, 4
syscall
li $v0, 6
syscall
# posto in $f0 lo trasferisco in $f1
mov.s $f1, $f0
#secondo
la $a0, secondo
li $v0, 4
syscall
li $v0, 6
syscall
# posto in $f0 lo trasferisco in $f2
mov.s $f2, $f0
#eseguo operaione
div.s $f12, $f1, $f2
#scrivo risultato
la $a0, risult
li $v0, 4
syscall
li $v0, 2
syscall
la $a0, capo
li $v0, 4
syscall
#richiede operazione
j operazione

esci:
li $v0, 10
syscall