extern io_get_udec, io_newline, io_print_udec
section .bss
N resd 1
K resd 1
res resd 1
ind_bit resb 1
k_zero_bits resd 1
section .text
global main
main:
call io_get_udec
mov [N], eax
add [N], 1 ; для <=
call io_get_udec
mov [K], eax
mov eax, 1 ; числа от 1 до N
mov ecx, 1 ; хз
mov [res], 0
.start1:
cmp eax, [N]
jge .end1
mov [k_zero_bits], 0
mov [ind_bit], 31
.start2:
mov ebx, eax ; в ebx будем брать биты числа в eax(от 1 до N)
shl ebx, [ind_bit]
and ebx, 1
cmp ebx, 1
je .end2 ; если ebx(бит числа) = 1,то мы заканчиваем счет знач нулей
add [k_zero_bits], 1
sub [ind_bit], 1
cmp [ind_bit], 0 ; чтобы индекс бита не ушел за 0
jb .end2
jmp .start2
.end1:
; перебрали все числа от 1 до N
mov [res], eax
call io_print_udec
call io_newline
xor eax, eax
ret
.end2:
; вышли из счета знач нулей
cmp [k_zero_bits], [K]
je .if_yes
jmp .start1
.if_yes:
add [res], 1
jmp .start1