インライン アセンブリ コードの使用

提供: RAD Studio
移動先: 案内検索

インライン アセンブリ コード:インデックス への移動


組み込みアセンブラを使用すると、Delphi プログラム内でアセンブリ コードを記述することができます。これには以下の特徴があります。

  • インライン アセンブリが可能。
  • Intel Pentium 4、Intel MMX 拡張命令、ストリーミング SIMD 拡張命令(SSE)、AMD Athlon(3D Now! を含む)のすべての命令をサポート。
  • Intel 64 アーキテクチャをサポート(ただしいくらかの制限があります)。
  • アセンブリ文で Delphi の識別子(定数、型、変数など)を使用可能。
  • マクロはサポートされていないが、純粋なアセンブリ関数手続きを使用可能。

組み込みアセンブラを使用する代わりに、外部手続きや外部関数を含むオブジェクト ファイルにリンクするという方法もあります。詳細は、「外部宣言」を参照してください。アプリケーションで外部アセンブリ コードを使用したい場合には、そのコードを Delphi 言語で書き直すか、少なくともインライン アセンブラを使って実装し直すことを検討してください。

インライン アセンブラは以下のコンパイラで使用可能です。

ただし、インライン アセンブリは、iOS デバイスおよび Android デバイス用の Delphi コンパイラではサポートされていません。

asm 文の使用

組み込みアセンブラを使用するには asm 文を使います。形式は次のとおりです。

asm statementList end

statementList は、一連のアセンブリ文をセミコロン、行末文字、または Delphi コメントで区切ったものです。

asm 文のコメントは、Delphi 形式でなければなりません。セミコロンには、その行の残りの部分がコメントであるという意味はありません。

予約語 inline と指令 assembler は、下位互換性のために残されているだけです。コンパイラには無視されます。

レジスタの使用

X64 GPR.pngX64 SSE.png

32 ビット

概して、asm 文でレジスタを使用する場合の規則は、external の手続きや関数の場合と同じです。asm 文では、EDI、ESI、ESP、EBP、EBX の各レジスタを変更してはなりませんが、EAX、ECX、EDX の各レジスタは自由に変更できます。asm 文に入った時点で、EBP は現在のスタック フレームを、ESP はスタックの最上位を指しています。ESP と EBP を除いて、asm 文に入ったときのレジスタの内容は保証されていません。

64 ビット

インライン アセンブリ関数内では、x64 アプリケーション バイナリ インターフェイス(ABI)に従って、次のレジスタの内容を維持し復元しなければなりません。R12、R13、R14、R15、RDI、RSI、RBX、RBP、RSP、XMM4、XMM5、XMM6、XMM7、XMM8、XMM8、XMM9、XMM10、XMM11、XMM12、XMM13、XMM14、XMM15。

インライン アセンブラ関数に渡される最初の 4 つのパラメータは、それぞれ RCX、RDX、R8、R9 を使って渡されます。ただし、浮動小数点引数の場合は例外で、XMMO、XMM1、XMM2、XMM3 が使われます。数値演算コプロセッサは、通常、x64 コードでは使われません。関数パラメータ用に使われるレジスタは、自由に変更できます。

クロスプラットフォーム コード用の条件定義の使用

インライン アセンブリ コードを含む既存関数では、条件定義を使ってプラットフォームを区別しなければなりません。関数には、プラットフォーム間に共通の関数プロトタイプが必要です。以下に例を示します。

function Power10(val: Extended; power: Integer): Extended; 
{$IFDEF PUREPASCAL}
begin
  // ここに Pascal の実装を記述...
end;
{$ELSE !PUREPASCAL}
{$IFDEF CPUX86}
  asm
    // ここに ASM の実装を記述...
  end;
{$ENDIF CPUX86}
{$ENDIF !PUREPASCAL}

$ELSE を使わない場合には次のようになります。

  {$IFDEF CPUX86}
  asm
    // ...
  end;
  {$ENDIF CPUX86}
  {$IFDEF CPUX64}
  asm
    // ...
  end;
{$ENDIF CPUX64}

定義済みの条件シンボルについての詳細は、「条件付きコンパイル(Delphi)」を参照してください。

関連項目