codice:
# Title: Progetto2
# Author: Dennis Aleandro Boanini
# Description:
################# Data segment generale ###########
.data
str1: .asciiz "\n\n1 - Richiede l’inserimento di un intero, visualizza a console se č un numero pari o dispari e ritorna al menů di scelta;\n\n"
str2: .asciiz "2 - Richiede l’inserimento di due interi, visualizza a console se la loro somma č un numero pari o dispari e ritorna al menů di scelta;\n\n"
str3: .asciiz "3 - Richiede l’inserimento di tre interi, ne visualizza su console il valore minimo e ritorna al menů di scelta;\n\n"
str4: .asciiz "4 - Visualizza un messaggio di uscita e termina il programma. \n\n"
numero1: .asciiz "\n\nInserisci primo numero --> "
numero2: .asciiz "Inserisci secondo numero --> "
numero3: .asciiz "Inserisci terzo numero --> "
inserimento: .asciiz "Inserisci un numero da 1 a 4 --> "
errore: .asciiz "Il numero inserito non era compreso tra 1 e 4 \n\n"
fine: .asciiz "End of Program \n\n"
.align 4
jump_table: .space 16 # jump table array a 4 word che verra' instanziata dal main con gli indirizzi delle label che chiameranno le corrispondenti procedure
################# Data segment 3 case ##############
msg: .asciiz "\nIl minimo fra i tre numeri č --> "
################# Data segment 2 case ##############
somma: .asciiz "\nLa somma dei due numeri inseriti č --> "
pari: .asciiz "\nIl numero č pari!"
dispari: .asciiz "\nIl numero inserito č dispari!"
################# Code segment #####################
.text
.globl main
main:
la $s1, jump_table
la $t0, juno
sw $t0, 0($s1)
la $t0, jdue
sw $t0, 4($s1)
la $t0, jtre
sw $t0, 8($s1)
la $t0, jquattro
sw $t0, 12($s1)
menu:
#Stampa del menu di selezione
la $a0, str1
li $v0, 4
syscall
la $a0, str2
li $v0, 4
syscall
la $a0, str3
li $v0, 4
syscall
la $a0, str4
li $v0, 4
syscall
choice:
# scelta della procedura o dell'uscita
la $a0, inserimento
li $v0, 4
syscall
li $v0, 5
syscall
move $s0, $v0
sle $t0, $s0, $zero
bne $t0, $zero, choice_err
li $t0,4
sle $t0, $s0, $t0
beq $t0, $zero, choice_err
branch_case:
addi $s0, $s0, -1 # tolgo 1 da scelta perche' prima azione nella jump table (in posizione 0) corrisponde alla prima scelta del case
add $t0, $s0, $s0
add $t0, $t0, $t0
add $t0, $t0, $s1
lw $t0, 0($t0)
jr $t0
# prima case action
juno:
li $t3, 2
la $a0, numero1
li $v0, 4
syscall
li $v0, 5
syscall
move $t0, $v0
div $t0, $t3
mfhi $s1
beq $s1, $zero, Pari
la $a0, dispari
li $v0, 4
syscall
j menu
# seconda case action
jdue:
li $t3, 2
la $a0, numero1
li $v0, 4
syscall
li $v0, 5
syscall
move $t1, $v0
la $a0, numero2
li $v0, 4
syscall
li $v0, 5
syscall
move $t2, $v0
add $t0, $t1, $t2
la $a0, somma
li $v0, 4
syscall
move $a0, $t0
li $v0, 1
syscall
div $t0, $t3
mfhi $s1
beq $s1, $zero, Pari
la $a0, dispari
li $v0, 4
syscall
j menu
Pari:
la $a0, pari
li $v0, 4
syscall
j menu
# terza case action
jtre:
la $a0, numero1
li $v0, 4
syscall
li $v0, 5
syscall
move $t1, $v0
la $a0, numero2
li $v0, 4
syscall
li $v0, 5
syscall
move $t2, $v0
la $a0, numero3
li $v0, 4
syscall
li $v0, 5
syscall
move $t3, $v0
blt $t1, $t2, control1
blt $t2, $t3, minSecondoNumero
j minTerzoNumero
control1:
blt $t1, $t3, minPrimoNumero
j minTerzoNumero
blt $t2, $t3, Controllo3
j minTerzoNumero
j minPrimoNumero
minPrimoNumero:
la $a0, msg
li $v0, 4
syscall
move $a0, $t1
li $v0, 1
syscall
j menu
minSecondoNumero:
la $a0, msg
li $v0, 4
syscall
move $a0, $t2
li $v0, 1
syscall
j menu
minTerzoNumero:
la $a0, msg
li $v0, 4
syscall
move $a0, $t3
li $v0, 1
syscall
j menu
# quarta case che esce dal programma visualizzando un messaggio di uscita
jquattro:
la $a0, fine
li $v0, 4
syscall
j exit
choice_err:
li $v0, 4
la $a0, errore
syscall
j choice
exit:
li $v0, 10
syscall