与 Windows CE(使用原始APCS http://infocenter.arm.com/help/topic/com.arm.doc.dui0041c/BGBGFIDA.html又名旧 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 中的新增功能 http://download.microsoft.com/download/2/4/A/24A36661-A629-4CE6-A615-6B2910A1367A/What%27s%20New%20in%20Platform%20Builder.pdf.
EDIT: 刚才注意到你添加了一个关于 C++ 的问题。 Microsoft 不使用 Itanium 风格的 C++ ABI,因为它们的实现早于它。您可以在我的 OpenRCE 文章中了解 Microsoft 的实现(1 https://www.openrce.org/articles/full_view/21, 2 https://www.openrce.org/articles/full_view/23)和后续侦察演示 http://www.hexblog.com/?p=704。另请参阅设计师 Jan Gray 的原始描述:PDF https://www.openrce.org/articles/files/jangrayhood.pdf.