7.32 組み込みアセンブラと C/C++ との式の相違点

組み込みアセンブリと C/C++ にはいくつかの違いがあります。

特に、以下のようになります。
  • アセンブリ式は常に符号なしです。同じ式でも、アセンブリと C/C++ では、値が異なる場合があります。例えば、
    MOV r0, #(-33554432 / 2)     // 結果は 0x7f000000
    MOV r0, #__cpp(-33554432 / 2)  // 結果は 0xff000000
    
  • 先行ゼロを伴うアセンブリの数値は 10 進数です。例えば、
    MOV r0, #0700           // 10 進数 700
    MOV r0, #__cpp(0700)       // 8 進数 0700 == 10 進数 448
    
  • アセンブリの演算子の優先順位は、C/C++ での優先順位と異なります。例えば、
    MOV r0, #(0x23 :AND: 0xf + 1)    // ((0x23 & 0xf) + 1) => 4
    MOV r0, #__cpp(0x23 & 0xf + 1)   // (0x23 & (0xf + 1)) => 0
  • アセンブリで記述される文字列の終端は NUL ではありません。
    DCB "Hello world!"        // 12 バイト(末尾に NUL がない)
    DCB __cpp("Hello world!")         // 13 バイト(末尾に NUL がある)

組み込みアセンブリの規則は __cpp の外で適用され、C または C++ の規則は __cpp の中で適用されます。
関連する概念
7.26 コンパイラでの組み込みアセンブラのサポート
7.31 組み込みアセンブラからの C および C++ のコンパイル時の定数式へのアクセス
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.