Assembly ARM处理器:检查立即值的有效性(位旋转)

Assembly ARM处理器:检查立即值的有效性(位旋转),assembly,binary,arm,immediate-operand,Assembly,Binary,Arm,Immediate Operand,在32位指令大小的ARM处理器中,我了解到ARM可以使用8位存储值,使用4位存储位旋转指令(将8位值移位2的倍数),以便获得比直接值的简单8/12位表示更好的范围 虽然我了解ARM如何获得扩展范围的过程,但我有兴趣知道是否有一种方法可以轻松检查我们选择的立即值在该方案下是否有效。在ARM的位旋转方案下,我们需要寻找哪种数字特征(二进制或十六进制)来帮助我们确定该值是否有效? Edit:是指向我正在谈论的概念的链接。请注意,对于mov,如果常量的位倒数合适,大多数ARM汇编器都会将其静默地组装成m

在32位指令大小的ARM处理器中,我了解到ARM可以使用8位存储值,使用4位存储位旋转指令(将8位值移位2的倍数),以便获得比直接值的简单8/12位表示更好的范围

虽然我了解ARM如何获得扩展范围的过程,但我有兴趣知道是否有一种方法可以轻松检查我们选择的立即值在该方案下是否有效。在ARM的位旋转方案下,我们需要寻找哪种数字特征(二进制或十六进制)来帮助我们确定该值是否有效?


Edit:是指向我正在谈论的概念的链接。

请注意,对于
mov
,如果常量的位倒数合适,大多数ARM汇编器都会将其静默地组装成
mvn
。在较新的处理器上有
movw
。我认为,拇指模式可以使用重复位模式立即进行MOV。(). 你只是想检查旋转的简单经典案例吗?我会选择
rbit
/
clz
(GNU C_uubuiltin_ctz)并使用它作为移位计数,将非零位移到寄存器的底部,并检查它是否
,除非需要检查它是否适用于偶数旋转计数,在我第一个想法的其他问题中:P.PaulR关于链接副本的删除答案也有同样的问题。从实际的汇编程序和编译器中提取了一些实际的工作示例。@PeterCordes嗨,是的,我只需要从概念上知道我们是否能够找到一些可旋转的实例来获得即时值;我们是否可以使用任何步骤/思想序列来检查是否存在这样的值?好的,如果您不关心汇编程序可以为某些指令选择的其他编码策略,那么这是完全重复的。在你的头脑中,看看设定位之间的距离有多远(包括环绕顶部,因为这是一个旋转),也就是说,你是否可以将它们旋转到底部,以便它们都适合低8位。(使用偶数旋转计数)。是的,您似乎已经知道该指令是如何工作的,因此只需检查从最低1到最高的大多数位是否为零,是在偶数边界上小于8位还是在奇数边界上小于7位?对于mvn,反之亦然