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
num resd 1
section .text
global main
main:
call io_get_udec
mov dword[N], eax
add dword[N], 1 ; чтобы num <= N (на N+1 выход из цикла)
call io_get_udec
mov dword[K], eax
mov dword[num], 1 ; числа от 1 до N
mov dword[res], 0
.start1:
mov eax, [N]
cmp [num], eax
je .end1
mov dword[k_zero_bits], 0
mov byte[ind_bit], 31
.start2:
mov eax, dword[num] ; в ebx будем брать биты числа в eax(от 1 до N)
mov cl, byte[ind_bit]
shr eax, cl
and eax, 1
cmp eax, 1
je .end2 ; если ebx(бит числа) = 1,то мы заканчиваем счет знач нулей
cmp byte[ind_bit], 0 ; чтобы индекс бита не ушел за 0
jb .end2
add dword[k_zero_bits], 1
sub byte[ind_bit], 1
jmp .start2
.end2:
; вышли из счета знач нулей для 1 числа
add dword[num], 1
mov eax, [K]
cmp [k_zero_bits], eax
je .if_yes
jmp .start1
.if_yes:
add dword[res], 1
jmp .start1
.end1:
; перебрали все числа от 1 до N
mov eax, dword[res]
call io_print_udec
call io_newline
xor eax, eax
ret