Untitled

 avatar
unknown
plain_text
3 years ago
1.4 kB
2
Indexable
; ----------------------------------------------------------------
; A 64-bit Linux application that writes the first 90 Fibonacci
numbers. To
; assemble and run:
; nasm -felf64 fib.asm && gcc fib.o && ./a.out
; ----------------------------------------------------------------
global main
extern printf
section .text
main:
push rbx ; we have to save this since we use it
mov ecx, 90 ; ecx will countdown to 0
xor rax, rax ; rax will hold the current number
xor rbx, rbx ; rbx will hold the next number
inc rbx ; rbx is originally 1
print:
; We need to call printf, but we are using rax, rbx, and
rcx. printf
; may destroy rax and rcx so we will save these before the
call and
; restore them afterwards.
push rax ; caller-save register
push rcx ; caller-save register
mov rdi, format ; set 1st parameter (format)
mov rsi, rax ; set 2nd parameter
(current_number)
xor rax, rax ; because printf is varargs
; Stack is already aligned because we pushed three 8 byte
registers
call printf ; printf(format, current_number)
pop rcx ; restore caller-save register
pop rax ; restore caller-save register
mov rdx, rax ; save the current number
mov rax, rbx ; next number is now current
add rbx, rdx ; get the new next number
dec ecx ; count down
jnz print ; if not done counting, do some more
pop rbx ; restore rbx before returning
ret
format:
db "%20ld", 10, 0