1 ; fib_64m.asm using 64 bit memory more like C code 2 ; // fib.c same as computation as fib_64m.asm 3 ; #include 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 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