7

時々、次のような非常に短いアセンブリ関数を記述します

function SeniorBit(Value: LongWord): Integer;
asm
        OR    EAX,EAX
        JZ    @@Done
        BSR   EAX,EAX
        INC   EAX
@@Done:
end;

インライン化に最適な候補と思われるもの:

function SeniorBit(Value: LongWord): Integer; inline;

しかし、Delphi コンパイラはそれを許可しません。なんで?


更新しました:

ldsandon のおかげで、QC に関する 5.5 年前の公開レポートが存在します。レポートには、コンパイラの asm インライン化を簡素化するためのいくつかの提案 (asm ディレクティブの拡張など) が含まれています。プロシージャ/関数レベルで「naked」ディレクティブを導入することをお勧めします。これは、プロシージャのスタック フレームを作成する必要がなく、オプションでどのレジスタ (eax、edx、および ecx) を保持する必要があるかをコンパイラに伝えるものです。

BASM コードを使用した効率的なインライン プロシージャの一般的なタスクが難しい (そして不要な場合がある) 場合は、最も重要なケース (レジスタの使用が明示的に宣言されたネイキッド関数など) でインライン化を有効にすることをお勧めします。

4

2 に答える 2

11

Quality Centralレポート#9283を参照してください(そしてそれに投票してください)。基本的に問題は、コンパイラがインラインコードの前にどのレジスタを保持し、後に何を復元するかを理解できる必要があることです。コンパイラがレジスタを処理する限り、それは簡単ですが、使用法が制御されていない場合は制御されません。あなたの例は非常に単純ですが、コンパイラーはより複雑なケースを処理できなければなりません。レポートはオープン状態です。新しいコンパイラがBASMコードもインライン化できることを願っています。

于 2010-03-10T08:21:01.313 に答える
5

手作りのアセンブリコードをインライン化することはできません。

これらのアセンブラをインライン化することは非常に困難です。通常のインライン化では、レジスタの使用法、ローカル変数などに対するあらゆる種類の影響があり、コンパイラはインラインアセンブリでは実行できません。

于 2010-03-10T07:28:47.670 に答える