extern io_get_udec, io_print_udec, io_newline
section .bss
N resd 1
K resd 1
res resd 1
k_zero resd 1
section .text
global main
main:
call io_get_udec
mov dword[N], eax
call io_get_udec
mov dword[K], eax
mov dword[res], 0
mov ebx, 1
.start:
cmp ebx, dword[N]
ja .print ; >N
mov eax, ebx
bsr ecx, eax; ecx = инд старшего бита
; если bsr=2 то mask=2^2-1=11
mov edx, 1
shl edx, cl
dec edx ; edx = 1111.. справа от старшего бита
; инвертируем и делаем маску
not eax
and eax, edx
mov dword[k_zero], 0
.start_counter:
mov eax, dword[k_zero]
cmp eax, 0
je .end_counter ; если не осталось единиц
mov edx, eax
dec edx
and eax, edx ; убрали самую правую 1
inc dword[k_zero]
jmp .start_counter
.end_counter:
mov eax, dword[k_zero]
cmp eax, dword[K]
.next:
inc ebx
jmp .start
.print:
mov eax, dword[res]
call io_print_udec
call io_newline
xor eax, eax
ret