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 eax, dword[i] add eax, 1 xor edx, edx ; див делит eax:edx (остаток будет лежать в edx) div dword[N] ; edx = (i+1)%N 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 .start_print: mov dword[i], 0 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) Этот код считывает массив из N беззнаковых чисел, затем выполняет K циклических сдвигов вправо всех битов массива как единого большого числа (конкатенация битов всех элементов), и выводит итоговый массив.

2) Подсказки:
- Обрати внимание на метку `start_sdv_1_step` — в инструкции `jmp start_sdv_1_step` пропущен символ точки перед именем метки, из-за чего ассемблер может не найти её.
- Для корректного сцепления битов между элементами массива убедись, что при переносе бита из младшего разряда одного элемента в старший разряд другого не теряются остальные биты при операции `shr`.