Online Compiler Nasm

extern io_get_udec, io_print_udec, io_newline section .bss N resd 1 K resd 1 res resd 1 k_zero resd 1 section .text global main main: call io_get_udec mov dword[N], eax call io_get_udec mov dword[K], eax mov dword[res], 0 mov ebx, 1 .start: cmp ebx, dword[N] ja .print ; >N mov eax, ebx bsr ecx, eax; ecx = инд старшего бита ; если bsr=2 то mask=2^2-1=11 mov edx, 1 shl edx, cl dec edx ; edx = 1111.. справа от старшего бита ; инвертируем и делаем маску not eax and eax, edx mov dword[k_zero], 0 .start_counter: mov eax, dword[k_zero] cmp eax, 0 je .end_counter ; если не осталось единиц mov edx, eax dec edx and eax, edx ; убрали самую правую 1 inc dword[k_zero] jmp .start_counter .end_counter: mov eax, dword[k_zero] cmp eax, dword[K] .next: inc ebx jmp .start .print: mov eax, dword[res] call io_print_udec call io_newline xor eax, eax ret
1) Этот код считывает два беззнаковых числа N и K, затем для каждого числа от 1 до N подсчитывает количество нулей в его двоичном представлении между старшей единицей и младшим битом, и сравнивает это количество с K.

2) Подсказки:
- Обрати внимание, что после инструкции `and eax, edx` в блоке `.start_counter` значение `eax` изменяется, но затем оно перезаписывается командой `mov eax, dword[k_zero]`, что делает цикл подсчета бесконечным.
- В блоке `.end_counter` происходит сравнение `k_zero` с K, но отсутствует инструкция для увеличения `res`, если условие выполняется.