内联汇编输出寄存器声明

时间:2010-10-14 00:42:55

标签: inline-assembly

我即将学习内联汇编.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可用,每个输入操作数我都可以使用较少的“免费”寄存器。所以我真的必须将输入寄存器也声明为输出,以便使用它们在函数内部“工作”(即使我不需要在内联汇编体外的值?如果是这样的话 - 可以有人解释一下为什么呢?

希望问题清楚

谢谢!

1 个答案:

答案 0 :(得分:1)

编译器不知道x被破坏了(我认为没有办法以有效的方式破坏输入寄存器)。因此,它可能会重复使用稍后在代码中保存x的寄存器,假设它仍然保持未更改的值,因为您更改了它,这是不正确的。