Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.81 KB | None | 0 0
  1. #-------------------------------------------------------------
  2. # spim doubly-linked list insertion, removal
  3. #-------------------------------------------------------------
  4.  
  5. .data
  6. newline: .asciiz "\n" # places the newline character in memory
  7. space: .asciiz " "
  8. list: .word 0, 0
  9. listitem1: .word 8, 0, 0
  10. listitem2: .word 5, 0, 0
  11. listitem3: .word 1, 0, 0
  12. listitem4: .word 12, 0, 0
  13. listitem5: .word 3, 0, 0
  14. listitem6: .word 9, 0, 0
  15. listitem7: .word 7, 0, 0
  16.  
  17. .text
  18.  
  19. main: #program initial entry point
  20. sub $sp, $sp, 12 # allocate some stack space
  21. sw $s0, 0($sp) # free up a callee saved register for list
  22. sw $s1, 4($sp) # free up a callee saved register for listitem pointer
  23. sw $ra, 8($sp) # save return address
  24.  
  25. la $s0, list #
  26. sw $zero, 0($s0) # zero out the head pointer
  27. sw $zero, 4($s0) # and tail pointer
  28.  
  29. la $a0, listitem1 # insert listitem1 at head
  30. li $a1, 0
  31. move $a2, $s0
  32. jal insert_element_after
  33.  
  34. la $a0, listitem2 # insert listitem2 after listitem1
  35. la $a1, listitem1
  36. move $a2, $s0
  37. jal insert_element_after
  38.  
  39. la $s1, listitem3
  40.  
  41. m_loop: move $a0, $s1 # insert listitem3-6 at head
  42. add $s1, $s1, 12 # point pointer in $s0 to next listitem
  43. li $a1, 0
  44. move $a2, $s0
  45. jal insert_element_after
  46. la $t0, listitem6
  47. ble $s1, $t0, m_loop # insert next element
  48.  
  49. la $a0, listitem7 # insert listitem7 after listitem4
  50. la $a1, listitem4
  51. move $a2, $s0
  52. jal insert_element_after
  53.  
  54. lw $a0, 0($s0)
  55. jal print_list # should print "9 3 12 7 1 8 5"
  56. jal print_newline
  57.  
  58. la $a0, listitem2 # remove listitem2 (5)
  59. move $a1, $s0
  60. jal remove_element
  61.  
  62. la $a0, listitem6 # remove listitem6 (9)
  63. move $a1, $s0
  64. jal remove_element
  65.  
  66. la $a0, listitem4 # remove listitem4 (12)
  67. move $a1, $s0
  68. jal remove_element
  69.  
  70. lw $a0, 0($s0)
  71. jal print_list # should print "3 7 1 8"
  72. jal print_newline
  73.  
  74. lw $s0, 0($sp) # restore $s0
  75. lw $s1, 4($sp) # restore $s1
  76. lw $ra, 8($sp) # restore return address
  77. add $sp, $sp, 12 # deallocate stack space
  78. jr $ra
  79.  
  80. print_list: # a recursive version of the the print list function.
  81. # prints the list starting from $a0
  82. bne $a0, $zero, pl_do
  83. jr $ra
  84.  
  85. pl_do:
  86. sub $sp, $sp, 8 # adjust sp for two words
  87. sw $ra, 0($sp) # save the return address
  88. sw $s0, 4($sp) # save s0
  89. move $s0, $a0 # make a backup copy of the current element
  90.  
  91. lw $a0, 0($s0) # load the value into $a0
  92. li $v0, 1 # syscall code 1 prints an integer
  93. syscall # print integer
  94.  
  95. la $a0, space # store address of space for printing
  96. li $v0, 4 # syscall code 4 prints a string
  97. syscall # print string @ 0($a0)
  98.  
  99. lw $a0, 8($s0)
  100. jal print_list
  101.  
  102. lw $ra, 0($sp) # restore the return address
  103. lw $s0, 4($sp)
  104. add $sp, $sp, 8 # adjust sp
  105. jr $ra
  106. # END print_list
  107.  
  108. print_newline:
  109. # prints out \n
  110. la $a0, newline # store address of newline for printing
  111. li $v0, 4 # syscall code 4 prints a string
  112. syscall # print string @ 0($a0)
  113. jr $ra # return from print_newline
  114. # END print_newline
  115.  
  116. # ALL your code goes below this line.
  117. #
  118. # We will delete EVERYTHING above the line; DO NOT delete the line.
  119. #
  120. # ---------------------------------------------------------------------
  121.  
  122. insert_element_after:
  123.  
  124. # lw $t0, 8($a0)
  125. # lw $t1, 4($a0)
  126. # lw $t2, 0($a2)
  127. # lw $t3, 4($t2)
  128. # lw $t4, 4($a2)
  129. # lw $t5, 4($a1)
  130. # lw $t6, 4($t0)
  131.  
  132. lw $t0, 0($a1) # load prev
  133. bne $t0, $0, second_main_if
  134.  
  135. lw $t0, 0($a2) # load mylist->head
  136. sw $t0, 8($a0) # store into node->next
  137.  
  138. sw $0, 4($a0) # store null into node->rev
  139.  
  140. lw $t0, 0($a2) # load mylist->head
  141. beq $t0, $0, end_if_1
  142. lw $t0, 0($a2) # load mylist->head
  143. lw $a0, 4($t0) # store null = head->rev
  144.  
  145. end_if_1:
  146. sw $a0, 0($a2) # store null into mylist->head
  147.  
  148. lw $t0, 4($a2) # load mylist->tail
  149. bne $t0, $0, insert_element_return
  150. sw $a0, 4($a2) # store mylist->tail = null
  151.  
  152. insert_element_return:
  153. jr $ra
  154.  
  155. second_main_if:
  156. lw $t0, 4($a1) # load prev->next
  157. bne $t0, $0, if_else
  158. sw $0, 8($a0) # store null into node->next
  159. sw $a0, 4($a2) # store into mylist->tail
  160. j after_else
  161.  
  162. if_else:
  163. lw $t0, 4($a1) # load prev->next
  164. sw $t0, 8($a0) # store prev->next into node->next
  165.  
  166. lw $t0, 8($a0) # load node->next
  167. sw $a0, 4($t0) # store node into node->next->prev
  168.  
  169. after_else:
  170. sw $a0, 4($a1) # store node into prev->next
  171. sw $a1, 4($a0) # store rev into node->prev
  172.  
  173. jr $ra
  174. # END insert_element_after
  175.  
  176.  
  177. remove_element:
  178.  
  179. # lw $t0, 8($a0)
  180. # lw $t1, 4($a0)
  181. # lw $t2, 0($a2)
  182. # lw $t3, 4($t2)
  183. # lw $t4, 4($a2)
  184. # lw $t5, 4($a1)
  185. # lw $t6, 4($t0)
  186. # lw $t7, 8($t1)
  187.  
  188.  
  189. lw $t0, 0($a2) # load mylist->head
  190. lw $t1, 4($a2) # load mylist->tail
  191. bne $t0, $t1, else_if_1
  192.  
  193. sw $0, 0($t0) # store null into mylist->head
  194. sw $0, 0($t1) # store null into mylist->tail
  195. j end_if_statements
  196.  
  197. else_if_1:
  198. lw $t0, 4($a0) # load node->prev
  199. bne $t0, $0, else_if_2
  200. lw $t0, 8($a0) # load node->next
  201. sw $t0, 0($a2) # store node-> into mylist->head
  202. sw $0, 4($t0) # store null into node->next->prev
  203. j end_if_statements
  204.  
  205. else_if_2:
  206. lw $t0, 8($a0) # load node->next
  207. bne $t0, $0, else_if_3
  208. lw $t0, 4($a0) # load node->prev
  209. sw $t0, 4($a2) # store node->prev into mylist->tail
  210. lw $t0, 4($a0) # load node->prev
  211. sw $0, 8($t0) # store null into node->prev->next
  212. j end_if_statements
  213.  
  214. else_if_3:
  215. lw $t0, 8($a0) # load node->next
  216. lw $t1, 4($a0) # load node->prev
  217. sw $t0, 8($t1) # store node->next into node->prev->next
  218.  
  219. lw $t0, 4($a0) # load node->prev
  220. lw $t1, 8($a0) # load node->next
  221. sw $t0, 4($t1)
  222.  
  223. end_if_statements:
  224. sw $0, 8($a0) # store null into node->next
  225. sw $0, 4($a0) # store null into node->prev
  226.  
  227. jr $ra
  228. # END remove_element
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement