如何确保调度错误不会发生在超标量芯片中

时间:2014-11-17 14:46:33

标签: assembly embedded gcc

我喜欢将我的asm包装在C子例程中。像这样:

void foo()
{
     __asm__("op R0, R1");
     ...
     __asm__("op R1, R4"); /* last instruction */
}

当我这样做时,我有时会遇到调度错误,我的代码崩溃了。在纯ABI兼容ASM中编写子程序时,有时会导致我的C代码的其他部分无法正常运行,但不会崩溃。

我能做些什么来帮助/使GCC防止调度错误。

1 个答案:

答案 0 :(得分:1)

您不能假设编译器生成的代码不使用寄存器;或者编译器知道你的内联汇编有什么用。 注意:对于某些编译器,编译器可能直接从汇编中推断出事物,但对于仅支持少量架构的编译器来说这很难做到,而对于支持各种不同的GCC的几乎不可能。架构。

一般来说,海湾合作委员会使用类似" clobber list"这样编译器就可以知道程序集修改了什么,输入/输出参数列表可以将值传入/传出每个单独的内联汇编。

如果您没有正确使用输入参数,输出参数和clobber列表,那么如果您的程序集弄乱了编译器生成的代码或编译器生成的代码,那么它不是GCC的错误代码搞砸了你的装配。

有关详细信息,我建议:https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Extended-Asm