6

私は 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 _UStrClrand _HandleFinally,インターフェイスセクションで宣言されていますが、これらの識別子を使用しようとするとコンパイラ エラーが発生するため、何らかの「魔法」が行われているようです。

そこで、グローバル ポインタを宣言してmov func_ustr_clear, @UStrClear. 今回は、宣言されていない識別子エラーは発生しません。さらに奇妙なことがわかります:

[DCC Error]: E2107 Operand size mismatch

それで、これを正しく行う方法を知っている人はいますか?

4

1 に答える 1