Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # char array[100];
- # int size = 100;
- #
- # void main() {
- # sieve(array, size);
- # for (int i = 0; i < size; i++)
- # if (array[i] == 1)
- # printf("%d\n", i);
- # }
- #
- # void sieve(char * array, int size) {
- # array[0] = 0;
- # array[1] = 0;
- # for (int i = 2; i < size; i++)
- # array[i] = 1;
- # for (int i = 2; i * i < size; i++)
- # if (array[i] == 1)
- # for (int j = 2 * i; j < size; j += i)
- # array[j] = 0;
- # }
- .data
- array: .space 100
- size: .word 100
- .text
- main: la $s0, array
- lw $s1, size
- addi $a0, $s0, 0
- addi $a1, $s1, 0
- jal sieve
- add $t0, $zero, $zero
- m_loop: slt $t1, $t0, $s1
- beq $t1, $zero, m_done
- add $t1, $s0, $t0
- lbu $t1, 0($t1)
- beq $t1, $zero, m_skip
- addi $v0, $zero, 1
- addi $a0, $t0, 0
- syscall # print integer
- addi $v0, $zero, 11
- addi $a0, $zero, 10
- syscall # print character '\n'
- m_skip: addi $t0, $t0, 1
- j m_loop
- m_done: addi $v0, $zero, 10
- syscall # terminate the program
- # populate array
- sieve: la $a0, array
- lw $t1, 0($a0) # load first value
- add $t0, $zero, $zero # set index to 0
- loop1: beq $t0, $s1, next1 # break when we we get to end
- addi $t1, $zero, 1 # set entry to 1
- sb $t1, 0($a0) # store entry at index
- addi $a0, $a0, 1 # increment pointer
- addi $t0, $t0, 1 # increment index
- j loop1 # loop
- # remove non-prime
- next1: la $a0, array
- lw $t1, 0($a0) # load first value
- add $t0, $zero, $zero # set index to 0
- add $t1, $zero, $zero # zero data
- sb $t1, 0($a0) # 0 is not prime
- addi $t0, $t0, 1 # increment counter
- addi $a0, $a0, 1 # increment pointer
- sb $t1, 0($a0) # 1 is not prime
- addi $t0, $t0, 1 # increment counter
- addi $a0, $a0, 1 # increment pointer
- addi $t2, $zero, 2 # first prime
- loop2: div $s1, $t2 # is this the largest factor?
- mflo $t3 # quotient
- blt $t3, $t2, s_done # finished seiving
- add $t0, $zero, $zero # reset counter
- la $a0, array # reset pointer
- add $t0, $t0, $t2 # set counter to current prime
- add $a0, $a0, $t2 # set pointer to current position
- loop3: beq $t0, $s1, inc # end of array
- add $a0, $a0, $t2 # increment pointer
- add $t1, $zero, $zero # set entry to 0 (not prime)
- sb $t1, 0($a0) # store entry at index
- addi $t0, $t0, 1 # increment index
- j loop3 # loop
- inc: addi $t2, $t2, 1 # increment factor
- j loop2 # loop
- s_done: jr $ra # return to main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement