Online Compiler Nasm

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
1) Этот код вычисляет n-й член последовательности, где каждый следующий член получается "конкатенацией" двух предыдущих в системе счисления по основанию k, а затем берётся остаток от деления на 2011.

2) Обрати внимание, что функция `modular_pow` использует регистр `ecx` как счётчик степени, но при этом внутри цикла считывает значение `[k]` из памяти — убедись, что `k` не изменяется.  
   Проверь, что функция `len_base_k` корректно обрабатывает случай, когда на входе 0, и не забывает сохранить/восстановить регистры, которые использует.