Advertisement
enfiskutensykkel

ASM Sieve of Eratosthenes

Dec 3rd, 2020
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. .global main
  2. .extern printf
  3. .extern fprintf
  4. .extern stderr
  5. .extern atoi
  6. .extern malloc
  7. .extern free
  8.  
  9. .text
  10. fmt: .asciz "%d\n"
  11. usage: .asciz "Usage: %s N\n"
  12. errmsg: .asciz "N must be equal to or greater than 2\n"
  13.  
  14.  
  15. // Print number in rdx
  16. // This saves registers
  17. print_number:
  18. push %rbp
  19. mov %rsp, %rbp
  20.  
  21. push %rax
  22. push %rsi
  23. push %rdi
  24. push %rcx
  25. push %rdx
  26.  
  27. mov %rdx, %rsi
  28. mov $fmt, %rdi
  29. xor %rax, %rax
  30. call printf
  31.  
  32. pop %rdx
  33. pop %rcx
  34. pop %rdi
  35. pop %rsi
  36. pop %rax
  37.  
  38. leave
  39. ret
  40.  
  41.  
  42. // Initialize array
  43. // rdi = N
  44. // rsi = array address
  45. init_array:
  46. push %rbp
  47. mov %rsp, %rbp
  48. push %rdi
  49. push %rsi
  50.  
  51. mov (%rsp), %rdi
  52. xor %rax, %rax
  53.  
  54. _init_loop:
  55. cmp %rax, 8(%rsp)
  56. je _init_loop_exit
  57.  
  58. mov %eax, (%rsi, %rax, 4)
  59.  
  60. inc %rax
  61. jmp _init_loop
  62.  
  63. _init_loop_exit:
  64. leave
  65. ret
  66.  
  67.  
  68. // Sieve
  69. // rdi = N
  70. // rsi = array address
  71. // rdx = skip
  72. sieve:
  73. push %rbp
  74. mov %rsp, %rbp
  75. push %rdx
  76. push %rax
  77.  
  78. mov %rdx, %rax
  79.  
  80. _sieve_loop:
  81. cmp %rdi, %rax
  82. jge _sieve_exit
  83.  
  84. movl $0, (%rsi, %rax, 4)
  85.  
  86. add %rdx, %rax
  87. jmp _sieve_loop
  88.  
  89. _sieve_exit:
  90. pop %rax
  91. pop %rdx
  92. leave
  93. ret
  94.  
  95.  
  96. // Eratosthenes
  97. // rdi = N
  98. // rsi = array address
  99. eratosthenes:
  100. push %rbp
  101. mov %rsp, %rbp
  102.  
  103. mov $2, %rcx
  104.  
  105. _loop:
  106. cmp %rcx, %rdi
  107. je _leave
  108.  
  109. mov (%rsi, %rcx, 4), %edx
  110. cmp $0, %edx
  111. je _next
  112.  
  113. call print_number
  114. call sieve
  115.  
  116. _next:
  117. inc %rcx
  118. jmp _loop
  119.  
  120. _leave:
  121. leave
  122. ret
  123.  
  124.  
  125. main:
  126. push %rbp
  127. mov %rsp, %rbp
  128. mov %rsi, %r15
  129.  
  130. cmp $2, %rdi
  131. jne give_usage
  132.  
  133. // Get argument from argv[1]
  134. mov 8(%r15), %rdi
  135. call atoi
  136. cmp $2, %rax
  137. jl print_error
  138. inc %rax
  139. push %rax # save N
  140.  
  141. // Call malloc
  142. mov (%rsp), %rdi # N
  143. shl $2, %rdi # N * sizeof(int)
  144. call malloc
  145. push %rax # save pointer
  146.  
  147. // Initialize array
  148. mov 8(%rsp), %rdi # N
  149. mov (%rsp), %rsi # array
  150. call init_array
  151.  
  152. // Sieve of Eratosthenes
  153. mov 8(%rsp), %rdi
  154. mov (%rsp), %rsi
  155. call eratosthenes
  156.  
  157. // Free memory
  158. mov (%rsp), %rdi # move array to arg0
  159. call free
  160.  
  161. leave
  162. xor %rax, %rax
  163. ret
  164.  
  165. print_error:
  166. mov stderr, %rdi
  167. mov $errmsg, %rsi
  168. xor %rax, %rax
  169. call fprintf
  170.  
  171. give_usage:
  172. mov (%r15), %rdx
  173. mov $usage, %rsi
  174. mov stderr, %rdi
  175. xor %rax, %rax
  176. call fprintf
  177. mov $1, %rax
  178.  
  179. leave
  180. ret
  181.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement