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
k_1 resd 1
num resd 1
res_num resd 1
flag_1 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 dword[k_1], 0
mov dword[res_num], 32
mov byte[ind_bit], 31
mov dword[flag_1], 0
.start2:
mov eax, dword[num] ; в eax будем брать биты числа в eax(от 1 до N)
mov cl, byte[ind_bit]
shr eax, cl
and eax, 1
cmp eax, 1
je .if1 ; если eax(бит числа) = 1,то k_1+=1
jmp .if0
.if1:
add [k_1], 1
mov dword[flag_1], 1
jmp .continue
.if0:
cmp [flag_1], 1
je .continue
add[k_zero_bits], 1
jmp .continue
.continue:
sub byte[ind_bit], 1
cmp byte[ind_bit], 0 ; чтобы индекс бита не ушел за 0
jb .end2
jmp .start2
.end2:
; вышли из счета незнач нулей + "1" для num
add dword[num], 1
sub [res_num], [k_zero_bits]
sub [res_num], [k_1]
mov eax, [K]
cmp [res_num], 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