我已经看到逻辑左移可以从1-31位进行移位。算术右移和逻辑右移取1 -32作为移位量。为什么右转和左转之间存在差异?
答案 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 #0
和ASR #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设置寄存器并知道要移位的最后一位是什么,那么它们会很有用,因为它会被移到进位。