Online Compiler Nasm

extern io_get_udec, io_print_udec, io_print_char, io_newline global main section .bss CNT resd 1 nums resd 1000000 MASK resd 1 K resd 1 ; сюда сохраняем K (io_print_udec портит edx) section .text main: mov ebp, esp call io_get_udec mov [CNT], eax mov ecx, eax ; счётчик для чтения mov ebx, nums ; ebx — начало массива test ecx, ecx jz .no_numbers ; если N=0 — пропускаем цикл чтения чисел .read_loop: mov esi, ecx ; сохраняем счётчик (io_get_udec портит ecx) call io_get_udec mov [ebx], eax add ebx, 4 mov ecx, esi loop .read_loop .no_numbers: call io_get_udec ; читаем K ВСЕГДА (даже при N=0) mov [K], eax cmp dword [CNT], 0 jz .print_newline ; === маска младших K бит === mov eax, 1 mov cl, byte [K] shl eax, cl dec eax mov [MASK], eax ; === перенос из последнего элемента в первый === mov ecx, [CNT] dec ecx mov eax, [nums + ecx*4] and eax, [MASK] mov edi, eax ; edi = начальный перенос mov ebx, nums ; ebx — указатель по массиву mov ecx, [CNT] ; счётчик печати .print_loop: mov esi, ecx ; сохраняем счётчик печати (io_* портят ecx) cmp ecx, [CNT] je .print_num mov eax, ' ' call io_print_char .print_num: mov eax, [ebx] ; текущее число mov cl, byte [K] shr eax, cl ; >> K mov ebp, edi mov cl, 32 sub cl, byte [K] ; 32 - K shl ebp, cl or eax, ebp ; | (перенос << (32-K)) call io_print_udec mov eax, [ebx] and eax, [MASK] mov edi, eax ; новый перенос для следующего add ebx, 4 mov ecx, esi ; восстанавливаем счётчик dec ecx jnz .print_loop .print_newline: call io_newline mov eax, 0 ret
1) Этот код считывает количество чисел N, затем N чисел в массив, затем число K. Для каждого числа он выполняет циклический сдвиг битов вправо на K позиций, но так, что младшие K битов предыдущего числа становятся старшими K битами текущего (для первого числа используются биты последнего). Результат печатается через пробел.

2) Подсказки:
- Обрати внимание на регистр `ebp`: в начале функции `main` в него сохраняется указатель стека (`esp`), но позже в цикле печати он используется для временных вычислений. Это может привести к ошибке, если значение `esp` понадобится позже.
- Алгоритм использует два прохода: сначала чтение всех чисел, затем их обработка и печать. Убедись, что понимаешь, как формируется маска для младших K бит и как работает «перенос» (`edi`) между элементами.