Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; nasm -f elf64 -o filename.o -l filename.lst filename.asm
- ; ld -o executablename filename.o
- section .data
- a dq 1 ; 0th fibonacci
- b dq 0
- fmt2 db " th Fibonacci: ", 10, 0
- section .text
- global _start
- _start:
- push rbp ; save rbp
- mov rbp, rsp ; rbp is caller's stack
- xor rcx, rcx
- push rcx ; contains iter count
- load_numbers:
- mov r9, qword [a]
- mov r8, qword [b]
- xchg_add_r9_r8:
- xchg r9, r8 ;xadd r9, r8 ;this can work thoo
- add r9, r8 ; r9 = r9 + r8, r8 = r9
- mov qword[a], r9
- mov qword[b], r8
- cmp r8, 0x7fffffff
- jge end_loop
- pop rcx
- inc rcx
- push rcx
- write_number_to_fmt2:
- mov rax, r9 ; write the current fibonacci number to fmt2
- mov rdi, fmt2
- add rdi, 26
- mov r10, 10d
- .digit_write: ; write into .fmt2, one char at a time
- dec rdi
- xor rdx, rdx
- div r10 ; after division, rax=quotient, rdx=remainder
- mov byte [rdi], dl
- add byte [rdi], 0x30
- cmp rax, 0x0 ; if no more division, rax should be 0
- jnz .digit_write
- write_ecx_to_fmt2:
- mov rax, rcx ; write the iteration count to fm2
- mov rdi, fmt2
- add rdi, 2
- mov r10, 10d
- .digit_write2: ; same as .digit_write above
- dec rdi
- xor rdx, rdx
- div r10
- mov byte [rdi], dl
- add byte [rdi], 0x30
- cmp rax, 0x0
- jnz .digit_write2
- print_fmt2_to_stdout:
- mov rax, 1 ; syscall 1 is write
- mov rdi, 1 ; first parameter 1 is stdout
- mov rsi, fmt2 ; 2nd parameter, output str addr
- mov rdx, 28 ; 3rd parameter, output bytes#
- syscall
- jmp load_numbers
- end_loop:
- pop rcx
- mov rsp, rbp ; restore caller's stack frame
- pop rbp
- ;mov rax, 0
- ;ret ; you cannot ret from a raw process
- mov rax, 60 ; syscall 60 is sys_exit
- xor rdi, rdi ; first parameter is exit_status = 0
- syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement