WinCE 和 Linux 上的 ARM 调用约定?

Qwe*_*tie 5 linux arm calling-convention windows-ce

WinCE 和 Linux 在 ARM 上使用相同的调用约定吗?有什么区别?

到目前为止,我发现的文件并没有很好地解释。例如,在http://msdn.microsoft.com/en-us/library/ms864497.aspx 上,一行显示“Windows CE .NET 编译器”,下一行显示“ARM 编译器”,而“CLARM " 在底部,并不清楚它是指相同的编译器还是不同的编译器。这是我迄今为止发现的......

  • ARM 调用序列规范(WinCE) - 写得不好的文档
  • ARM 到 C 调用约定(Linux) - 非正式解释
  • 维基百科- 没有指定操作系统,也没有说明如何处理结构、浮点数或 64 位数字,也没有说明额外参数放在哪里以防它们不适合寄存器。
  • 更新:ARM 体系结构的过程调用标准- 最后我找到了一个全面的文档,但它没有说明哪些操作系统遵循标准(或者这些操作系统可能施加哪些变体或附加约束)。

我问的原因是我想尝试在 WinCE 中使用 LLVM 在运行时生成一些简单的代码,但它只正式支持 Linux。

dor*_*ron 2

调用约定是由编译器实现的,与操作系统无关。话虽如此,我可以确认 gcc 和 RVCT(ARM 的 c/c++ 编译器)都生成遵循您上面提到的 ARM 体系结构的过程调用约定的代码。

查看 Microsoft 文档的链接,我还可以确认它遵循 ARM 调用约定。

  • 如果您希望能够调用操作系统定义的函数(并向这些函数提供回调),那么调用约定是特定于操作系统的。我希望编译器默认使用操作系统期望的调用约定,以便可以将回调函数传递给它......但你是对的,编译器可以使用不同的东西。那么异常处理呢?它可能要求所有编译器遵循某些约定,以便可以可靠地展开堆栈。 (3认同)