Advertisement
sarker306

Fibonacci Number in x86-64 NASM syntax

Dec 23rd, 2019
319
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; nasm -f elf64 -o filename.o -l filename.lst filename.asm
  2. ; ld -o executablename filename.o
  3.     section .data
  4. a       dq      1   ; 0th fibonacci
  5. b       dq      0
  6. fmt2    db      "  th Fibonacci:           ", 10, 0
  7.  
  8.     section .text
  9.     global  _start 
  10. _start:
  11.     push    rbp         ; save rbp
  12.     mov     rbp, rsp    ; rbp is caller's stack
  13.     xor     rcx, rcx
  14.     push    rcx         ; contains iter count
  15.  
  16. load_numbers:
  17.     mov     r9, qword [a]
  18.     mov     r8, qword [b]
  19.  
  20. xchg_add_r9_r8:
  21.     xchg    r9, r8      ;xadd   r9, r8 ;this can work thoo
  22.     add     r9, r8      ; r9 = r9 + r8, r8 = r9
  23.     mov     qword[a], r9
  24.     mov     qword[b], r8
  25.  
  26.     cmp     r8, 0x7fffffff
  27.     jge     end_loop
  28.  
  29.     pop     rcx
  30.     inc     rcx
  31.     push    rcx
  32.  
  33. write_number_to_fmt2:
  34.     mov     rax, r9     ; write the current fibonacci number to fmt2
  35.     mov     rdi, fmt2
  36.     add     rdi, 26
  37.     mov     r10, 10d
  38. .digit_write:           ; write into .fmt2, one char at a time
  39.     dec     rdi
  40.     xor     rdx, rdx
  41.     div     r10         ; after division, rax=quotient, rdx=remainder
  42.     mov     byte [rdi], dl
  43.     add     byte [rdi], 0x30
  44.     cmp     rax, 0x0    ; if no more division, rax should be 0
  45.     jnz     .digit_write
  46.    
  47. write_ecx_to_fmt2:
  48.     mov     rax, rcx    ; write the iteration count to fm2
  49.     mov     rdi, fmt2
  50.     add     rdi, 2
  51.     mov     r10, 10d
  52. .digit_write2:          ; same as .digit_write above
  53.     dec     rdi
  54.     xor     rdx, rdx
  55.     div     r10
  56.     mov     byte [rdi], dl
  57.     add     byte [rdi], 0x30
  58.     cmp     rax, 0x0
  59.     jnz     .digit_write2
  60.  
  61. print_fmt2_to_stdout:
  62.     mov     rax, 1      ; syscall 1 is write
  63.     mov     rdi, 1      ; first parameter 1 is stdout
  64.     mov     rsi, fmt2   ; 2nd parameter, output str addr
  65.     mov     rdx, 28     ; 3rd parameter, output bytes#
  66.     syscall
  67.  
  68.     jmp     load_numbers
  69.  
  70. end_loop:
  71.     pop     rcx
  72.     mov     rsp, rbp    ; restore caller's stack frame
  73.     pop     rbp
  74.     ;mov        rax, 0
  75.     ;ret                ; you cannot ret from a raw process
  76.     mov     rax, 60     ; syscall 60 is sys_exit
  77.     xor     rdi, rdi    ; first parameter is exit_status = 0
  78.     syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement