【发布时间】:2015-02-24 14:48:28
【问题描述】:
我正在寻找一种在 ARM 模式下加载 32 位常量的通用方法。 不幸的是,我既不能使用“ldr rX,=const”(由于外部问题)也不能使用 movw/movt(我的目标是 armv6k)
这是我的尝试:
mov rX, 0
orr rX, (const&0x000000FF)
orr rX, (const&0x0000FF00)
orr rX, (const&0x00FF0000)
orr rX, (const&0xFF000000)
我的代码正确吗?你能建议我一个更好的方法吗?谢谢。
【问题讨论】:
-
根据侧面的 related 链接,SO tag ARM + constants 至少给出了ARM 12bit constants,其中我引用了该问题的至少 5 个不同重复项。一些谷歌搜索会给出ARM blog,它必须回答你所有的问题。
-
@artlessnoise 请记住,在我的情况下,不能使用“ldr rX, =const”。在这种情况下,您提供给我的链接并不能解决问题。
-
你可以使用
ldr rX,=const;你的外部问题是什么,是你的问题。使用 ARM 汇编程序执行此操作的方法是这样的。您可以手动对此进行编码,并且您已接受使用ldr rX, =const的答案。与orr方法相比,还有许多其他方法可以使用更短的数学恒等式(取决于常数)来做到这一点。 -
@artlessnoise 我正在修补 Android 运行时 (ART) 以生成 ARM 模式代码。 ART 还必须处理 32 位常量加载,但在这种情况下,我不知道如何处理 PC 相关表达式(将常量放在函数末尾也是一个问题),所以我必须使用 mov/orr。这就是为什么在问题中我要求使用 generic(常量在编译时未知)方式来加载 32 位函数!=“ldr rX,=const”。因此,您提供给我的所有链接都没有用。我将 dwelch 的答案标记为正确,因为它为我提供了解决问题的方法(而且它不是 ldr)。
标签: arm