加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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关键字的使用),Assembly Expressions,Expression Classes.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读