与 Windows CE(使用原始APCS又名旧 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。请参阅Platform Builder 7 中的新增功能。
编辑:刚才注意到您添加了一个关于 C++ 的问题。Microsoft 不使用 Itanium 样式的 C++ ABI,因为它们的实现早于它。您可以在我的 OpenRCE 文章(1、2 )和后续的Recon 演示文稿中了解 Microsoft 的实现。另请参阅设计师 Jan Gray 的原始描述:PDF。