带有LSL进位标志的MOVS

时间:2012-05-02 16:56:29

标签: arm

我正在学习“手臂系统开发者指南”,我想知道本书中的一个例子:

cpsr = nzcvqiFt_USER   // capital indicates flag is set
r0 = 0x00000000
r1 = 0x80000004

MOVS r0, r1, LSL #1

cpsr = nzCvqiFt_USER   // capital indicates flag is set
r0 = 0x00000008
r1 = 0x80000004

据我所知,8继承并且由于此进位而基于逻辑左移设置了C标志。为什么r1中的4没有移位? MOVS操作是仅移动所携带的8?

1 个答案:

答案 0 :(得分:2)

因为你的结果以r0结尾。

所以,会发生什么:

carry = r1[31] = 1
r0    = r1 << 1

这就是为什么r0变为0x00000008,因为r1的MSB被移出到进位而第三位(2 ^ 3 = 4)被移位到第四位(2 ^ 4 = 8)。