delphi – 如何获取内部System.pas函数的地址?
发布时间:2020-12-15 09:32:30 所属栏目:大数据 来源:网络整理
导读:我正在研究JIT编译器,并试图找出如何为托管类型(如字符串)输出正确的清理块. 对于具有一个类型为string的局部变量的函数,清理块的反汇编如下所示: 0044333C 648910 mov fs:[eax],edx0044333F 6854334400 push $0044335400443344 8D45FC lea eax,[ebp-$04]00
我正在研究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,在接口部分,但显然有一些“魔术”正在进行,因为尝试使用这些标识符会导致编译器错误. 所以我尝试了一个ASM例程,在那里我声明了一个全局指针,并说mov func_ustr_clear,@ ustrClear.这次我没有得到未声明的标识符错误;我得到一些更奇怪的东西: [DCC Error]: E2107 Operand size mismatch 所以有人知道如何做到这一点吗? 解决方法
尝试使用这些函数来获取UStrClr和HandleFinally的地址:
function GetUStrClrAddress: Pointer; asm {$IFDEF CPUX64} mov rcx,offset System.@UStrClr; mov @Result,rcx; {$ELSE} mov @Result,offset System.@UStrClr; {$ENDIF} end; function GetHandleFinallyAddress: Pointer; asm {$IFDEF CPUX64} mov rcx,offset System.@HandleFinally; mov @Result,offset System.@HandleFinally; {$ENDIF} end; 编辑: @ArnaudBouchez也建议进一步优化.通过直接将值放入函数返回寄存器,该函数更快一些. function GetUStrClrAddress: Pointer; asm {$ifdef CPU64} mov rax,offset System.@UStrClr {$else} mov eax,offset System.@UStrClr {$endif} end; 可以在此处找到有关Delphi中汇编程序使用的进一步阅读(以及OFFSET关键字的使用), (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |