我正在开发一个 JIT 编译器,并试图弄清楚如何为托管类型(如字符串)输出正确的清理块。
对于具有一个局部变量类型的函数,清理块的反汇编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 中声明为_UStrClr
and _HandleFinally
,在interface部分,但显然有一些“魔法”正在发生,因为尝试使用这些标识符会导致编译器错误。
所以我尝试了一个 ASM 例程,我在其中声明了一个全局指针并说mov func_ustr_clear, @UStrClear
. 这次我没有收到未声明的标识符错误;我得到了更奇怪的东西:
[DCC Error]: E2107 Operand size mismatch
那么有人知道如何正确地做到这一点吗?