Online Compiler Nasm

extern io_get_udec, io_print_udec section .bss prev resd 1 prevprev resd 1 count resd 1 system resd 1 section .text global weirdFunc weirdFunc: push ebp mov ebp, esp mov ebx, dword [ebp + 8] mov esi, dword [ebp + 12] mov edi, dword [ebp + 16] sub esp, 12 mov dword [ebp - 4], edi mov dword [ebp - 8], 0 mov dword [ebp - 12], 1 .Loop1 cmp dword [ebp - 4], 0 je .Loop2 add dword [ebp - 8], 1 mov eax, [ebp - 4] xor edx, edx div ebx mov dword [ebp - 4], eax jmp .Loop1 .Loop2: cmp dword [ebp - 8], 0 je .Ans sub dword [ebp - 8], 1 mov eax, dword [ebp - 12] mul ebx mov dword [ebp - 12], eax jmp .Loop2 .Ans: mov eax, dword [ebp - 12] mul esi mov esi, eax add esi, edi mov eax, esi add esp, 12 leave ret global main main: call io_get_udec mov dword [system], eax call io_get_udec mov dword [count], eax call io_get_udec xor edx, edx mov ecx, 2011 div ecx mov dword [prevprev], edx push dword [prevprev] push dword [prevprev] push dword [system] call weirdFunc add esp, 12 xor edx, edx div ecx mov dword [prev], edx sub dword [count], 1 .LoopMain: cmp dword [count], 0 je .Fin sub dword [count], 1 mov eax, dword [prev] mov dword [prevprev], eax push dword [prevprev] push dword [prev] push dword [system] call weirdFunc add esp, 12 xor edx, edx div ecx mov dword [prev], edx jmp .LoopMain .Fin: call io_print_udec xor eax, eax ret
Этот код вычисляет последовательность чисел, используя функцию `weirdFunc`, которая принимает три аргумента: систему счисления, предыдущее и предпредыдущее значение. Функция выполняет преобразование числа в заданную систему счисления и обратно, а затем комбинирует результаты.

Основная программа считывает три числа: систему счисления, количество итераций и начальное значение. Затем она вычисляет последовательность, где каждый следующий элемент получается применением `weirdFunc` к предыдущим двум, и выводит последний результат по модулю 2011.

- В функции `weirdFunc` есть проблема с использованием регистров. Обратите внимание, что после инструкции `mul` результат помещается в `edx:eax`, но вы используете `esi` и `edi` для хранения аргументов, и `mul` может перезаписать `edx`, который используется в других местах.
- В цикле `.Loop2` вы умножаете `[ebp-12]` на `ebx`, но не учитываете, что `mul` может дать 64-битный результат, и вы теряете старшую часть.