Я работаю над компилятором JIT и пытаюсь выяснить, как выводить правильные блоки очистки для управляемых типов, таких как строки.Как я могу получить адрес внутренних функций System.pas?
Разборка очищающей блока для функции, которая имеет одну локальную переменную типа 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
, в разделе раздела, но, видимо, происходит некоторая «магия», потому что попытка использовать эти идентификаторы приводит к ошибке компилятора.
Итак, я попробовал процедуру ASM, где я объявил глобальный указатель и сказал mov func_ustr_clear, @UStrClear
. На этот раз я не получу необъявленную ошибку идентификатора; Я получаю что-то еще более странное:
[DCC Error]: E2107 Operand size mismatch
Так кто-нибудь есть идеи, как это сделать правильно?
Возможно, вызов Finalize - это вариант? – Remko
Если у вас есть madExcept, его исходный код является сокровищницей для таких методов. –