我想编写一个使用临时寄存器的小型汇编程序。当我说临时寄存器时,我的意思是它不是asm
块约束意义上的输入或输出寄存器。我可以选择任何寄存器,然后将其包含在clobber列表中,但我认为编译器能够选择更好。处理这个问题的正确方法是什么?我在网上找到的唯一建议是将其列为输出寄存器,然后实际上不使用输出。
答案 0 :(得分:2)
您无法在clobber列表中使用r
(通用寄存器)约束。并且假定只有输入的寄存器不被asm语句修改。最好的解决方案是将temp指定为输出寄存器,这使编译器可以选择丢弃'结果'以及能够退出寄存器。
unsigned long tmp; /* register 'word' type. */
__asm__ ("..." : "=r" (tmp), ... : <inputs> : <clobbered>);
在此示例中,您现在可以将临时寄存器称为%0
。如果从未使用tmp
变量,编译器可以丢弃结果并继续(重新)使用寄存器。