我知道什么时候使用鞋匠列表(例如,列出一个在程序集中修改过的寄存器,这样它就不会被选为输入寄存器等),但我无法绕过earlyclobber 约束 &
。如果您列出输出,这是否已经意味着输入不能使用选定的寄存器(除了匹配数字限制)?
例如:
asm(
"movl $1, %0;"
"addl $3, %0;"
"addl $4, %1;" // separate bug: modifies input-only operand
"addl %1, %0;"
: "=g"(num_out)
: "g"(num_in)
:
);
输出变量甚至需要 &
吗?编译器应该知道为输出选择的寄存器,因此知道不要将它用于输入。
最佳答案
默认情况下,编译器假定在写入任何输出寄存器之前会消耗所有输入,因此允许两者使用相同的寄存器。这会在可能的情况下产生更好的代码,但如果假设是错误的,事情就会发生灾难性的失败。 “early clobber”标记是一种告诉编译器此输出将在所有输入被消耗之前写入的方式,因此它不能与任何输入共享寄存器。
GNU C 内联汇编语法旨在尽可能高效地包装单个 指令。您可以在一个 asm 模板中放置多个指令,但默认设置(假设在写入任何输出之前读取所有输入)是围绕包装单个指令而设计的。
它与 GCC 在其机器描述文件中使用的约束语法相同,这些文件告诉编译器哪些指令在 ISA 中可用。
关于c - 何时在扩展的 GCC 内联汇编中使用 earlyclobber 约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15819794/