Как проверить, имеет ли регистр четное значение? - PullRequest
0 голосов
/ 19 февраля 2019

Например, проверьте, является ли R8 четным

. Это заданный ответ.

MOVS R2,R8,LSR#1

смещение младшего бита для переноса флага, если = 0>, даже если = 1> нечетное

Я не получаю эту часть.

Например, десятичное значение 7 в ARM равно 0..0 0111, сдвигая вправо на 1, мы получаем 0..0 0011. Перенос здесь означает самый правый бит?

Другим способом будет проверка, является ли самый правый бит 1 или 0 с использованием маски?

1 Ответ

0 голосов
/ 19 февраля 2019

Число основания 2 является четным (делится на 2), если младший бит равен 0. По той же самой причине число основания 10 делится на 10, если младший разряд равен 0.


Сдвиги переводят последний сдвинутый бит в флаг C, так что вы можете определить, равен ли R8, даже если посмотреть на флаг C.Как указано в документации ARM :

Если указано S, эти инструкции обновляют флаги N и Z в соответствии с результатом.

Флаг C не изменяется, еслизначение сдвига равно 0. В противном случае флаг C обновляется до последнего сдвинутого бита.

Но да, обычный способ проверки на четность / нечетность равен tst r8, #1 для установки флага Z в соответствии с младшим битом.Так что beq r8_was_even или bne r8_was_odd, или все, что вы хотите сделать с флагом Z.

Если у вас есть использование для целочисленного результата со смещением вправо (или его нулевого / ненулевого статуса в Z), movs со сдвигом (он же lsrs) - эффективный способ получить одновременно результаты x/2 и x&1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...