ассемблер
.docxЗадание:
Вводишь число. Если вводимое число является степенью двойки, то вывести 1, в противном случае 0. Вводить числа используя инструкции загрузки константы, например, li x2, 1234 загрузит число 1234 в регистр x2
Код:
li x1 16 #вводим число (n)
addi x2, x1, -1 # вычитаем из него единицу (n-1)
and x3,x1,x2 # сравниваем n и n-1. Если это была степень двойки, то в х3 будет 0.
beq x3, x0 , Yes # Сравниваем с нулем и прыгаем по метке Yes, если 0=0
li x3, 0 # Если 0!=0, значит это не степень двойки, кладем в регистр 0 по заданию
jal x2 No # Просто прыгаем в конец, чтобы не задеть ветку метки Yes.
Yes:
li x3, 1 # По заданию должна быть выведена единица, если степень двойки.
No:
Скриншот, чтобы читать удобнее было:
Входные параметры в регистре х1.
Выходные параметры в регистре x3.
Основная мысль:
Если число – это степень двойки, то в двоичной записи оно будет содержать всего одну единицу. После того, как мы вычтем из этого числа единицу, оно будет иметь вид: …0001111… Жирным выделен ноль, который до вычитания был единственной единицей. Теперь, при логическом «И» между входным число и полученным будет ноль. Иначе, при нечетной степени логическое «И» вернет нам что-то не нулевое. Дальше просто проверяем х3 на равенство нулю и делаем выводы.