Last active
February 15, 2019 21:01
-
-
Save Yepoleb/d0fa13c56785dce3497948b470242795 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.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