extern io_print_dec, io_get_udec
global main
section .text
main:
call io_get_udec
mov ecx, eax
xor ebx, ebx
count:
test ecx, ecx
jz end
test ecx, 1
jz next
inc ebx
next:
shr ecx, 1
jmp count
end:
mov eax, ebx
call io_print_dec
xor eax, eax
ret
Этот код считывает беззнаковое целое число, подсчитывает количество единичных битов в его двоичном представлении и выводит результат.
**Подсказки:**
1. Обратите внимание на цикл `count` — он использует сдвиг вправо (`shr`) для последовательного анализа каждого бита числа. Подумайте, почему условие выхода из цикла проверяется в начале, а не в конце.
2. Инструкция `test ecx, 1` проверяет младший бит. Как изменится поведение, если заменить её на `and ecx, 1`? (Не меняйте код, просто подумайте о разнице между `test` и `and` в контексте сохранения значения регистра.)