Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. section .bss
  2. value resb 32
  3. section .text
  4. GLOBAL _start
  5.  
  6. _start:
  7. mov rax, 0
  8. mov rdi, 0
  9. mov rsi, value
  10. mov rdx, 32
  11. syscall
  12. mov rdi, value
  13. call _strlen
  14. sub rax, 1
  15. mov rcx, rax
  16. lea rsi, [value]
  17. call string_to_int
  18.  
  19. push qword rax ; -> 1346269
  20. call fibonacci
  21. add rsp, 8
  22.  
  23. call write_rax
  24.  
  25. mov edi, 0 ; return 0 (success)
  26. mov eax, 60 ; sys_exit
  27. syscall
  28.  
  29. fibonacci:
  30. push rbp
  31. push rbx
  32.  
  33. mov rbp, rsp
  34. add rbp, 24
  35. mov ebx, [rbp]
  36.  
  37. cmp EBX,0 ; Check for base case
  38. je base ; It is base if (n <= 1)
  39.  
  40. cmp EBX,1
  41. je base2
  42.  
  43. lea ecx,[ebx-1]
  44. push rcx
  45. call fibonacci ; Calculate fibonacci for (EBX - 1)
  46. pop rcx
  47.  
  48. push rax
  49. lea ecx,[ebx-2]
  50. push rcx
  51. call fibonacci ; Calculate fibonacci for (EBX - 2)
  52. pop rcx
  53. pop rcx
  54. add eax,ecx ; eax = fibonacci(N-2) + fibonacci(N-1)
  55.  
  56. jmp end
  57. base: ; Base case
  58. mov EAX,2
  59. jmp end ; The result would be 1
  60.  
  61. base2: ; Base case
  62. mov EAX,1 ; The result would be 1
  63.  
  64. end:
  65. pop rbx
  66. pop rbp
  67. ret
  68.  
  69. write_rax:
  70. mov rsi, rsp ; Keyword: Red Zone (https://en.wikipedia.org/wiki/Red_zone_%28computing%29)
  71.  
  72. sub rsi, 1
  73. mov byte [rsi], `\n` ; Line feed
  74.  
  75. mov ecx, 10 ; Divisor
  76.  
  77. .L1:
  78. xor rdx, rdx
  79. div rcx ; EDX:EAX / ECX -> EAX, remainder EDX
  80. or dl, 48 ; Convert remainder to ASCII
  81. sub rsi, 1
  82. mov [rsi], dl ; Store remainder reversed on the stack
  83. test rax, rax
  84. jne .L1
  85.  
  86. mov rdx, rsp ; RDX: message string length
  87. sub rdx, rsi
  88. mov rdi, 1 ; RDI=1: stdout
  89. mov rax, 1 ; sys_write
  90. syscall ; /usr/include/x86_64-linux-gnu/asm/unistd_64.h
  91.  
  92. ret
  93.  
  94. string_to_int:
  95. xor rbx,rbx ; czysczę ebx
  96. l2:
  97. movzx rax,byte[rsi] ; ???
  98. inc rsi ; esi ++
  99. sub al,'0' ; najmniej znaczący bit - 48
  100. imul rbx,10 ; mnożenie ebax = ebax * 10
  101. add rbx,rax ; ebx += eax
  102. loop l2 ; while (--ecx)
  103. mov rax, rbx ; eax = ebx
  104. ret
  105.  
  106. _strlen:
  107.  
  108. push rcx ; save and clear out counter
  109. xor rcx, rcx
  110.  
  111. _strlen_next:
  112.  
  113. cmp [rdi], byte 0 ; null byte yet?
  114. jz _strlen_null ; yes, get out
  115.  
  116. inc rcx ; char is ok, count it
  117. inc rdi ; move to next char
  118. jmp _strlen_next ; process again
  119.  
  120. _strlen_null:
  121.  
  122. mov rax, rcx ; rcx = the length (put in rax)
  123.  
  124. pop rcx ; restore rcx
  125. ret ; get out
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement