私は JIT コンパイラに取り組んでおり、文字列などのマネージド型の適切なクリーンアップ ブロックを出力する方法を見つけようとしています。
タイプのローカル変数を 1 つ持つ関数のクリーンアップ ブロックの逆アセンブリは、string
次のようになります。
0044333C 648910 mov fs:[eax],edx
0044333F 6854334400 push $00443354
00443344 8D45FC lea eax,[ebp-$04]
00443347 E81834FCFF call @UStrClr
0044334C C3 ret
0044334D E9062BFCFF jmp @HandleFinally
00443352 EBF0 jmp $00443344
@UStrClr
残念ながら、私は のアドレスを取得する良い方法を持っていない@HandleFinally
ので、私の JITter はそれらを挿入することができます。それらは System.Pas as _UStrClr
and _HandleFinally
,インターフェイスセクションで宣言されていますが、これらの識別子を使用しようとするとコンパイラ エラーが発生するため、何らかの「魔法」が行われているようです。
そこで、グローバル ポインタを宣言してmov func_ustr_clear, @UStrClear
. 今回は、宣言されていない識別子エラーは発生しません。さらに奇妙なことがわかります:
[DCC Error]: E2107 Operand size mismatch
それで、これを正しく行う方法を知っている人はいますか?