0

我正在尝试编写一个语句( GCCasm中的内联汇编),它只调用一些函数,在浮点寄存器中返回一个值并且没有操作数,但可能会破坏所有浮点寄存器。

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")(这会导致编译错误)。

4

1 回答 1

1

您正在返回结果%st(0);这就是t约束的意思。因此编译器知道它被修改了。

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

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

于 2013-04-23T13:33:38.907 回答