Vi posto il codice che ho fatto, ho un problema, inserisco gli elementi, stampo i 5 vettori (con 0 che chiude l'inserimento) ma non riesco a fare l'unione perchè mi esce dal programma... qual'è il problema? non riesco a trovarlo.
.data
msg1: .asciiz "\n Inserisci gli elementi del vettore 1 e premi '0' per terminare: \n\n"
msg2: .asciiz "\n Inserisci gli elementi del vettore 2 e premi '0' per terminare:\n"
msg3: .asciiz "\n Inserisci gli elementi del vettore 3 e premi '0' per terminare:\n"
msg4: .asciiz "\n Inserisci gli elementi del vettore 4 e premi '0' per terminare:\n"
msg5: .asciiz "\n Inserisci gli elementi del vettore 5 e premi '0' per terminare:\n"
msg_exit: .asciiz "\n FINE INSERIMENTO!!! \n"
array1: .space 50 #creazione array in cui possono essere allocati al massimo 50 byte di memoria (per ogni array)
array2: .space 50
array3: .space 50
array4: .space 50
array5: .space 50
vettoreUnione: .space 50
.text
.globl main
main:
li $v0,4 #stampa msg1
la $a0,msg1
syscall
li $s0, 0 #uso $s0 come indice dell'array
li $s1, 49 #termina l'inserimento quando sono stati inseriti 50 caratteri
inserimento1:
la $t0, array1 #$t0 prende l'indirizzo dell'array
li $v0, 12
syscall
move $t1, $v0 #inizializzazione del ciclo per l'inserimento
sb $t1, array1($s0)
beq $v0, '0', vett2 #se è stato inserito zero si deve concludere
addi $t0,$t0, 1 #incrementa di 1 per poter andare avanti nel ciclo
addi $s0, $s0, 1
bne $s0, $s1, inserimento1
vett2:
li $v0,4 #stampa msg_successivo
la $a0,msg2
syscall
li $s0, 0 #uso $s0 come indice dell'array
li $s1, 49 #termina l'inserimento quando sono stati inseriti 50 caratteri
j inserimento2
inserimento2:
la $t0, array2 #$t0 prende l'indirizzo dell'array
li $v0, 12
syscall
move $t1, $v0
sb $t1, array2($s0)
beq $v0, '0', vett3 #se è stato inserito zero si deve concludere
addi $t0,$t0, 1
addi $s0, $s0, 1
bne $s0, $s1, inserimento2
vett3:
li $v0,4 #stampa msg_successivo
la $a0,msg3
syscall
li $s0, 0 #uso $s0 come indice dell'array
li $s1, 49 #termina l'inserimento quando sono stati inseriti 50 caratteri
j inserimento3
inserimento3:
la $t0, array3 #$t0 prende l'indirizzo dell'array
li $v0, 12
syscall
move $t1, $v0
sb $t1, array3($s0)
beq $v0, '0', vett4 #se è stato inserito zero si deve concludere
addi $t0,$t0, 1
addi $s0, $s0, 1
bne $s0, $s1, inserimento3
vett4:
li $v0,4 #stampa msg_successivo
la $a0,msg4
syscall
li $s0, 0 #uso $s0 come indice dell'array
li $s1, 49 #termina l'inserimento quando sono stati inseriti 50 caratteri
j inserimento4
inserimento4:
la $t0, array4 #$t0 prende l'indirizzo dell'array
li $v0, 12
syscall
move $t1, $v0
sb $t1, array4($s0)
beq $v0, '0', vett5 #se è stato inserito zero si deve concludere
addi $t0,$t0, 1
addi $s0, $s0, 1
bne $s0, $s1, inserimento4
vett5:
li $v0,4 #stampa msg_successivo
la $a0,msg5
syscall
li $s0, 0 #uso $s0 come indice dell'array
li $s1, 49 #termina l'inserimento quando sono stati inseriti 50 caratteri
j inserimento5
inserimento5:
la $t0, array5 #$t0 prende l'indirizzo dell'array
li $v0, 12
syscall
move $t1, $v0
sb $t1, array5($s0)
beq $v0, '0', exit #se è stato inserito zero si deve concludere
addi $t0,$t0, 1
addi $s0, $s0, 1
bne $s0, $s1, inserimento5
move $t2, $zero # int i=0,
forIparte1:
beq $t2, $v0, uscitaUnione # se i==v.length ha finito e torna al main
lbu $t0, 0($a1) # v = $t0
beq $t0, $s0, updateForI # v == 0, non considero questo elemento
move $t3, $zero # int j=0
forJ:
blt $s3, $t3, forIparte2 # if k < j esce dal j loop
lbu $t1, 0($a2) # unione[j] = $t1
beq $t0, $t1, updateForI # if v==unione[j], non salva v
addi $a2, $a2, 1 #
addi $t3, $t3, 1 # j++
j forJ
forIparte2:
sb $t0, vettoreUnione($s3) # vettoreUnione[k] = v
addi $s3, $s3, 1 # k++
beq $s2, $s3, printUnione # if 49==k (vettoreUnione è pieno) vai al print
updateForI:
addi $a1, $a1, 1 # incremento il puntatore a v
addi $t2, $t2, 1 # i++
j forIparte1
printUnione:
la $t0, vettoreUnione #$t0 prende l'indirizzo dell'array
li $v0, 12
syscall
uscitaUnione:
jr $ra
exit:
li $v0,4 #stampa msg_exit
la $a0,msg_exit
syscall
li $v0, 10 # termina programma
syscall