Advertisement
STANAANDREY

fibo n digit

Nov 4th, 2024 (edited)
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. section .data
  2.     newline db 10
  3.  
  4. section .bss
  5.     n resb 2
  6.     ans resb 8     ; increased buffer size for larger numbers
  7.  
  8. section .text
  9. global _start
  10.  
  11. _start:
  12.     ; read n
  13.     mov rax, 0      
  14.     mov rdi, 0      
  15.     mov rsi, n      
  16.     mov rdx, 2      
  17.     syscall        
  18.  
  19.     ; convert ASCII input to number
  20.     movzx rax, byte [n]    
  21.     sub rax, '0'          
  22.    
  23.     ; init first 2 elements
  24.     mov rbx, 0     ; f0
  25.     mov rcx, 1     ; f1
  26.  
  27.     ; store counter
  28.     mov r8, rax    
  29.     mov rax, 1     ; i = 1
  30.  
  31. fib_loop:
  32.     cmp rax, r8    
  33.     jge out_fib_loop    
  34.  
  35.     mov rdx, rbx  
  36.     add rdx, rcx  
  37.     mov rbx, rcx  
  38.     mov rcx, rdx  
  39.  
  40.     inc rax        
  41.     jmp fib_loop
  42.  
  43. out_fib_loop:
  44.     ; Convert number in rcx to ASCII string
  45.     mov rax, rcx    ; number to convert is in rcx
  46.     mov rbx, 10     ; divisor
  47.     mov rdi, ans    ; where to store the string
  48.     add rdi, 7      ; point to end of buffer
  49.     mov byte [rdi], 0   ; null terminator
  50.    
  51.     ; Convert to string (reverse order)
  52. convert_loop:
  53.     dec rdi
  54.     xor rdx, rdx    ; clear rdx for division
  55.     div rbx         ; divide rax by 10
  56.     add dl, '0'     ; convert remainder to ASCII
  57.     mov [rdi], dl   ; store digit
  58.     test rax, rax   ; check if quotient is 0
  59.     jnz convert_loop
  60.  
  61.     ; Calculate string length
  62.     mov rdx, ans    
  63.     add rdx, 7      ; point to end of buffer
  64.     sub rdx, rdi    ; rdx = length of string
  65.  
  66.     ; Print the result
  67.     mov rax, 1      
  68.     mov rsi, rdi    ; point to start of number
  69.     mov rdi, 1      
  70.     syscall        
  71.  
  72.     ; Print newline
  73.     mov rax, 1
  74.     mov rdi, 1
  75.     mov rsi, newline
  76.     mov rdx, 1
  77.     syscall
  78.  
  79.     ; Exit
  80.     mov rax, 60    
  81.     xor rdi, rdi    
  82.     syscall        
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement