Я работаю над компилятором 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
и _HandleFinally
в разделе interface, но, очевидно, происходит некое «волшебство», потому что попытка использовать эти идентификаторы приводит к ошибке компилятора.
Поэтому я попробовал подпрограмму ASM, где я объявил глобальный указатель и сказал mov func_ustr_clear, @UStrClear
. На этот раз я не получаю ошибку необъявленного идентификатора; Я получаю нечто еще более странное:
[DCC Error]: E2107 Operand size mismatch
Так кто-нибудь знает, как это сделать правильно?