Skip to content

Instantly share code, notes, and snippets.

@Yepoleb
Last active February 15, 2019 21:01
Show Gist options
  • Save Yepoleb/d0fa13c56785dce3497948b470242795 to your computer and use it in GitHub Desktop.
Save Yepoleb/d0fa13c56785dce3497948b470242795 to your computer and use it in GitHub Desktop.
.intel_syntax noprefix
.section .rodata
FORMAT_STRING:
.string "%d %d\n"
.section .text
splittable64:
// rdi: x
// rax: a
mov rax, rdi
shr rax, 30
xor rdi, rax
mov rcx, 0xbf58476d1ce4e5b9
imul rdi, rcx
mov rax, rdi
shr rax, 27
xor rdi, rax
mov rcx, 0x94d049bb133111eb
imul rdi, rcx
mov rax, rdi
shr rax, 31
xor rax, rdi
ret
fjump:
# Save all caller saved registers, because it makes calling this
# garbage at least a bit less painful
push rax
mov rax, [rsp + 0x8] # Return address
push rdi # Used by splittable64
push rcx # Used by splittable64
push rdx # Used internally
sub rax, r12
mov rdx, rax
mov rdi, rax
call splittable64
and rax, 0xF
add rax, rdx
add rax, r12
pop rdx
pop rcx
pop rdi
mov [rsp + 0x8], rax
pop rax
ret
fibonacci:
// edi: index
// ecx: val1
// eax: val2
// edx: counter
// esi: oldval
cmp edi, 0
je fibonacci_zero
lea r12, [rip]
mov ecx, 0
call fjump
mov ebx, 1
sub rsp, 0x8
mov eax, 1
mov edx, 1
call fjump
mov edi, edx
add esi, 1
mov ecx, esi
call fjump
fibonacci_loop_top:
cmp edx, edi
jge fibonacci_loop_end
call fjump
add esi, 1
and esi, 0xF
call fjump
mov esi, eax
add eax, ecx
call fjump
mov edx, 1
add ecx, 1
call fjump
mov ecx, esi
add edx, 1
jmp fibonacci_loop_top
fibonacci_loop_end:
ret
fibonacci_zero:
mov eax, 0
ret
.global main
main:
// ecx: i
// edx: fib
push rbx
mov ebx, 0
main_loop_top:
cmp ebx, 20
jge main_loop_end
mov edi, ebx
call fibonacci
lea rdi, [rip + FORMAT_STRING]
mov esi, ebx
mov edx, eax
mov eax, 0
call printf
add ebx, 1
jmp main_loop_top
main_loop_end:
mov eax, 0
pop rbx
ret
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment