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

时间:2011-10-07 13:02:01

标签: assembly arm bitwise-operators pipeline

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

2 个答案:

答案 0 :(得分:3)

ORR r0, r1, #0x4

在标准ARM中完全没问题。您可以在32位ARM指令中对立即值进行编码,但它们的范围是有限的。 See this explanation

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

答案 1 :(得分:1)

虽然ARM(或mips,我假设其他人)不能适应立即大小的完整寄存器,但ARM确实具有立即值的alu操作。而且你可以

不限于0x00到0xFF
orr r0,r0,#0x02000000 
例如,没问题。 0x00到0xFF在32位中的任何位置移位一些指令可能会给你第九位0x000到0x1FF(在任何地方移位),至少我似乎记得有关该工作的事情(对于一个/一些指令)。您可以按照上面的说明对指令进行编码,汇编程序负责将立即打包到指令中。