什么是ARM本机代码调用约定?

Ste*_*orf 4 c++ winapi arm calling-convention windows-runtime

我在Visual Studio C++使用的ARM调用约定上找不到任何关于Windows RT的文档.微软是否使用ARM的AAPCS

如果Microsoft在ARM上使用AAPCS/EABI for Windows RT,它是否也使用ARM的C++ ABI(源自Itanium C++ ABI)?也许甚至ARM异常处理ABI

Windows RT上ARM使用的调用约定是否与其他(嵌入式)ARM Windows变体使用的约定不同?

有没有可靠的方法通过预定义的编译器宏检测ARM上的Windows RT?

更新:添加了有关C++ ABI的问题.

Igo*_*sky 8

与Windows CE(使用原始APCS又名旧ABI)不同,ARM上的Windows RT使用EABI.更具体地说,使用浮点寄存器传递浮点数据和8字节堆栈/参数对齐的变体.

如果我采取以下功能:

int g(float x) {
  return x;
}
Run Code Online (Sandbox Code Playgroud)

并使用VS2012的ARM编译器编译它,我得到以下程序集:

|g| PROC
    vcvt.s32.f32 s0,s0
    vmov        r0,s0
    bx          lr
    ENDP  ; |g|
Run Code Online (Sandbox Code Playgroud)

你可以看到它正在使用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
Run Code Online (Sandbox Code Playgroud)

此代码调用辅助函数来执行转换.

Windows Compact 7附带的Windows CE编译器支持旧的调用约定(MS称为"cdecl")和EABI.请参阅Platform Builder 7中的新增功能.

编辑:刚才注意到你添加了一个关于C++的问题.Microsoft不使用Itanium风格的C++ ABI,因为它们的实现早于它.你可以阅读有关微软在我OpenRCE文章(执行1,2)和后续侦察演示.另请参阅设计师Jan Gray的原始描述:PDF.