内联汇编块中的临时寄存器

时间:2014-03-12 16:15:33

标签: c assembly inline-assembly cpu-registers

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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