mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-09-22 10:43:39 -04:00
Code for testcase provided by Suhwan. Reported-by: Suhwan <prada960808@gmail.com> Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
47 lines
2.0 KiB
NASM
47 lines
2.0 KiB
NASM
; -----------------------------------------------------------------------------
|
|
; 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
|