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_bits resd 1
j resd 1
section .text
global main
main:
call io_get_udec
mov dword[N], eax
cmp eax, 0
je .end_print
mov dword[i], 0
mov dword[j], 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
cmp eax, 0
je .start_print
; сдвигаем каждое число в m на K вправо
mov dword[i], 0
.start_sdv:
mov ecx, dword[i]
cmp ecx, dword[N]
je .end_sdv
mov edx, ecx
mov cl, byte[K]
shr dword[m + 4*edx], cl
inc dword[i]
jmp .start_sdv
.end_sdv:
mov dword[i], 0
.start_total_sdv:
mov ecx, dword[i]
cmp ecx, dword[N]
je .start_print
; копируем K последних бит из m_copy[i]
mov eax, dword[m_copy + 4*ecx]
mov ebx, 32
sub ebx, dword[K]
mov cl, bl
shl eax, cl
mov dword[k_bits], eax
; сцепляем с итоговым числом m[(i+1)%N]
mov edx, dword[i]
add edx, 1
cmp edx, dword[N]
jne .not_last
xor edx, edx
.not_last:
; вставляем перенос в m[(i+1)%N]
mov eax, dword[m + 4*edx]
or eax, dword[k_bits]
mov dword[m + 4*edx], eax
inc dword[i]
jmp .start_total_sdv
.start_print:
mov eax, dword[j]
cmp eax, dword[N]
je .end_print
mov ecx, dword[j]
mov eax, dword[m + 4*ecx]
call io_print_udec
call io_newline
inc dword[j]
jmp .start_print
.end_print:
xor eax, eax
ret