Windows CE (元のAPCS別名 Old 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 の新機能 を参照してください。
EDIT : C++ に関する質問を追加したことに気付きました。Microsoft は Itanium スタイルの C++ ABI を使用していません。これは、Microsoft の実装が Itanium スタイルよりも古いためです。Microsoft の実装については、私の OpenRCE 記事 ( 1、2 )とフォローアップのReconプレゼンテーションで読むことができます。デザイナー Jan Gray による元の説明: PDFも参照してください。