何时在扩展GCC内联汇编中使用earlyclobber约束?

我知道何时使用补鞋匠列表(例如列出在程序集中修改的寄存器,以便它不被选择用作输入寄存器等),但我无法绕过早期约束条件& 。 如果列出输出,那是否已经意味着输入不能使用所选寄存器(除了匹配数字约束)?

例如:

 asm( "movl $1, %0;" "addl $3, %0;" "addl $4, %1;" "addl %1, %0;" : "=g"(num_out) : "g"(num_in) : ); 

输出变量会不会甚至需要? 编译器应该知道为输出选择的寄存器,因此知道不要将它用于输入。

默认情况下,编译器假定在写入任何输出寄存器之前将消耗所有输入,因此允许它们使用相同的寄存器。 这会在可能的情况下产生更好的代码,但如果假设是错误的,事情将会灾难性地失败。 “早期clobber”标记是告诉编译器在所有输入被消耗之前将写入此输出的一种方式,因此它不能与任何输入共享寄存器。