Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .data
- mat: .word 3,3,3
- .word 3,3,3
- .word 3,3,3
- mat_end:
- size: .word 3 #Solo hay que definir un valor del tamaño porque es una matriz cuadrada, si no lo fuese asi, habría que definir filas y columnas.
- .eqv DATA_SIZE 4 # Definimos el tamaño del tipo de dato, son numeros enteros = 4 bytes. Se aplicara a todo el progrma, es una constante
- sumMessage: .asciiz "La suma de todos los elementos de la matriz = "
- newLine: .asciiz "\n"
- tab: .asciiz "\t"
- .text
- main:
- # Mostrar matriz en pantalla
- la $a0, mat
- lw $a1, size
- jal mat_print
- # Suma diagonal
- la $a0, mat
- lw $a1, size
- jal sumDiagonal
- move $a0, $v0 # $v0 contiene la suma, que la ponemos en $a0, para imprimirlo mas tarde
- li $v0, 1
- syscall
- # Suma de todos los elementos
- li $t0, 0 # sum = 0
- la $t3, mat # carga la dirección base (load base addr.) de la matriz
- la $t2, mat_end # carga la dirección de la final de la matriz (mat_end)
- j sum_total
- # Final de main
- li $v0, 10
- syscall
- ## Pretty-prints a matrix into standard output
- # $a0 Address of matrix's first word
- # $a1 Matrix's size
- mat_print:
- add $t3, $zero, $a0
- add $t0, $zero, $zero # i = 0
- mat_print_while1:
- add $t7, $zero, $zero
- slt $t7, $t0, $a1 # if (i < `size`) continue
- beq $t7, $zero, mat_print_end # if not, se ha imprimido ya toda la matriz
- add $t1, $zero, $zero # j = 0
- mat_print_while2:
- add $t6, $zero, $zero
- slt $t6, $t1, $a1 # if (j < `size`) continue
- beq $t6, $zero, mat_print_end_line # if not, se ha imprimido toda la linea
- mul $t5, $t0, $a1 # c = i * `size`
- add $t5, $t5, $t1 # c += j
- sll $t4, $t5, 2 # (convierte j en address size definido previamente)
- add $t5, $t4, $t3 # c = `matriz [i * size + j]
- li $v0, 1
- lw $a0, 0($t5) # printf("%d", c)
- syscall
- li $v0, 4
- la $a0, tab # printf("\t")
- syscall
- addi $t1, $t1, 1 # j++
- j mat_print_while2
- mat_print_end_line: # printf("\n")
- li $v0, 4
- la $a0, newLine
- syscall
- addi $t0, $t0, 1 # i++
- j mat_print_while1
- mat_print_end: # Fin
- jr $ra
- sumDiagonal:
- li $v0, 0 # sum = 0
- li $t0, 0 # $t0 lo utilizo como índice (Index)
- sumLoop:
- mul $t1, $t0, $a1 # t1 = rowIndex * colSize
- add $t1, $t1, $t0 # + colIndex
- mul $t1, $t1, DATA_SIZE # * DATA_SIZE
- add $t1, $t1, $a0 # + base address
- lw $t2, ($t1)
- add $v0, $v0, $t2 # sum = sum + mdArray[i][i]
- addi $t0, $t0, 1 # i = i + i
- blt $t0, $a1, sumLoop # if i < size, loop de nuevo
- jr $ra
- loop:
- lw $t4,0($t3) # carga array[i]
- addi $t3,$t3,4 # incrementa array pointer
- add $t0,$t0,$t4 # actualiza la suma
- sum_total:
- # si no ha acabado, sigue el loop
- blt $t3, $t2, loop
- # Mensaje de la suma
- li $v0, 4
- la $a0, sumMessage
- syscall
- # Valor de la suma
- li $v0, 1
- addi $a0, $t0, 0
- syscall
- # Nueva linea
- li $v0, 4
- la $a0, newLine
- syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement