Advertisement
Guest User

mips matrix exercise

a guest
Apr 9th, 2019
774
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 3.22 KB | None | 0 0
  1. .data
  2.     mat: .word 3,3,3
  3.          .word 3,3,3
  4.              .word 3,3,3
  5.     mat_end:
  6.          
  7.     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.
  8.     .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
  9.    
  10.    
  11.     sumMessage: .asciiz     "La suma de todos los elementos de la matriz = "
  12.     newLine:    .asciiz     "\n"
  13.     tab:    .asciiz     "\t"
  14.    
  15. .text
  16.    
  17.     main:
  18.         # Mostrar matriz en pantalla
  19.         la $a0, mat
  20.         lw $a1, size
  21.         jal mat_print
  22.        
  23.         # Suma diagonal
  24.         la $a0, mat
  25.         lw $a1, size
  26.         jal sumDiagonal
  27.         move $a0, $v0                   # $v0 contiene la suma, que la ponemos en $a0, para imprimirlo mas tarde
  28.         li $v0, 1
  29.         syscall
  30.        
  31.         # Suma de todos los elementos
  32.         li $t0, 0                 # sum = 0
  33.             la $t3, mat               # carga la dirección base (load base addr.) de la matriz
  34.             la $t2, mat_end           # carga la dirección de la final de la matriz (mat_end)
  35.         j sum_total
  36.    
  37.         # Final de main
  38.         li $v0, 10
  39.         syscall
  40.            
  41.         ## Pretty-prints a matrix into standard output
  42.         # $a0   Address of matrix's first word
  43.         # $a1   Matrix's size
  44.     mat_print:         
  45.         add $t3, $zero, $a0
  46.         add $t0, $zero, $zero           # i = 0
  47.  
  48.     mat_print_while1:  
  49.         add $t7, $zero, $zero
  50.         slt $t7, $t0, $a1               # if (i < `size`) continue
  51.         beq $t7, $zero, mat_print_end       # if not, se ha imprimido ya toda la matriz
  52.    
  53.         add $t1, $zero, $zero           # j = 0
  54.    
  55.     mat_print_while2:
  56.         add $t6, $zero, $zero
  57.         slt $t6, $t1, $a1               # if (j < `size`) continue
  58.         beq $t6, $zero, mat_print_end_line      # if not, se ha imprimido toda la linea
  59.  
  60.         mul $t5, $t0, $a1               # c = i * `size`
  61.         add $t5, $t5, $t1               # c += j
  62.         sll $t4, $t5, 2                 # (convierte j en address size definido previamente)
  63.         add $t5, $t4, $t3               # c = `matriz [i * size + j]
  64.         li $v0, 1
  65.         lw $a0, 0($t5)                  # printf("%d", c)
  66.         syscall
  67.    
  68.         li $v0, 4
  69.         la $a0, tab                 # printf("\t")
  70.         syscall
  71.    
  72.         addi $t1, $t1, 1                # j++
  73.         j mat_print_while2
  74.  
  75.     mat_print_end_line:                 # printf("\n")
  76.         li $v0, 4
  77.         la $a0, newLine
  78.         syscall
  79.    
  80.         addi $t0, $t0, 1                # i++
  81.         j mat_print_while1 
  82.            
  83.     mat_print_end:                      # Fin
  84.         jr $ra
  85.  
  86.     sumDiagonal:
  87.         li $v0, 0                   # sum = 0
  88.         li $t0, 0                   # $t0 lo utilizo como índice (Index)
  89.        
  90.         sumLoop:
  91.         mul $t1, $t0, $a1               # t1 = rowIndex * colSize
  92.         add $t1, $t1, $t0               #       + colIndex
  93.         mul $t1, $t1, DATA_SIZE             # * DATA_SIZE
  94.         add $t1, $t1, $a0               # + base address
  95.        
  96.         lw $t2, ($t1)      
  97.         add $v0, $v0, $t2               # sum = sum + mdArray[i][i]
  98.        
  99.        
  100.         addi $t0, $t0, 1                # i = i + i
  101.         blt $t0, $a1, sumLoop               # if i < size, loop de nuevo
  102.        
  103.         jr $ra
  104.    
  105.         loop:
  106.          lw $t4,0($t3)                      # carga array[i]
  107.          addi $t3,$t3,4                         # incrementa array pointer
  108.          add $t0,$t0,$t4                        # actualiza la suma
  109.  
  110.     sum_total:
  111.        
  112.          # si no ha acabado, sigue el loop
  113.          blt $t3, $t2, loop
  114.          # Mensaje de la suma
  115.              li $v0, 4
  116.                  la $a0, sumMessage
  117.              syscall
  118.  
  119.              # Valor de la suma
  120.          li $v0, 1
  121.              addi $a0, $t0, 0
  122.              syscall
  123.  
  124.              # Nueva linea
  125.          li $v0, 4
  126.              la $a0, newLine
  127.          syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement