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