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 mov eax, eax 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 edx, 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` есть ошибка: регистр `edx` обнуляется после умножения, что делает деление `div ebx` некорректным, так как `ebx` не всегда равен 2011.
- В функции `len_base_k` в цикле `.len_digit_loop` используется `mov eax, eax` (бессмысленная операция), а после деления `div ebx` нужно сохранять частное для проверки условия.