我想在我的 C 代码中编写一些内联 ARM 汇编。对于此代码,我需要使用一个或两个以上的寄存器,而不仅仅是声明为函数的输入和输出的寄存器。我知道如何使用 clobber 列表来告诉 GCC 我将使用一些额外的寄存器来进行计算。
但是,我确信 GCC 在优化时可以自由地调整寄存器的用途。也就是说,我感觉使用固定寄存器进行计算是一个坏主意。
在不使用固定寄存器的情况下,使用一些既不是内联汇编的输入也不是输出的额外寄存器的最佳方法是什么?
附注我认为使用虚拟输出变量可能会达到目的,但我不确定会产生什么样的奇怪的其他效果......
最佳答案
好吧,我找到了一个支持使用虚拟输出而不是硬寄存器的想法的来源:
4.8 Temporary registers: People also sometimes erroneously use clobbers for temporary registers. The right way is to make up a dummy output, and use “=r” or “=&r” depending on the permitted overlap with the inputs. GCC allocates a register for the dummy value. The difference is that GCC can pick a convenient register, so it has more flexibility.
来自 this 第 20 页pdf.
对于任何对 GCC 内联汇编感兴趣的人 this事实证明该网站非常有启发性。
关于gcc - 在 GCC 中使用内联 ARM 汇编时优化所用寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8720493/