【问题标题】:What is the most efficient way to set one bit of a register in ARM?在ARM中设置一位寄存器的最有效方法是什么?
【发布时间】:2011-10-07 13:02:00
【问题描述】:

我正在编写 ARM 汇编代码,有时必须将寄存器的一位设置为 1。当然,最好通过“register-or-bitmask”方法来完成。但是,根据 ARM 文档,Assembly ORR 命令(按位或)确实采用立即值。换句话说,您只能将一个寄存器中的值与另一个寄存器中的值按位或。仔细想想,这是有道理的,因为 ARM 指令本身就是 32 位长,因此无法将 32 位掩码塞进指令中。但是,将立即值写入寄存器只是为了正确使用它是低效的,因为它会产生read-after-write 危险,从而使 CPU 停顿。一般来说,ORR 带有掩码的寄存器的最有效方法是什么,而不会浪费寄存器不断地将掩码保存在内存中? ARM 有什么推荐吗?

【问题讨论】:

  • 您的目标处理器是什么? Cortex-M3 有一个bit-banded 内存区域,如果您有该选项,这是执行此操作的最佳方式。

标签: assembly arm bitwise-operators pipeline


【解决方案1】:
ORR r0, r1, #0x4

在标准 ARM 中非常好。您可以在 32 位 ARM 指令中编码立即数,但它们的范围是有限的。 See this explanation.

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

【讨论】:

  • 抱歉,ARM 网站重定向到某个奇怪的地方。我会删除链接。
  • 我想我们只是在文档中发现了一个侥幸。 = ) 通常会提到立即模式,但是对于手册中的其他所有内容,它没有单独的页面,就像其他所有内容一样。谢谢=)
  • @Phonon 我的 ARMARM(v7AR 和 v7M)副本都将 ORR(立即)作为单独的页面。您使用的是哪个文档?
【解决方案2】:

虽然 ARM(或 mips,我假设是其他的)无法容纳完整的寄存器大小的立即数,但 ARM 确实具有立即值的 alu 操作。而且你不限于0x00到0xFF你可以

orr r0,r0,#0x02000000 

例如,没问题。 0x00 到 0xFF 在 32 位中的任何位置移动,一些指令可能会给你第九位 0x000 到 0x1FF(移动到任何位置),至少我似乎记得有关该工作的一些信息(对于一个/一些指令)。您按照上面的方式对指令进行编码,汇编器会为您将立即数打包到指令中。

【讨论】:

    猜你喜欢
    • 2011-02-19
    • 1970-01-01
    • 2012-01-18
    • 2023-03-05
    • 1970-01-01
    • 2016-07-11
    相关资源
    最近更新 更多