【问题标题】:Limit Use of Registers in C限制 C 中寄存器的使用
【发布时间】:2012-06-23 00:07:33
【问题描述】:

我的问题非常类似于:GCC: Prohibit use of some registers

但是,我想限制 C 函数中使用的寄存器数量。换句话说,我希望能够像使用clobber 寄存器一样使用指令,但应用在C 函数级别而不是内联汇编中。此外,每个函数可能有一组不同的寄存器可供使用,因此它不可能是一刀切的解决方案。

我想到的唯一两种可能的解决方案是:

  • 在汇编程序中执行所有操作。不能真正解决我的问题...
  • 使用某种指令分别编译每个函数,以便在 GCC 中条件使用寄存器。如果单独编译每个函数,我会失去很多潜在的优化,这会使代码几乎不可读。

既然我试图在 C 中完成所有这些工作,那么预编译器有什么办法可以在这里提供帮助吗?是否有任何可能的方法来实现我的预期目标?

【问题讨论】:

  • 请问您为什么要这样做?
  • 如果你试图禁止特定的寄存器,那么你就不再是真正的 C 级别了。
  • 您最好不要担心它并让编译器按照它认为最好的方式使用寄存器。如果你仍然担心它,那么你是在处理汇编语言编程,而不是真正的 C 编程。
  • 即使是 register 关键字也只是一个建议。编译器无论如何都会尝试将变量保存在寄存器中,register 关键字指示它在有机会的情况下优先选择一个特定变量而不是其他变量。

标签: c gcc compiler-construction cpu-registers


【解决方案1】:

不,没有。您需要在函数或汇编语言中使用内联汇编语句。

【讨论】:

  • 我至少可以使用按函数编译或使用 clobber 寄存器调用内联汇编程序中的每个函数,所以我真的不能将“不,没有”设置为我接受的答案
  • 寄存器组织几乎就是那种使用比汇编语言更高级别的语言应该从编写程序的过程中抽象出来的东西。您最好的选择可能是用汇编语言编写关键例程,然后从 C 中调用它们。
  • 另外,您可以使用 -S 编译器标志(与 gcc 和可能的其他编译器一起使用)将您的 c 源文件简化为汇编语言,并在完全编译它们之前调整输出。
猜你喜欢
  • 2012-03-23
  • 2014-12-26
  • 2010-12-22
  • 2012-11-25
  • 2014-08-03
  • 2011-01-05
  • 1970-01-01
  • 2021-04-13
  • 2016-04-07
相关资源
最近更新 更多