gpt4 book ai didi

delphi - 如何获取内部System.pas函数的地址?

转载 作者:行者123 更新时间:2023-12-03 14:59:22 26 4
gpt4 key购买 nike

我正在开发 JIT 编译器,并试图找出如何为托管类型(例如字符串)输出正确的清理 block 。

具有一个 string 类型的局部变量的函数的清理 block 的反汇编如下所示:

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 中的 interface 部分中声明为 _USTrClr_HandleFinally,但显然存在一些“魔法”,因为尝试使用这些标识符会导致编译器错误。

所以我尝试了一个 ASM 例程,在其中声明了一个全局指针并表示 mov func_ustr_clear, @UStrClear。这次我没有收到未声明的标识符错误;我得到了一些更奇怪的东西:

[DCC Error]: E2107 Operand size mismatch

那么有人知道如何正确执行此操作吗?

最佳答案

尝试使用这些函数来获取 UStrClrHandleFinally 的地址:

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, rcx;
{$ELSE}
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 .

关于delphi - 如何获取内部System.pas函数的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21225758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com