Assembly 如何知道某个数字在ARM中可以表示为32位立即数?

Assembly 如何知道某个数字在ARM中可以表示为32位立即数?,assembly,arm,immediate-operand,Assembly,Arm,Immediate Operand,给定一个数字x,我们如何判断它可以表示为32位立即数。 有什么公式存在吗?如果是,该公式是否详尽无遗,即涵盖所有可能的情况?ARM将指令集中最右边的12位分解为4位旋转位和8位值位。我将研究开源编译器以及它们是如何实现的 我认为您可以测试总体计数(1位的数量)是否是您所指的指令?--“使用LDR Rd,=const”,因此,如果它不“适合”,汇编程序应该将其放在文字池中,因此我看不到那里的限制。计算第一个和最后一个“1”位之间的距离(允许换行)。若小于8,那个么就可以了。@Michael:是的

给定一个数字x,我们如何判断它可以表示为32位立即数。
有什么公式存在吗?如果是,该公式是否详尽无遗,即涵盖所有可能的情况?ARM将指令集中最右边的12位分解为4位旋转位和8位值位。

我将研究开源编译器以及它们是如何实现的


我认为您可以测试总体计数(1位的数量)是否是您所指的指令?--“使用LDR Rd,=const”,因此,如果它不“适合”,汇编程序应该将其放在文字池中,因此我看不到那里的限制。计算第一个和最后一个“1”位之间的距离(允许换行)。若小于8,那个么就可以了。@Michael:是的,刚刚意识到-谢谢-这里有一个有用的工具:(向下滚动到页面底部)-虽然我们只讨论暴力检查,而不是更聪明的算法。请注意,gcc源代码还检查更现代的ARM
mov
即时编码,允许使用“0xAB00AB00”和“0x00AB00AB”类型常量。还有一个很好的例子,可能对读者有所帮助。“gas”汇编程序可能更好,因为它需要决定
ldr rX,=xxx
mov
还是
ldr rX,[pc,#offset]
/* Return TRUE if int I is a valid immediate ARM constant.  */
int
const_ok_for_arm (HOST_WIDE_INT i)
{
...