我正在编写自己的操作系统。它是一个非抢占式操作系统,我的线程与调度程序一起工作正常。我有一个边缘案例。如果我不从C调用我的yield()
函数但是做asm("call yield")
后来的计算失败但只有-O2
优化。
像许多人所说,这总是我们的错
我已经尝试了所有我能想到的方法,但现在我很绝望。
因此,如果有人对可能发生的事情或我应该调查的内容有一些提示请分享。
我想这会因为不在话题而被关闭,但任何提示都非常感谢。
当编译器生成对函数的调用时,它会在调用之前保留可能被被调用函数(“调用者保存寄存器”)修改的任何寄存器的内容。
由于您已将此函数调用隐藏在内联汇编程序块中,因此编译器不知道它需要在调用周围保存和恢复寄存器。
简单的解决方案:不要那么做。如果要调用函数,请使用C函数调用语法。
复杂的解决方案:声明使用extended inline assembler syntax注册此函数调用将使用clobber。
感谢所有的评论。它有助于分配。我终于弄明白了。我的上下文切换没有处理FPU的状态。在再次回到可用状态后,我发现正常生成的C代码帮助我保存了FPU状态。
在上下文切换中实现FSAVE / FNSAVE和FRSTOR后,-O2优化代码也按预期工作。
@melpomene:正如你问的那样:
你看过生成的代码了吗?
回想起来,显然不够努力。
感谢所有建议,我希望这个主题可以帮助其他人现在记住x87 FPU指令:-P