Advertisement
Guest User

Untitled

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