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

标签 c gcc assembly inline-assembly

我知道什么时候使用鞋匠列表(例如,列出一个在程序集中修改过的寄存器,这样它就不会被选为输入寄存器等),但我无法绕过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/

相关文章:

ios - GAS 宏内的标签

c - 为什么 MISRA 规则禁止使用 '#undef' ?

c - 稳定标准库 qsort?

linux - 为什么我的代码会在启动函数结束时崩溃?

c++ - G++无法内联多态方法吗?

parsing - 编写 Z80 汇编程序 - 词法 ASM 并使用组合构建解析树?

gcc - 基于 x86-64 汇编的索引寻址和段错误

c - 3d vector 和立方体的交点位置

objective-c - 创建单色 CGImageRef(每像素位图 1 位)

c++ - .data.rel.ro+0x8错误: undefined reference to 'typeinfo for android::MediaSource'