为什么逻辑右移和算术右移的换档范围为1-32

时间:2013-06-25 05:45:30

标签: assembly arm machine-code

我已经看到逻辑左移可以从1-31位进行移位。算术右移和逻辑右移取1 -32作为移位量。为什么右转和左转之间存在差异?

2 个答案:

答案 0 :(得分:3)

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

  

LSL#0是一种特殊情况,其中移位器执行的是CPSR C的旧值   旗。 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和0有其特殊的含义。 汇编程序将LSR #0ASR #0转换为LSL #0,因为它们具有相同的含义,这意味着LSR #0机器码编码 ASR #0可以免费使用其他东西;所以他们将移位量为零的LSR/ASR解释为32。

答案 1 :(得分: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,如果你想用0或1设置寄存器并知道要移位的最后一位是什么,那么它们会很有用,因为它会被移到进位。