extern io_get_udec, io_print_udec, io_print_char, io_newline
global main
section .bss
CNT resd 1
nums resd 1000000
MASK resd 1
K resd 1 ; сюда сохраняем K (io_print_udec портит edx)
section .text
main:
mov ebp, esp
call io_get_udec
mov [CNT], eax
mov ecx, eax ; счётчик для чтения
mov ebx, nums ; ebx — начало массива
test ecx, ecx
jz .no_numbers ; если N=0 — пропускаем цикл чтения чисел
.read_loop:
mov esi, ecx ; сохраняем счётчик (io_get_udec портит ecx)
call io_get_udec
mov [ebx], eax
add ebx, 4
mov ecx, esi
loop .read_loop
.no_numbers:
call io_get_udec ; читаем K ВСЕГДА (даже при N=0)
mov [K], eax
cmp dword [CNT], 0
jz .print_newline
; === маска младших K бит ===
mov eax, 1
mov cl, byte [K]
shl eax, cl
dec eax
mov [MASK], eax
; === перенос из последнего элемента в первый ===
mov ecx, [CNT]
dec ecx
mov eax, [nums + ecx*4]
and eax, [MASK]
mov edi, eax ; edi = начальный перенос
mov ebx, nums ; ebx — указатель по массиву
mov ecx, [CNT] ; счётчик печати
.print_loop:
mov esi, ecx ; сохраняем счётчик печати (io_* портят ecx)
cmp ecx, [CNT]
je .print_num
mov eax, ' '
call io_print_char
.print_num:
mov eax, [ebx] ; текущее число
mov cl, byte [K]
shr eax, cl ; >> K
mov ebp, edi
mov cl, 32
sub cl, byte [K] ; 32 - K
shl ebp, cl
or eax, ebp ; | (перенос << (32-K))
call io_print_udec
mov eax, [ebx]
and eax, [MASK]
mov edi, eax ; новый перенос для следующего
add ebx, 4
mov ecx, esi ; восстанавливаем счётчик
dec ecx
jnz .print_loop
.print_newline:
call io_newline
mov eax, 0
ret