Online Compiler Nasm

extern io_get_udec, io_print_udec, io_newline section .bss N resd 1 K resd 1 res 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 popcnt eax, eax ; кол-во 1 (= кол-во знач 0) cmp eax, dword[K] jne .next inc dword[res] jmp .next .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) Подсказки:
- Инструкция BSR находит позицию старшего установленного бита (начиная с 0). Если число равно 0, результат BSR не определён.
- Маска EDX = (1 << cl) - 1 создаёт битовую маску из единиц для всех младших разрядов относительно старшего бита.