我已经看到逻辑左移可以做1-31位的移位形式。算术右移和逻辑右移取1-32作为移位量。为什么左右轮班的区别?为什么逻辑右移和算术右移有一个移位范围1-32
回答
它与某些轮班操作的特殊含义有关。从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 #0
和ASR #0
将被汇编器转换为LSL #0
,因为它们具有相同的意义,这意味着机器代码编码为LSR #0
和ASR #0
自由使用别的东西;所以他们将0的位移量解释为LSR/ASR
的32。
我认为这与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,并知道最后一位要移位的位置,那么它们可能很有用,因为它将移入进位位。
- 1. 请解释逻辑右移,算术右移和右旋之间的区别
- 2. 逻辑,算术按位移
- 3. 从ADD和NAND向右移位逻辑?
- 4. 逻辑和算术移位的输出
- 5. 逻辑右移操作
- 6. 算术右移一个size_t值
- 7. 摊位算法和右移
- 8. Verilog中的算术右移
- 9. 大会 - 算术右移(SAR)
- 10. 算术移位作为一个逻辑移位,无论签署变量
- 11. 右移算术和十六进制数
- 12. 为什么UIView右移offsetBy
- 13. 为展位算法实现算术右移
- 14. 在C中实现逻辑右移C
- 15. 为什么在Java中有两个右移运算符和只有一个左移运算符?
- 16. 算术右移给假结果?
- 17. 对有符号整数进行逻辑右移运算
- 18. 按位和左/右移
- 19. 算术移位
- 20. android layout:edittext右移和左移
- 21. 逻辑移位和旋转
- 22. 向右移位运算功能
- 23. 为什么这个按位右移似乎不起作用?
- 24. 与右位移位奇怪的行为
- 25. 使用ALU运算符的一个位置右桶移位?
- 26. 什么是在iPhone上自动向左和向右移动拨片的逻辑?
- 27. LC3组件按位右移
- 28. 右移进位保存号
- 29. 按位右移大量
- 30. 预移位器会评估位移和算术运算吗?
因为你可能想要0x80000000和'shr'它32次产生一个0.但是采取'0x00000001'并且执行'lsh' 32次只会将设置位从int的末尾转储出来,的整数溢出。 –
请指定指令集 –
指令集是arm v7 – Gautam