4

Visual Studio C++ で使用される ARM 呼び出し規約の Windows RT に関するドキュメントは見つかりませんでした。Microsoft は ARM のAAPCSを使用していますか?

Microsoft が ARM 上の Windows RT に AAPCS/EABI を使用している場合、ARM の C++ ABI (Itanium C++ ABI から派生したもの) も使用していますか? たぶんARM例外処理ABIでさえ?

ARM 上の Windows RT で使用される呼び出し規約は、他の (組み込みの) ARM Windows バリアントで使用されるものとは異なりますか?

事前定義されたコンパイラ マクロを使用して ARM で Windows RT を検出する信頼できる方法はありますか?

更新: C++ ABI に関する質問を追加しました。

4

2 に答える 2

8

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も参照してください。

于 2013-05-06T10:37:01.690 に答える