提示需要!程序有错误的行为使用内联asm来调用函数而不是C函数

问题描述 投票:1回答:2

我正在编写自己的操作系统。它是一个非抢占式操作系统,我的线程与调度程序一起工作正常。我有一个边缘案例。如果我不从C调用我的yield()函数但是做asm("call yield")后来的计算失败但只有-O2优化。

像许多人所说,这总是我们的错

我已经尝试了所有我能想到的方法,但现在我很绝望。

因此,如果有人对可能发生的事情或我应该调查的内容有一些提示请分享。

我想这会因为不在话题而被关闭,但任何提示都非常感谢。

optimization inline-assembly osdev context-switch fpu
2个回答
4
投票

当编译器生成对函数的调用时,它会在调用之前保留可能被被调用函数(“调用者保存寄存器”)修改的任何寄存器的内容。

由于您已将此函数调用隐藏在内联汇编程序块中,因此编译器不知道它需要在调用周围保存和恢复寄存器。

简单的解决方案:不要那么做。如果要调用函数,请使用C函数调用语法。

复杂的解决方案:声明使用extended inline assembler syntax注册此函数调用将使用clobber。


2
投票

感谢所有的评论。它有助于分配。我终于弄明白了。我的上下文切换没有处理FPU的状态。在再次回到可用状态后,我发现正常生成的C代码帮助我保存了FPU状态。

在上下文切换中实现FSAVE / FNSAVE和FRSTOR后,-O2优化代码也按预期工作。

@melpomene:正如你问的那样:

你看过生成的代码了吗?

回想起来,显然不够努力。

感谢所有建议,我希望这个主题可以帮助其他人现在记住x87 FPU指令:-P

© www.soinside.com 2019 - 2024. All rights reserved.