2013-06-25 44 views
3

我已经看到逻辑左移可以做1-31位的移位形式。算术右移和逻辑右移取1-32作为移位量。为什么左右轮班的区别?为什么逻辑右移和算术右移有一个移位范围1-32

+1

因为你可能想要0x80000000和'shr'它32次产生一个0.但是采取'0x00000001'并且执行'lsh' 32次只会将设置位从int的末尾转储出来,的整数溢出。 –

+0

请指定指令集 –

+0

指令集是arm v7 – Gautam

回答

3

它与某些轮班操作的特殊含义有关。从DDI 0029E(的ARM7TDMI数据表):

LSL#0是特殊情况,其中,所述移位器进行是CPSRÇ 标志的旧值。 Rm的内容直接用作第二个操作数。
....
可能预期对应于LSR#0的移位字段的形式用于 编码LSR#32,其具有以Rm的位31作为进位输出的零结果。逻辑 右移零是多余的,因为它与逻辑移位左零相同,所以汇编器 将把LSR#0(以及ASR#0和ROR#0)转换为LSL#0,并且允许LSR#32为 SPECI网络版。

换句话说,处理器设计者指定一个特殊的意义LSL #0,这也意味着有一个为LSL #32没有可能的编码自1..31移位量被解释为-是和0有其特殊的意义。 LSR #0ASR #0将被汇编器转换为LSL #0,因为它们具有相同的意义,这意味着机器代码编码LSR #0ASR #0自由使用别的东西;所以他们将0的位移量解释为LSR/ASR的32。

0

我认为这与ARM桶式移位器有关。基本上ARM架构没有真正的移位指令。相反,它使您可以使用桶形移位器作为其他指令的一部分进行轮班。

在处理接受换班的指令之前,处理器将检查换档是否被指定。如果不是所应用的默认移位是LSL#0。

现在,寄存器将被移位的数量可以在指令的5位字段中指定,也可以在寄存器的底部字节中指定。但是,使用5位字段没有额外的开销,而使用寄存器需要额外的周期。

5位给你32个不同的值。由于当我们不想应用任何移位时,我们需要有一个0值,因此LSL的可能值范围为0-31,而LSR和ASR的范围为1-32,因为您不需要执行LSR# 0或ASR#0。

对于LSR#32或ASR#32,如果要将寄存器的值设置为零或1,并知道最后一位要移位的位置,那么它们可能很有用,因为它将移入进位位。