ARM中设置一个寄存器的一位最有效的方法是什么?

3
我正在编写ARM汇编代码,在某一时刻必须将一个寄存器的单个位设置为1。当然,最好使用“寄存器-位掩码”方法来完成。然而,根据ARM文档,汇编ORR命令(按位或)不接受立即值。换句话说,您只能将一个寄存器中的值与另一个寄存器中的值进行按位或操作。如果您想一下,这是有道理的,因为ARM指令本身是32位长的,所以无法将32位掩码压缩到指令中。然而,为了立即使用它而将立即值写入寄存器是低效的,因为它会产生读取后写入冒险,从而使CPU停顿。一般来说,最有效的方法是在不浪费寄存器持续保存该掩码的情况下将寄存器与掩码进行ORR吗?ARM有推荐的做法吗?

你的目标处理器是什么?如果你有这个选项,Cortex-M3拥有一个位带内存区域,这是最好的方法。 - Kevin Vermeer
2个回答

5
ORR r0, r1, #0x4

在标准 ARM 中,这是完全可以的。您可以在 32 位 ARM 指令中编码立即值,但其范围受到限制。请参见此解释

您提供的链接指向 Thumb 文档;您确定需要使用 Thumb 指令吗?


抱歉,ARM网站重定向到一些奇怪的地方。我会删除链接。 - Phonon
我认为我们在文档中发现了一个差错。 :) 立即模式被一般性地提到,但与手册中的其他所有内容不同,它没有单独的页面。谢谢 :) - Phonon
@Phonon,我的 ARMARM(v7AR 和 v7M)副本都有 ORR(Immediate)作为单独的页面。您使用的是哪个文档? - James Greenhalgh

1

尽管ARM(或mips,我认为其他处理器也是如此)无法容纳完整的寄存器大小的立即数,但ARM确实具有带有立即值的ALU操作。而且你不仅限于0x00到0xFF。

orr r0,r0,#0x02000000 

例如,没有问题。在32位中将0x00到0xFF移位到任何位置,某些指令可能会给你第九位0x000到0x1FF(在任何地方移位),至少我记得有关于这个工作的一些东西(对于一个/一些指令)。您可以按照上述方式编写指令,汇编器会为您打包立即执行指令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接