为什么ARM LSL和LSR的允许移位值范围不同? [英] Why different ranges of permitted shift values for ARM LSL vs LSR?

查看:80
本文介绍了为什么ARM LSL和LSR的允许移位值范围不同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么LSL[0,31]允许移位值,而LSR允许移位值是[1,32]?

LSL中的0位移位对任何应用程序都有什么用处?为什么在LSR中不允许0班次?为什么LSL不允许32位移位?

推荐答案

此限制适用于按立即数进行的班次。按寄存器移位不受此类限制。

LSL允许为0表示"不换档"。这是一个特例,因为不修改标志设置指令的C标志。

LSRASR乘以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, #imm5ASR 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆