gcc内联汇编函数,用于关闭所有浮点寄存器

gcc内联汇编函数,用于关闭所有浮点寄存器,gcc,inline-assembly,gnu-assembler,Gcc,Inline Assembly,Gnu Assembler,我正在尝试编写一个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)" ); 我的问题是,我无法告诉汇编程序

我正在尝试编写一个
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)
,因为我无法在关闭器列表中指定
%st(0)
(或
%st”
),这会导致编译错误。

您在
%st(0)
中返回一个结果;这就是
t
约束的含义。因此,编译器知道它已被修改

我不确定您的GCC为什么不将
%st(0)
%st
识别为clobber列表中的名称,但在这种情况下,这不会导致问题


Apple clang版本4.0(tags/Apple/clang-418.0.60)接受clobber列表中的
%st
,即使将
=t
作为输出约束。

错误:“asm”中的未知寄存器名“%st(0)”
错误:“asm”操作数具有不可能的约束<代码> >或代码>错误:在ASM“<代码”中,未知的登记名“%ST[())>在<代码>“ST[())< /Calp+G+ >版本:<代码> G++.exe(Rev1,由明明建立项目)4.4.0版权(C)2013免费软件基金会,…<代码> >正确的登记为“代码> ST <代码>。您在这里看到的错误消息来自这样一个事实,即您正在对它进行重击并返回它(
=t
表示返回
st
中的值)。你可以选择其中一个(或者两者都不做),但你不能既击打它又把它退回。这是一个不可能的限制。