Advertisement
Guest User

finished

a guest
Apr 17th, 2014
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1.  
  2. # char array[100];
  3. # int size = 100;
  4. #
  5. # void main() {
  6. # sieve(array, size);
  7. # for (int i = 0; i < size; i++)
  8. # if (array[i] == 1)
  9. # printf("%d\n", i);
  10. # }
  11. #
  12. # void sieve(char * array, int size) {
  13. # array[0] = 0;
  14. # array[1] = 0;
  15. # for (int i = 2; i < size; i++)
  16. # array[i] = 1;
  17. # for (int i = 2; i * i < size; i++)
  18. # if (array[i] == 1)
  19. # for (int j = 2 * i; j < size; j += i)
  20. # array[j] = 0;
  21. # }
  22.  
  23. .data
  24.  
  25. array: .space 100
  26. size: .word 100
  27.  
  28. .text
  29.  
  30. main: la $s0, array
  31. lw $s1, size
  32. addi $a0, $s0, 0
  33. addi $a1, $s1, 0
  34. jal sieve
  35. add $t0, $zero, $zero
  36. m_loop: slt $t1, $t0, $s1
  37. beq $t1, $zero, m_done
  38. add $t1, $s0, $t0
  39. lbu $t1, 0($t1)
  40. beq $t1, $zero, m_skip
  41. addi $v0, $zero, 1
  42. addi $a0, $t0, 0
  43. syscall # print integer
  44. addi $v0, $zero, 11
  45. addi $a0, $zero, 10
  46. syscall # print character '\n'
  47. m_skip: addi $t0, $t0, 1
  48. j m_loop
  49. m_done: addi $v0, $zero, 10
  50. syscall # terminate the program
  51.  
  52. # populate array
  53. sieve: la $a0, array
  54. lw $t1, 0($a0) # load first value
  55. add $t0, $zero, $zero # set index to 0
  56. loop1: beq $t0, $s1, next1 # break when we we get to end
  57. addi $t1, $zero, 1 # set entry to 1
  58. sb $t1, 0($a0) # store entry at index
  59. addi $a0, $a0, 1 # increment pointer
  60. addi $t0, $t0, 1 # increment index
  61. j loop1 # loop
  62.  
  63. # remove non-prime
  64. next1: la $a0, array
  65. lw $t1, 0($a0) # load first value
  66. add $t0, $zero, $zero # set index to 0
  67. add $t1, $zero, $zero # zero data
  68. sb $t1, 0($a0) # 0 is not prime
  69. addi $t0, $t0, 1 # increment counter
  70. addi $a0, $a0, 1 # increment pointer
  71. sb $t1, 0($a0) # 1 is not prime
  72. addi $t0, $t0, 1 # increment counter
  73. addi $a0, $a0, 1 # increment pointer
  74.  
  75. addi $t2, $zero, 2 # first prime
  76.  
  77. loop2: div $s1, $t2 # is this the largest factor?
  78. mflo $t3 # quotient
  79. blt $t3, $t2, s_done # finished seiving
  80. add $t0, $zero, $zero # reset counter
  81. la $a0, array # reset pointer
  82. add $t0, $t0, $t2 # set counter to current prime
  83. add $a0, $a0, $t2 # set pointer to current position
  84. loop3: beq $t0, $s1, inc # end of array
  85. add $a0, $a0, $t2 # increment pointer
  86. add $t1, $zero, $zero # set entry to 0 (not prime)
  87. sb $t1, 0($a0) # store entry at index
  88. addi $t0, $t0, 1 # increment index
  89. j loop3 # loop
  90. inc: addi $t2, $t2, 1 # increment factor
  91. j loop2 # loop
  92.  
  93. s_done: jr $ra # return to main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement