Online Compiler Nasm

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
1) Этот код подсчитывает, сколько чисел от 1 до N имеют ровно K старших нулевых битов в своем двоичном представлении (до первой встреченной единицы слева).

2) Подсказки:
- Обрати внимание на обработку граничного случая, когда `num` равно 0. В текущей логике счетчик `k_zero_bits` для нуля может работать некорректно.
- Условие `cmp byte[ind_bit], 0` и переход `jb` (jump if below) после него избыточны, так как `ind_bit` — беззнаковый байт, и его уменьшение ниже 0 приведет к переносу. Лучше использовать `jge` или `jns` для проверки знака после декремента.