为什么ARM LSL和LSR的允许移位值范围不同? [英] Why different ranges of permitted shift values for ARM LSL vs LSR?
本文介绍了为什么ARM LSL和LSR的允许移位值范围不同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
为什么LSL[0,31]允许移位值,而LSR允许移位值是[1,32]?
LSL中的0位移位对任何应用程序都有什么用处?为什么在LSR中不允许0班次?为什么LSL不允许32位移位?推荐答案
此限制适用于按立即数进行的班次。按寄存器移位不受此类限制。
LSL
允许为0表示"不换档"。这是一个特例,因为不修改标志设置指令的C
标志。
LSR
和ASR
乘以0的行为与LSL
乘以0的行为相同,因此CPU设计人员决定将立即操作数设置为0表示移位32,从而启用额外的功能。对于ROR
,移位0表示特殊的"向右旋转扩展"指令RRX
,因为旋转32将不是很有用。
例如,请参阅ARM7TDMI数据手册,上面写着:
注意LSL#0是一个特例,其中移位器进位是CPSR C标志的旧值。Rm的内容直接用作第二个操作数。
可以预期对应于LSR#0的移位域的形式被用来编码LSR#32,其结果为零,其中Rm的位31作为进位输出。逻辑右移零是冗余的,因为它与逻辑左移零相同,因此汇编程序会将LSR#0(以及ASR#0和ROR#0)转换为LSL#0,并允许指定LSR#32。
可能期望给出ASR#0的移位字段的形式被用来编码ASR#32。Rm的位31再次用作进位输出,并且操作数2的每个位也等于Rm的位31。因此,根据Rm的第31位的值,结果是全1或全0。
可能期望给出ROR#0的移位域的形式被用来编码桶形移位器的特殊功能,即扩展右旋转(RRX)。这是通过将CPSR C标志添加到Rm[...]内容的最高有效端而形成的33位数量的一个位位置的右移。
在拇指(T32)模式下,惯例被改编。Thumb缺少明显的MOVS Rd, Rn
指令,因此LSLS Rd, Rn, #0
用于此目的。LSR Rd, Rn, #imm5
和ASR Rd, Rn, #imm5
的行为与它们在A32模式下的行为相同。通过将五位立即数字段设置为零来编码#32
的立即数。假设指令ROR Rd, Rn, #imm5
不存在,因为它所在的操作码空间用于编码
ADDS Rd, Rn, Rm
SUBS Rd, Rn, Rm
ADDS Rd, Rn, #imm3
SUBS Rd, Rn, #imm3
改为。
这篇关于为什么ARM LSL和LSR的允许移位值范围不同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文