Advertisement
EXTREMEXPLOIT

Matrix Solver

Mar 2nd, 2019
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .data
  2. #A: .word 1, 1, 1, 2 # solucio: 2 1
  3. A: .word 1, 2, 1, 1 # solucio -6 7
  4. #A: .word 1, 1, 2, 2 # no te solucio
  5. #B: .word 3, 4
  6. B: .word 8, 1
  7. #B: .word 6, 6
  8. C: .space 8
  9.  
  10. .text
  11. .globl main
  12.  
  13. main:
  14. la $a0, A # $a0 = &A
  15. li $a2, 2 # $a2 = N = 2
  16. addiu $sp, $sp, -16 # Reservando en la pila espacio para la matriz inversa.
  17. la $a1, 0($sp) # Pasando por referencia la dirección del primer espacio para guardar la matriz inversa.
  18. jal inversa # Ejecutando la subrutina que calcula la inversa, devuelve si es posible hacerla o no un 0/1 en $v0.
  19.  
  20. beq $v1,$zero,endCode # Si el resultado de la subrutina que invierte la matriz es igual a zero, acaba el programa.
  21. la $t0, B # $t0 = &B
  22. lw $t1, 0($t0) # $t1 = B[0]
  23. lw $t2, 4($t0) # $t2 = B[1]
  24. lw $t3, 0($a1) # $t3 = M_Inverted[0][0]
  25. lw $t4, 4($a1) # $t4 = M_Inverted[0][1]
  26. lw $t5, 8($a1) # $t5 = M_Inverted[1][0]
  27. lw $t6, 12($a1) # $t6 = M_Inverted[1][1]
  28.  
  29. multu $t1, $t3 # B[0]*M_Inverted[0][0]
  30. mflo $s0 # $s0 = B[0]*M_Inverted[0][0]
  31.  
  32. multu $t2, $t4 # B[1]*M_Inverted[0][1]
  33. mflo $s1 # $s1 = B[1]*M_Inverted[0][1]
  34.  
  35. multu $t1, $t5 # B[0]*M_Invertida[1][0]
  36. mflo $s2 # $s2 = B[0]*M_Invertida[1][0]
  37.  
  38. multu $t2, $t6 # B[1]*M_Inverted[1][1]
  39. mflo $s3 # $s3 = B[1]*M_Inverted[1][1]
  40.  
  41. addu $t0, $s0, $s1 # $t0 = B[0]*M_Inverted[0][0] + B[1]*M_Inverted[0][1]
  42. addu $t1, $s2, $s3 # $t1 = B[0]*M_Invertida[1][0] + B[1]*M_Inverted[1][1]
  43.  
  44. la $a0, C # $a0 = &C
  45. sw $t0, 0($a0) # C[0] = B[0]*A_invertida[0][0] + B[1]*A_invertida[0][1]
  46. sw $t1, 4($a0) # C[1] = B[0]*A_invertida[1][0] + B[1]*A_invertida[1][1]
  47.  
  48. b endCode
  49. #################################################
  50.  
  51. inversa:
  52. addiu $sp, $sp, -20 # Creando el bloque de activación.
  53. sw $ra, 16($sp) # Salvando registros.
  54. sw $s0, 12($sp) # Registro para la Matriz.
  55. sw $s1, 8($sp) # Registro para la Matriz Inversa.
  56. sw $s2, 4($sp) # Registro para Aux.
  57. sw $s3, 0($sp) # Registro para Det.
  58. move $s0, $a0 # $s0 = &M[][]
  59. move $s1, $a1 # $s1 = &M_Inverted[][]
  60. move $s2, $a2 # $s2 = Aux
  61. move $s3, $a3 # $s3 = Det
  62. move $t0, $a2 # $t0 = N
  63.  
  64. bgt $t0, $zero, Determinant  # Si N es mayor que cero, va a la etiqueta 'Determinant'.
  65. b ignoreDeterminant #Si no se cumple lo anterior, se salta el cálculo del determinante.
  66. Determinant: jal determinant
  67.  
  68. ignoreDeterminant:
  69. move $s3, $v0 # El valor que nos retorna la función lo metemos en $s3.
  70. beq $s3, $zero, else # Si Det es igual a cero, salta al 'Else'.
  71.  
  72. # Cálculo de la Matriz Inversa.
  73. li $t9, -1 # $t9 = -1
  74. lw $t0, 0($a0) # $t0 = M[0][0] = 1
  75. lw $t1, 4($a0) # $t1 = M[0][1] = 2
  76. lw $t2, 8($a0) # $t2 = M[1][0] = 1
  77. lw $t3, 12($a0) # $t3 = M[1][1] = 1
  78.  
  79. div $t3, $s3 # M[1][1] / Det
  80. mflo $t4 # $t4 = M_Inverted[0][0]
  81. sw $t4, 0($a1)
  82.  
  83. div $t0, $s3 # M[0][0] / Det
  84. mflo $t5 # $t5 = M_Inverted[1][1]
  85. sw $t5, 12($a1)
  86.  
  87. multu $t9, $t1 # -1 * M[0][1]
  88. mflo $t6 # $t6 = -1 * M[0][1]
  89. div $t6, $s3 # -1 * M[0][1] / Det
  90. mflo $t6 # $t6 = M_Inverted[0][1]
  91. sw $t6, 4($a1)
  92.  
  93. multu $t9, $t2 # -1 * M[1][0]
  94. mflo $t7 # $t7 = -1 * M[1][0]
  95. div $t7, $s3 # -1 * M[1][0]
  96. mflo $t7 # $t7 = M_Inverted[1][0]
  97. sw $t7,8($a1)
  98.  
  99. li $s2, 1 # Aux = 1
  100.  
  101. b return #Evitamos el else, si venimos del if anterior.
  102.    
  103. else:
  104. li $s2, 0 # Aux = 0
  105.  
  106. return:
  107. move $v1, $s2 # Añadiendo el valor de Aux al retorno de la subrutina.
  108.  
  109. lw $ra, 16($sp) # Restaurando los registros.
  110. lw $s0, 12($sp)
  111. lw $s1, 8($sp)
  112. lw $s2, 4($sp)
  113. lw $s3, 0($sp)
  114. addiu $sp, $sp, 20 # Eliminando el bloque de activación.
  115. jr $ra
  116.  
  117. ################################################
  118.  
  119. determinant:
  120. lw $t0, 0($a0) # $t0 = M[0][0] = 1
  121. lw $t1, 4($a0) # $t1 = M[0][1] = 2
  122. lw $t2, 8($a0) # $t2 = M[1][0] = 1
  123. lw $t3, 12($a0) # $t3 = M[1][1] = 1
  124.  
  125. multu $t0, $t3 # $t0 * $t3 = M[0][0] * M[1][1]
  126. mflo $t0 # $t0 = M[0][0] * M[1][1]
  127.  
  128. multu $t1, $t2 # $t1 * $t2 = M[0][1] * M[1][0]
  129. mflo $t1 # $t1 = M[0][1] * M[1][0]
  130.  
  131. subu $v0, $t0, $t1 # return $v0: $v0 = $t0 - $t1
  132. jr $ra
  133. ################################################
  134.  
  135. endCode:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement