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

Assembly 为什么逻辑右移和算术右移的移位范围为1-32,assembly,arm,machine-code,Assembly,Arm,Machine Code,我已经看到逻辑左移位可以从1-31位进行移位。算术右移位和逻辑右移位取1-32位作为移位量。为什么左右换档不同?我认为这与臂筒换档器有关。基本上,ARM架构没有真正的移位指令。相反,它使您可以使用桶式换档器作为其他指令的一部分进行换档 在处理接受移位的指令之前,处理器将检查是否指定了移位。如果不是,则应用的默认移位为LSL#0 现在,寄存器的移位量在指令中的5位字段或寄存器的底部字节上指定。然而,使用5位字段没有额外的开销,而使用寄存器需要额外的周期 5位给出32个不同的值。因为我们不想应用任何

我已经看到逻辑左移位可以从1-31位进行移位。算术右移位和逻辑右移位取1-32位作为移位量。为什么左右换档不同?

我认为这与臂筒换档器有关。基本上,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,并且知道最后一个要移位的位是什么,那么这些都很有用,因为它将被移动到进位

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

LSL#0是一种特殊情况,其中换档杆执行是CPSR C的旧值 旗帜Rm的内容直接用作第二个操作数。
..
可能与LSR#0对应的移位字段形式用于 对LSR#32进行编码,其结果为零,Rm的位31作为进位输出。合乎逻辑 右移零是冗余的,因为它与逻辑左移零相同,因此汇编程序 将LSR#0(以及ASR#0和ROR#0)转换为LSL#0,并允许使用LSR#32 特定的

换言之,处理器设计者为
LSL#0
赋予了特殊含义,这也意味着
LSL#32
不可能进行编码,因为移位量1..31被解释为原样,0具有特殊含义。
LSR#0
ASR#0
将由汇编程序转换为
LSL#0
,因为它们具有相同的含义,这意味着
LSR#0
ASR#0
的机器代码编码可自由用于其他用途;因此,对于
LSR/ASR

,他们将移位量0解释为32,因为您可能需要0x8000000和
shr
进行32次才能生成0。但是执行
0x00000001
并执行
lsh
32次只会将设置位从int的末尾转储,产生整数溢出的等效值。请指定指令集指令集为arm v7