Online Compiler Nasm

extern io_get_udec, io_print_udec, io_newline section .bss N resd 1 K resd 1 m resd 1000000 m_copy resd 1000000 i resd 1 k resd 1 bit resd 1 section .text global main main: call io_get_udec mov dword[N], eax mov dword[i], 0 mov dword[k], 0 .start_push: mov ecx, dword[i] cmp ecx, dword[N] je .end_push call io_get_udec mov dword[m + 4*ecx], eax mov dword[m_copy + 4*ecx], eax inc dword[i] jmp .start_push .end_push: call io_get_udec mov dword[K], eax mov dword[i], 0 .start_total_sdv: mov eax, dword[k] cmp eax, dword[K] je .start_print mov dword[i], 0 .start_sdv_1_step: mov ecx, dword[i] cmp ecx, dword[N] je .end_sdv_1_step ; копируем 1 бит mov eax, dword[m_copy + 4*ecx] and eax, 1 shl eax, 31 mov dword[bit], eax ; бит на первом слева бите shr dword[m_copy + 4*ecx], 1 ; сдвинули вправо на 1 чтобы следующий на очереди сдвиг был в 0 бите ; сцепляем с итоговым числом mov edx, dword[i] add edx, 1 cmp edx, dword[N] jne .not_last xor edx, edx .not_last: shr dword[m + 4*edx], 1 ; сдвиг в самом числе mov eax, dword[m + 4*edx] or eax, dword[bit] mov dword[m + 4*edx], eax; перенос 1 бита сделан inc dword[i] jmp .start_sdv_1_step .end_sdv_1_step: inc dword[k] jmp .start_total_sdv mov dword[i], 0 .start_print: mov eax, dword[i] cmp eax, dword[N] je .end_print mov ecx, dword[i] mov eax, dword[m + 4*ecx] call io_print_udec call io_newline inc dword[i] jmp .start_print .end_print: xor eax, eax ret
1) Этот код считывает массив беззнаковых чисел, затем циклически сдвигает биты всего массива вправо на заданное количество позиций (K раз по одному биту), после чего выводит изменённый массив.

2) Подсказки:
- Обрати внимание, что для циклического сдвига используется два массива: `m` (основной) и `m_copy` (вспомогательный). При каждом проходе биты копируются из `m_copy`, но модифицируется `m`.
- Убедись, что понимаешь, как работает перенос бита между соседними элементами массива (особенно между последним и первым элементом).