需要提示!程序使用内联 asm 调用函数而不是 C 函数时出现错误行为

Tips needed! Program has wrong behavior using inline asm to call function instead of C function

我目前正在编写自己的操作系统。它是一个非抢占式 OS 并且我的线程与调度程序一起工作正常。不过我有一个极端情况。如果我不从 C 调用我的 yield() 函数而是执行 asm("call yield"),则稍后的计算将失败,但只有 -O2 优化。

Like many have said, it is always our fault

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

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

我想这会因为偏离主题而关闭,但非常感谢任何提示。

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

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

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

复杂的解决方案:使用 extended inline assembler syntax.

声明此函数调用将破坏的寄存器

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

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

@melpomene:如您所问:

Have you looked at the generated code?

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

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