如何检查寄存器的值是否为偶数?

时间:2019-02-19 05:03:13

标签: assembly arm

例如,检查R8是否为偶数

给出答案

MOVS R2,R8,LSR#1

即使= 0>,也将LSB移到带有标志的位置,即使= 1> odd

我没有这部分。

例如,ARM中的十进制值7为0..0 0111,向右移1则得到0..00011。这里的进位表示最右边的一位?

另一种方法是使用掩码检查最右边的位是1还是0?

1 个答案:

答案 0 :(得分:2)

如果低位为0,则基数2为偶数(可被2整除)。出于完全相同的原因,如果低位为0,基数10可被10除。


Shifts将最后一位移出C标志,因此您可以通过查看C标志来判断R8是否均匀。为ARM documentation says

  

如果指定了S,则这些指令将更新N和Z标志   根据结果​​。

     

如果移位值为0,则C标志不受影响。否则,C   标志更新为移出的最后一位。

但是,是的,测试奇/偶的正常方法是tst r8, #1根据低位设置Z标志。因此,beq r8_was_evenbne r8_was_odd,或您要对Z标志进行的其他操作。

如果您使用的是右移整数结果(或其在Z中为零/非零状态),则movs随移位(也称为lsrs)是同时获得x/2x&1结果的有效方法。