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 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_dec
call io_newline
inc dword[i]
jmp .start_print
.end_print:
xor eax, eax
ret