什么是ARM上的Windows RT本机代码调用约定? 我找不到任何关于VisualStudioC++中ARM调用约定的Windows RT文档。微软在使用ARM吗 [P>如果微软在ARM上使用Windows Application的APCS/EABI,它是否也使用(它是由ItAuthC++ C++ ABI派生的)?甚至可能是那个
ARM上Windows RT使用的调用约定是否与其他(嵌入式)ARM Windows变体使用的调用约定不同 是否有可靠的方法通过预定义的编译器宏检测ARM上的Windows RT什么是ARM上的Windows RT本机代码调用约定? 我找不到任何关于VisualStudioC++中ARM调用约定的Windows RT文档。微软在使用ARM吗 [P>如果微软在ARM上使用Windows Application的APCS/EABI,它是否也使用(它是由ItAuthC++ C++ ABI派生的)?甚至可能是那个,c++,winapi,windows-runtime,arm,calling-convention,C++,Winapi,Windows Runtime,Arm,Calling Convention,ARM上Windows RT使用的调用约定是否与其他(嵌入式)ARM Windows变体使用的调用约定不同 是否有可靠的方法通过预定义的编译器宏检测ARM上的Windows RT 更新:添加了关于C++ abi的问题。 < p>我只能回答第二个问题。 ARM上Windows RT使用的调用约定是否与其他(嵌入式)ARM Windows变体使用的调用约定不同 实际上有三个概念应该被理解。一个是ARM过程调用标准,另一个是ABI语言,第三个是系统调用约定。简单地说,ARM过程调用标准描述了序言/尾声
更新:添加了关于C++ abi的问题。
< p>我只能回答第二个问题。 ARM上Windows RT使用的调用约定是否与其他(嵌入式)ARM Windows变体使用的调用约定不同 实际上有三个概念应该被理解。一个是ARM过程调用标准,另一个是ABI语言,第三个是系统调用约定。简单地说,ARM过程调用标准描述了序言/尾声中寄存器的使用。语言ABI描述了如何传递语言变量。例如,一个双精度、一个长长度、这个指针、动态转换
,等等。第一个用于将汇编程序与编译器连接起来,第二个用于编译器互操作性。第三个问题是如何进行操作系统调用
ARM程序调用标准
本文档有助于理解一些ARM变体。基于四种不同的选择,共有16种变体
malloc()
将无法工作,因为系统调用将完全不同。通常,您必须使用-nostlib
进行编译,并创建自己的C库
<>我已经搜索了一点,找到了VisualC++的细节。
arm linux eabi gcc
,arm linux gnueabi gcc`,等等。与Windows CE(使用原始的aka旧ABI)不同,arm上的Windows RT使用eabi。更具体地说,使用浮点寄存器传递浮点数据和8字节堆栈/参数对齐的变体
如果我采用以下功能:
int g(float x) {
return x;
}
并使用VS2012的ARM编译器进行编译,得到以下程序集:
|g| PROC
vcvt.s32.f32 s0,s0
vmov r0,s0
bx lr
ENDP ; |g|
您可以看到它对参数使用的是S0
,而不是R0
VS2008中的版本(可用于针对较旧的Windows CE版本)产生以下结果:
str lr, [sp,#-4]!
ldr r3, =__imp___stoi
ldr r3, [r3]
mov lr, pc
bx r3
ldr pc, [sp],#4
此代码正在调用助手函数以执行转换
Windows Compact 7附带的Windows CE编译器支持旧的调用约定(MS称为“cdecl”)和EABI。看
<>强>编辑< /强>:刚才注意到你添加了一个关于C++的问题。微软不使用ItAIAL风格的C++ ABI,因为它们的实现早于它。您可以在我的OpenRCE文章(,)和后续文章中了解Microsoft的实现。另请参见设计师Jan Gray的原始描述:。感谢您提供有关ARM调用约定和ABI的一些信息,但如果我没有遗漏任何内容,您还没有真正回答我的任何问题。你基本上说VisualC++可以在AWC上编译Win RT时使用或不使用AAPCS,并且这些问题应该在“手册”中回答。这主要是正确的。我提供了一种方法来回答以下问题:ARM上的Windows RT使用的调用约定是否与其他(嵌入式)ARM Windows变体使用的调用约定不同?开场白/尾声很可能是相同的。语言ABI和系统接口可能不同。我想我是说打电话给大会有点过头了