extern io_get_dec, io_print_dec
section .text
global main
main:
call io_get_dec
xor ecx, ecx
loop:
test eax, eax
jz done
lea edx, [eax - 1]
and eax, edx
inc ecx
jmp loop
done:
mov eax, ecx
call io_print_dec
xor eax, eax
ret
1) Этот код считывает целое число, затем подсчитывает количество единичных битов в его двоичном представлении (вес Хэмминга или popcount) и выводит результат.
2) Подсказки:
- Инструкция `and eax, edx` с аргументами `lea edx, [eax - 1]` — это известный приём для сброса младшего установленного бита в единицу. Подумай, как это связано с подсчётом единиц.
- Счётчик `ecx` увеличивается на каждой итерации цикла. Проанализируй, при каком условии цикл завершается и что тогда находится в `ecx`.