我即将学习内联汇编.GCC内联汇编食谱http://www.ethernut.de/en/documents/arm-inline-asm.html 表示:
A strict rule is: Never ever write to an input operand.
有人可以告诉我 - 如果是这样的话 - 这条规则是否正确?
假设我通过某个寄存器得到输入操作数的值。如果我不将它声明为输出操作数,我是否不允许在同一个程序集块中重用该寄存器?
示例:
asm volatile("add %[value], %[value], %[value] \n\t"
"mov %[result], %[value] \n\t"
: [result]"=r" (y)
: [value]"r" (x)
: //no clober
);
我知道这个例子没有多大意义 - 但是它无效吗?
我问,因为我正在编写一些汇编函数,它接受许多输入操作数,每个操作数都采用通用寄存器。因为我的架构上只有12个GPR可用,每个输入操作数我都可以使用较少的“免费”寄存器。所以我真的必须将输入寄存器也声明为输出,以便使用它们在函数内部“工作”(即使我不需要在内联汇编体外的值?如果是这样的话 - 可以有人解释一下为什么呢?
希望问题清楚
谢谢!
答案 0 :(得分:1)
编译器不知道x被破坏了(我认为没有办法以有效的方式破坏输入寄存器)。因此,它可能会重复使用稍后在代码中保存x的寄存器,假设它仍然保持未更改的值,因为您更改了它,这是不正确的。