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] mov dword[i], 0 jmp .start_total_sdv .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_copy`), чтобы не потерять исходные биты при сдвиге.
   - Убедись, что понимаешь, как работает обработка последнего элемента массива при переносе его младшего бита в старший бит первого элемента (это реализует циклический сдвиг).