为什么引导加载程序正在组装?

Why bootloaders are in assembly?

我已经阅读了几个嵌入式项目,在所有这些项目中,引导加载程序都是用 Assembly 而不是 C 编写的。这有什么原因吗?

让它尽可能的小。您不希望引导加载程序占用您可能用于实际程序的所有 space,并且在某些芯片中,为引导加载程序保留的内存 space 相对较小。这样的小程序仍然是汇编中手动优化的可行目标。

虽然你可能会在 C 中非常接近。

通常至少入口点存根,以及可能到真正内核的过渡,需要用汇编语言编写,因为它们涉及 control-transfer/calling-convention 在 C 中无法表示的约束。例如,如果引导加载程序需要在堆栈可用之前初始化堆栈指针以指向 ram,如果没有笨拙的编译器扩展,这不能用 C 表示。然而,通常可以保持写入 asm 的数量非常小并且与这些类型的边界隔离。如果引导加载程序的其余部分也是用 asm 编写的,这通常表明作者没有很好地评估成本(维护、错误等)与收益(可能更小)。