section .bss
k resd 1
n resd 1
a resd 1
prev resd 1
curr resd 1
nxt resd 1
loop_counter resd 1
section .text
global main
extern io_get_dec
extern io_print_dec
len_base_k:
cmp eax, 0
jne .len_loop
mov eax, 1
ret
.len_loop:
xor ecx, ecx
.len_digit_loop:
inc ecx
cdq
div ebx
test eax, eax
jnz .len_digit_loop
mov eax, ecx
ret
modular_pow:
mov edx, 0
mov eax, 1
.pow_loop:
cmp ecx, 0
je .done_pow
imul eax, dword [k]
mov ebx, 2011
xor edx, edx
div ebx
mov eax, edx
dec ecx
jmp .pow_loop
.done_pow:
ret
concat_mod:
push edx
push esi
push edi
mov edi, eax
mov esi, ebx
mov eax, esi
mov ebx, ecx
call len_base_k
mov edx, eax
mov eax, ecx
mov ecx, edx
mov ebx, 2011
call modular_pow
mov ebx, eax
mov eax, edi
imul eax, ebx
xor edx, edx
mov ebx, 2011
div ebx
mov eax, edx
add eax, esi
cmp eax, 2011
jl .done
sub eax, 2011
.done:
pop edi
pop esi
pop edx
ret
main:
call io_get_dec
mov [k], eax
call io_get_dec
mov [n], eax
call io_get_dec
mov [a], eax
mov eax, [a]
mov ebx, 2011
xor edx, edx
div ebx
mov [prev], edx
mov eax, [prev]
mov ebx, [prev]
mov ecx, [k]
call concat_mod
mov [curr], eax
mov dword [loop_counter], 2
.loop_main:
mov eax, [loop_counter]
mov edx, [n]
cmp eax, edx
jg .done_loop
mov eax, [curr]
mov ebx, [prev]
mov ecx, [k]
call concat_mod
mov [nxt], eax
mov eax, [curr]
mov [prev], eax
mov eax, [nxt]
mov [curr], eax
inc dword [loop_counter]
jmp .loop_main
.done_loop:
mov eax, [curr]
call io_print_dec
ret