我正在研究一個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,它的源代碼是這種技術的寶庫 –