当编译器生成对函数的调用时,它会在调用之前保留可能被被调用函数(“调用者保存寄存器”)修改的任何寄存器的内容。
由于您已将此函数调用隐藏在内联汇编程序块中,因此编译器不知道它需要在调用周围保存和恢复寄存器。
简单的解决方案:不要那么做。如果要调用函数,请使用C函数调用语法。
复杂的解决方案:声明哪个寄存器调用此函数将使用clobber 扩展的内联汇编语法 。
感谢所有的评论。它有助于分配。我终于弄明白了。我的上下文切换没有处理FPU的状态。在再次回到可用状态后,我发现正常生成的C代码帮助我保存了FPU状态。
在上下文切换中实现FSAVE / FNSAVE和FRSTOR后,-O2优化代码也按预期工作。
@melpomene:正如你问的那样:
你看过生成的代码了吗?
回想起来,显然不够努力。
感谢所有建议,我希望这个主题可以帮助其他人现在记住x87 FPU指令:-P