我正在尝试编写一个asm
语句( GCC中的内联汇编),它只调用一些函数,它在浮点寄存器中返回一个值并且没有操作数,但可能会破坏所有浮点寄存器。
asm("call *%1"
: "=t"(result_)
: "d"(code_.data())
: "memory", "cc", "ax", "%st(1)", "%st(2)", "%st(3)", "%st(4)", "%st(5)", "%st(6)", "%st(7)"
);
我的问题是我无法告诉汇编程序,这也破坏了顶部浮点寄存器%st(0)
,因为我无法在clobber列表中指定"%st(0)"
(或"%st"
)(它导致编译错误。)
答案 0 :(得分:1)
您将在%st(0)
中返回结果;这就是t
约束的含义。因此,编译器知道它已被修改。
我不确定为什么你的GCC没有将%st(0)
或%st
识别为clobber列表中的名称,但这不应该在这种情况下引起问题。
Apple clang 4.0版(标签/ Apple / clang-418.0.60)在clobber列表中接受%st
,即使=t
作为输出约束。