例如,检查R8是否为偶数
给出答案
MOVS R2,R8,LSR#1
即使= 0>,也将LSB移到带有标志的位置,即使= 1> odd
我没有这部分。
例如,ARM中的十进制值7为0..0 0111,向右移1则得到0..00011。这里的进位表示最右边的一位?
另一种方法是使用掩码检查最右边的位是1还是0?
答案 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_even
或bne r8_was_odd
,或您要对Z标志进行的其他操作。
如果您使用的是右移整数结果(或其在Z
中为零/非零状态),则movs
随移位(也称为lsrs
)是同时获得x/2
和x&1
结果的有效方法。