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] 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 .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 mov dword[bit], eax shl dword[bit], 31 ; бит на первом слева бите 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] shr dword[m + 4*edx], 1 ; сдвиг в числе mov eax, dword[m + 4*edx] ; eax = (i+1)%N чтобы при сдвиге бита из последнего байта он переносился в первый or eax, dword[bit] mov eax, dword[bit]; перенос 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_dec call io_newline inc dword[i] jmp .start_print .end_print: xor eax, eax ret
1) Этот код считывает массив 32-битных чисел, затем циклически сдвигает весь массив вправо на K битов (обрабатывая массив как одно непрерывное битовое поле), и выводит результат.

2) Подсказки:
- В блоке `.start_push` инструкция `mov dword[m_copy + 4*ecx]` неполная — отсутствует источник копирования.
- В блоке `.start_sdv_1_step` после `or eax, dword[bit]` результат не сохраняется обратно в массив `m`, а следующая инструкция `mov eax, dword[bit]` перезаписывает eax.