1                                  ; fib_64m.asm  using 64 bit memory more like C code
     2                                  ; // fib.c  same as computation as fib_64m.asm
     3                                  ; #include <stdio.h>
     4                                  ; int main(int argc, char *argv[])
     5                                  ; {
     6                                  ;   long int c = 95;  // loop counter
     7                                  ;   long int a = 1;   // current number, becomes next
     8                                  ;   long int b = 2;   // next number, becomes sum a+b
     9                                  ;   long int d;       // temp
    10                                  ;   printf("fibinachi numbers\n");
    11                                  ;   for(c=c; c!=0; c--)
    12                                  ;   {
    13                                  ;     printf("%21ld\n",a);
    14                                  ;     d = a;
    15                                  ;     a = b;
    16                                  ;     b = d+b;
    17                                  ;   }
    18                                  ; }
    19                                  	global main
    20                                  	extern printf
    21                                  
    22                                  	section .bss
    23 00000000 <res 00000008>          d:	resq	1		; temp  unused, kept in register rdx
    24                                  	
    25                                  	section .data
    26 00000000 5F00000000000000        c:	dq	95		; loop counter
    27 00000008 0100000000000000        a:	dq	1		; current number, becomes next
    28 00000010 0200000000000000        b:	dq	2		; next number, becomes sum a+b
    29                                  
    30                                  
    31 00000018 2531356C640A00          format:	db '%15ld', 10, 0
    32 0000001F 666962696E61636869-     title:	db 'fibinachi numbers', 10, 0
    33 00000028 206E756D626572730A-
    34 00000031 00                 
    35                                  	
    36                                  	section .text
    37                                  main:
    38 00000000 55                      	push rbp 		; set up stack
    39 00000001 48BF-                   	mov rdi, title 		; arg 1 is a pointer
    40 00000003 [1F00000000000000] 
    41 0000000B B800000000              	mov rax, 0 		; no vector registers in use
    42 00000010 E8(00000000)            	call printf
    43                                  
    44                                  print:
    45                                  	;  We need to call printf, but we are using rax, rbx, and rcx.
    46 00000015 48BF-                   	mov rdi, format 	; arg 1 is a pointer
    47 00000017 [1800000000000000] 
    48 0000001F 488B3425[08000000]      	mov rsi,[a] 		; arg 2 is the current number
    49 00000027 B800000000              	mov rax, 0 		; no vector registers in use
    50 0000002C E8(00000000)            	call printf
    51                                  
    52 00000031 488B1425[08000000]      	mov rdx,[a] 		; save the current number, in register
    53 00000039 488B1C25[10000000]      	mov rbx,[b] 		;
    54 00000041 48891C25[08000000]      	mov [a],rbx		; next number is now current, in ram
    55 00000049 4801D3                  	add rbx, rdx 		; get the new next number
    56 0000004C 48891C25[10000000]      	mov [b],rbx		; store in ram
    57 00000054 488B0C25[00000000]      	mov rcx,[c]		; get loop count
    58 0000005C 48FFC9                  	dec rcx 		; count down
    59 0000005F 48890C25[00000000]      	mov [c],rcx		; save in ram
    60 00000067 75AC                    	jnz print 		; if not done counting, do some more
    61                                  
    62 00000069 5D                      	pop rbp 		; restore stack
    63 0000006A B800000000              	mov rax, 0		; normal exit
    64 0000006F C3                      	ret			; return to operating system