Advertisement
Guest User

Untitled

a guest
Jul 7th, 2019
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.62 KB | None | 0 0
  1. .data
  2. msg1: .asciiz "The matrix\n"
  3. msg2: .asciiz "is an identity matrix\n"
  4. msg3: .asciiz "is not an identity matrix\n"
  5.  
  6. ## Requires (from `matrixX.s'):
  7. # - N (word): matrix dimensions
  8. # - m (word[N][N]): matrix
  9.  
  10. ## Provides:
  11. .globl main
  12. .globl showMatrix
  13. .globl isIdent
  14.  
  15. # .TEXT <main> #########################################################
  16. .text
  17. main:
  18.  
  19. # Frame: $fp, $ra
  20. # Uses: $a0, $v0
  21. # Clobbers: $a0
  22. #
  23. # Locals: [none]
  24. #
  25. # Structure:
  26. # main
  27. # -> [prologue]
  28. # -> main_isi
  29. # -> main_isi_t
  30. # -> main_isi_f
  31. # => main_isi_phi
  32. # -> [epilogue]
  33. #
  34. # Code:
  35. # set up stack frame
  36. addi $sp, $sp, -4
  37. sw $fp, ($sp) # push $fp
  38. la $fp, ($sp) # load new $fp
  39. addi $sp, $sp, -4
  40. sw $ra, ($sp) # push $ra
  41.  
  42. la $a0, msg1
  43. li $v0, 4
  44. syscall # printf("The matrix\n")
  45.  
  46. la $a0, m # + from &m[0][0]
  47. lw $a1, N # | + from *N
  48. jal showMatrix # showMatrix(m,N)
  49. nop #[branch delay]
  50.  
  51. la $a0, m # + from &m[0][0]
  52. lw $a1, N # | + from *N
  53. jal isIdent # isIdent(m,N)
  54.  
  55. beqz $v0, main_isi_f
  56. nop #[branch delay]
  57. main_isi_t:
  58. la $a0, msg2
  59. li $v0, 4
  60. syscall # printf("is an identity matrix\n")
  61.  
  62. j main_isi_phi
  63. main_isi_f:
  64. la $a0, msg3
  65. li $v0, 4
  66. syscall # printf("is not an identity matrix\n")
  67.  
  68. main_isi_phi:
  69.  
  70. main__epi:
  71. # tear down stack frame
  72. lw $ra, ($sp) # pop $ra
  73. addi $sp, $sp, 4
  74. lw $fp, ($sp) # pop $fp
  75. addi $sp, $sp, 4
  76.  
  77. li $v0, 0
  78. jr $ra # return 0
  79.  
  80.  
  81. # .TEXT <showMatrix> ###################################################
  82. .text
  83. showMatrix:
  84.  
  85. # Frame: $fp, $ra, $s0, $s1, $s2, $s3
  86. # Uses: $a0, $a1, $a1, $s0, $s1, $s2, $s3, $t0, $t1
  87. # Clobbers: $a0, $t0, $t1
  88. #
  89. # Locals:
  90. # - `m' in $s0 (from $a0)
  91. # - `N' in $s1 (from $a1)
  92. # - `row' in $s2
  93. # - `col' in $s3
  94. #
  95. # Structure:
  96. # showMatrix
  97. # -> [prologue]
  98. # -> showM_row_init
  99. # -> showM_row_cond
  100. # -> showM_col_init
  101. # -> showM_col_cond
  102. # -> showM_col_step
  103. # => showM_col_f
  104. # -> showM_row_step
  105. # => showM_row_f
  106. # -> [epilogue]
  107. #
  108. # Code:
  109. # set up stack frame
  110. addi $sp, $sp, -4
  111. sw $fp, ($sp) # push $fp
  112. la $fp, ($sp)
  113. addi $sp, $sp, -4
  114. sw $ra, ($sp) # push $ra
  115. addi $sp, $sp, -4
  116. sw $s0, ($sp) # push $s0
  117. addi $sp, $sp, -4
  118. sw $s1, ($sp) # push $s1
  119. addi $sp, $sp, -4
  120. sw $s2, ($sp) # push $s2
  121. addi $sp, $sp, -4
  122. sw $s3, ($sp) # push $s3
  123.  
  124. move $s0, $a0
  125. move $s1, $a1
  126.  
  127. showM_row_init:
  128. li $s2, 0 # row = 0
  129. showM_row_cond:
  130. bge $s2, $s1, showM_row_f # row < n || row >= n
  131. nop #[branch delay]
  132.  
  133. showM_col_init:
  134. li $s3, 0 # col = 0
  135. showM_col_cond:
  136. bge $s3, $s1, showM_col_f # col < n || col >= n
  137. nop #[branch delay]
  138.  
  139. li $a0, ' '
  140. li $v0, 11
  141. syscall # putchar(' ')
  142.  
  143. # printf ("%d", m[row][col]):
  144. # m[row][col] = *(&m[0][0] + (row * N) + col)
  145. mul $t0, $s2, $s1 # % <- row * N
  146. add $t0, $t0, $s3 # + col
  147. li $t1, 4
  148. mul $t0, $t0, $t1 # * sizeof(word)
  149. addu $t0, $s0, $t0 # + &m[0][0]
  150. lw $a0, ($t0)
  151. li $v0, 1
  152. syscall # printf("%d", *%)
  153.  
  154. showM_col_step:
  155. addi $s3, $s3, 1 # col++
  156. j showM_col_cond
  157. nop #[branch delay]
  158. showM_col_f:
  159.  
  160. li $a0, '\n'
  161. li $v0, 11
  162. syscall # putchar('\n')
  163.  
  164. showM_row_step:
  165. addi $s2, $s2, 1 # row++
  166. j showM_row_cond
  167. nop #[branch delay]
  168. showM_row_f:
  169.  
  170. showM__epi:
  171. # tear down stack frame
  172. lw $s3, ($sp) # pop $s3
  173. addi $sp, $sp, 4
  174. lw $s2, ($sp) # pop $s2
  175. addi $sp, $sp, 4
  176. lw $s1, ($sp) # pop $s1
  177. addi $sp, $sp, 4
  178. lw $s0, ($sp) # pop $s0
  179. addi $sp, $sp, 4
  180. lw $ra, ($sp) # pop $ra
  181. addi $sp, $sp, 4
  182. lw $fp, ($sp) # pop $fp
  183. addi $sp, $sp, 4
  184. jr $ra
  185.  
  186. # .TEXT <isIdent> ######################################################
  187. .text
  188. isIdent:
  189.  
  190. # Frame: $fp, $ra, $s0, $s1, $s2, $s3, [... frame ...]
  191. # Uses: [... registers used ...]
  192. # Clobbers: [... registers clobbered ...]
  193. #
  194. # Locals:
  195. # - `m' in [reg] (from $a0)
  196. # - `n' in [reg] (from $a1)
  197. # - [`var' in reg]
  198. #
  199. # Structure:
  200. # isIdent
  201. # -> [prologue]
  202. # -> ...
  203. # -> [epilogue]
  204. #
  205. # Code:
  206. # set up stack frame
  207. addi $sp, $sp, -4
  208. sw $fp, ($sp) # push $fp
  209. la $fp, ($sp)
  210. addi $sp, $sp, -4
  211. sw $ra, ($sp) # push $ra
  212. addi $sp, $sp, -4
  213. sw $s0, ($sp) # push $s0 #row
  214. addi $sp, $sp, -4
  215. sw $s1, ($sp) # push $s1 #col
  216. addi $sp, $sp, -4
  217. sw $s2, ($sp) # push $s2
  218. addi $sp, $sp, -4
  219. sw $s3, ($sp) # push $s3
  220.  
  221. move $s0, $a0
  222. move $s1, $a1
  223.  
  224. is_row_init:
  225. li $s2, 0 # row = 0
  226. is_row_cond:
  227. bge $s2, $s1, is_row_f # row < n || row >= n
  228. nop #[branch delay]
  229.  
  230. is_col_init:
  231. li $s3, 0 # col = 0
  232. is_col_cond:
  233. bge $s3, $s1, is_col_f # col < n || col >= n
  234. nop #[branch delay]
  235.  
  236. # m[row][col] = *(&m[0][0] + (row * N) + col)
  237. mul $t0, $s2, $s1 # % <- row * N
  238. add $t0, $t0, $s3 # + col
  239. li $t1, 4
  240. mul $t0, $t0, $t1 # * sizeof(word)
  241. addu $t0, $s0, $t0 # + &m[0][0]
  242.  
  243. ## if m[r][c] != 1
  244. m_if_1:
  245. bne $t0, 1, row_if_1
  246.  
  247. ## if m[r][c] != 0
  248. m_if_2:
  249. bnez $t0, row_if_2
  250. j is_col_step
  251.  
  252. ## if row = col
  253. row_if_1:
  254. beq $s2, $s3, return_0
  255. j is_col_step
  256.  
  257. ## if row != col
  258. row_if_2:
  259. bne $s2, $s3, return_0
  260.  
  261. is_col_step:
  262. addi $s3, $s3, 1 # col++
  263. j is_col_cond
  264. nop #[branch delay]
  265. is_col_f:
  266.  
  267. is_row_step:
  268. addi $s2, $s2, 1 # row++
  269. j is_row_cond
  270. nop #[branch delay]
  271. is_row_f:
  272.  
  273. # tear down stack frame
  274. # If you saved more than four $s? registers,
  275. # add extra code here to restore them.
  276.  
  277. base:
  278. li $v0, 1
  279. j go_back
  280.  
  281. return_0:
  282. li $v0, 0
  283. j go_back
  284.  
  285. go_back:
  286. lw $s3, ($sp) # pop $s3
  287. addi $sp, $sp, 4
  288. lw $s2, ($sp) # pop $s2
  289. addi $sp, $sp, 4
  290. lw $s1, ($sp) # pop $s1
  291. addi $sp, $sp, 4
  292. lw $s0, ($sp) # pop $s0
  293. addi $sp, $sp, 4
  294. lw $ra, ($sp) # pop $ra
  295. addi $sp, $sp, 4
  296. lw $fp, ($sp) # pop $fp
  297. addi $sp, $sp, 4
  298. jr $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement