extern io_get_udec, io_print_dec
section .bss
kval resd 1
zero resd 1
shablon resd 1
ostright resd 1
section .text
global main
main:
call io_get_udec
mov edi, eax ; edi = N
call io_get_udec
mov [kval], eax ; K
xor ebx, ebx ; ebx = ans
mov dword [zero], 0
mov eax, edi
xor esi, esi ; esi = m
bitschet:
test eax, eax
jz bitvse
inc esi
shr eax, 1
jmp bitschet
bitvse:
mov ecx, 1
lessN:
cmp ecx, esi
jae endlessN
mov eax, ecx
dec eax ; n = len - 1
mov edx, [kval] ; k = K
push ecx
call combinations
pop ecx
add ebx, eax
inc ecx
jmp lessN
endlessN:
mov ecx, esi
cmp ecx, 1
jbe provN
dec ecx
mov [ostright], ecx
mov eax, 1
mov ecx, esi
sub ecx, 2
shl eax, cl
mov [shablon], eax
rasborN:
mov eax, [shablon]
test eax, eax
jz provN
test edi, eax
jz found
mov eax, [kval]
mov edx, [zero]
inc edx
sub eax, edx ; need = K - (zero + 1)
js next
mov edx, eax ; k = need
mov eax, [ostright]
dec eax ; n = сколько бит справа
call combinations
add ebx, eax
jmp next
found:
inc dword [zero]
next:
dec dword [ostright]
shr dword [shablon], 1
jmp rasborN
provN:
mov eax, [zero]
cmp eax, [kval]
jne done
inc ebx
done:
mov eax, ebx
call io_print_dec
xor eax, eax
ret
combinations:
push ebx
push ecx
push esi
push edi
cmp edx, eax
ja combzero
cmp edx, 0
je combone
mov esi, eax ; n
mov ecx, edx ; k
mov ebx, 1 ; result
mov edi, 1 ; i
combschet:
cmp edi, ecx
ja endcomb
mov eax, esi
sub eax, edi
inc eax ; n - i + 1
mul ebx ; edx:eax = eax * result
div edi ; eax = eax / i
mov ebx, eax
inc edi
jmp combschet
endcomb:
mov eax, ebx
jmp vosvrat
combzero:
xor eax, eax
jmp vosvrat
combone:
mov eax, 1
vosvrat:
pop edi
pop esi
pop ecx
pop ebx
ret