Итак, у меня был вопрос с интервью, прежде чем обсуждать манипуляции с битами. Компания - известная компания GPU. У меня было очень мало фона на языке ассемблера (странно, несмотря на то, что я являюсь студентом-программистом в компьютерной архитектуре), и, как показывает это повествование, я его не понимаю. Вопрос был простой:
"Напишите быстрый код, который будет считать число 1 в 32-битном регистре".
Теперь я изучаю сборку рук. Поэтому, естественно, я снова заново рассмотрел эту проблему и придумал этот код, просто изучив ISA.
Для вас, армейские эксперты, это правильно? Есть ли более быстрый способ сделать это? Будучи новичком, я, естественно, считаю, что это неполное. Инструкция AND в "xx" кажется избыточной, но нет другого способа сдвинуть регистр в ARM isa...
R1 будет содержать количество бит в конце, а R2 - регистр с битами, которые мы хотим подсчитать. r6 - просто фиктивный регистр. Комментарии прилагаются в()
MOV R1, #0 (initialize R1 and R6 to zero)
MOV R6, #0
xx: AND R6, R6, R2, LSR #1 (Right shift by 1, right most bit is in carry flag)
ADDCS R1, #1 (Add #1 to R1 if carry flag is set)
CMP R2, #0 (update the status flags if R2 == 0 or not)
BEQ xx (branch back to xx until R2==0)