Skip to content

Instantly share code, notes, and snippets.

@CodeByAidan
Last active February 21, 2024 15:19
Show Gist options
  • Save CodeByAidan/7fb4f3d6f8952e322ba33c102ef87e16 to your computer and use it in GitHub Desktop.
Save CodeByAidan/7fb4f3d6f8952e322ba33c102ef87e16 to your computer and use it in GitHub Desktop.
fibonacci sequence in 64-bit Linux (Debian distro) assembly, fixed compile errors (integrates with a C library)!! (Works with Debian WSL on Windows!)
; -----------------------------------------------------------------------------
; A 64-bit Linux application that writes the first 90 Fibonacci numbers. To
; assemble and run:
;
; nasm -f elf64 _fib.asm && gcc _fib.o -no-pie -o a.out && ./a.out
; -----------------------------------------------------------------------------
global main
extern printf
section .note.GNU-stack noalloc noexec nowrite progbits
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
nasm -f elf64 _fib.asm && gcc _fib.o -no-pie -o a.out && ./a.out
aidan@aidan:~/asm$ nasm -f elf64 fib.asm
aidan@aidan:~/asm$ gcc fib.o -no-pie -o a.out
aidan@aidan:~/asm$ ./a.out
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
2971215073
4807526976
7778742049
12586269025
20365011074
32951280099
53316291173
86267571272
139583862445
225851433717
365435296162
591286729879
956722026041
1548008755920
2504730781961
4052739537881
6557470319842
10610209857723
17167680177565
27777890035288
44945570212853
72723460248141
117669030460994
190392490709135
308061521170129
498454011879264
806515533049393
1304969544928657
2111485077978050
3416454622906707
5527939700884757
8944394323791464
14472334024676221
23416728348467685
37889062373143906
61305790721611591
99194853094755497
160500643816367088
259695496911122585
420196140727489673
679891637638612258
1100087778366101931
1779979416004714189
aidan@aidan:~/asm$
@CodeByAidan
Copy link
Author

Fixed errors:

aidan@aidan:~/asm$ nasm -felf64 fib.asm && gcc fib.o -z noexecstack -fPIE && ./a.out
/usr/bin/ld: fib.o: warning: relocation in read-only section `.text'
/usr/bin/ld: fib.o: relocation R_X86_64_PC32 against symbol `printf@@GLIBC_2.2.5' can not be used when making a PIE object; recompile with -fPIE
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status

(painful)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment