【问题标题】:Temporary register in inline assembly block内联汇编块中的临时寄存器
【发布时间】:2014-04-16 22:38:07
【问题描述】:

我想编写一个使用临时寄存器的小型汇编程序。当我说临时寄存器时,我的意思是它不是 asm 块的约束意义上的输入或输出寄存器。我可以选择任何寄存器,然后将其包含在 clobber 列表中,但我认为编译器能够选择会更好。处理这个问题的正确方法是什么?我在网上找到的唯一建议是将其列为输出寄存器,然后不实际使用输出。

【问题讨论】:

  • 使用什么编译器?在什么 CPU/操作系统上?

标签: c assembly inline-assembly cpu-registers


【解决方案1】:

您不能在clobber 列表中使用r(通用寄存器)约束。并且假设只输入寄存器未被 asm 语句修改。最好的解决方案是将 temp 指定为输出寄存器,这使编译器可以选择丢弃“结果”,也可以停用该寄存器。

unsigned long tmp; /* register 'word' type. */

__asm__ ("..." : "=r" (tmp), ... : <inputs> : <clobbered>);

在本例中,您现在可以将临时寄存器称为%0。如果从未使用过tmp 变量,编译器可以丢弃结果并继续(重新)使用该寄存器。

【讨论】:

  • 好吧,这听起来不错。编译器大概会注意到我之后再也没有使用过tmp
  • @MichaelMcLoughlin - 这假定使用 %0 的指令对它们可以使用的寄存器没有任何限制。某些 x86 指令有这样的怪癖,例如,qQconstraints
  • 注意不要给编译器留下汇编代码的唯一意义就是计算tmp的印象,否则它可能会丢弃整个东西!
猜你喜欢
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多