【问题标题】:x86 code generator framework for DelphiDelphi 的 x86 代码生成器框架
【发布时间】:2010-10-29 19:02:55
【问题描述】:

有没有人遇到过用于 Delphi 的框架或库来简化 x86 代码的生成?我不是在寻找一个汇编程序,而是一个将代码生成过程抽象到低级位和字节之上的框架。理想情况下,我希望构建在现有库或框架之上,而不是根据具体情况对逻辑进行硬编码。

最初的用途是在运行时生成小的代码存根,类似于 Delphi 分派 SOAP 请求的方式。如果我找不到东西,我可能会自己动手,但我不想重新发明轮子。如果许可证允许在商业和开源项目中翻译和使用,我可能会对“C”中的某些内容感兴趣。

更新:

这里有更多上下文:我正在努力将接口和/或类的运行时实现作为持久性框架的一部分。有点像 Java 注释驱动的持久性 (JPA/EJB3),除了明显的 Delphi 风格。调用目标是一个模块化/可扩展的框架,它将实现一个通用的持久性模型。我需要以非常动态和流畅的方式调度和挂钩基于 RTTI 和注释/属性模型(类似于 InstantObjects 元数据)的方法调用。

谢谢, 大卫

【问题讨论】:

  • Delphi 不使用代码生成来分派 SOAP 请求。它通过使用 {$METHODINFO} 和 ObjAuto.pas 找到的 RTTI 信息完成。如果您对它的工作原理感兴趣,我有示例应用程序。
  • 技术上你是对的,但调用逻辑实际上确实设置了基于 RTTI 调度调用所需的堆栈帧和参数。这需要在汇编程序中进行一些低级工作。我想将这个过程抽象化,并且能够为像 thunk 这样稍微复杂一点的东西生成短代码序列。

标签: delphi code-generation x86 intel assembly


【解决方案1】:

我对你的问题想得越多。我不确定您是否只是尝试进行动态方法调用。即使您询问有关生成 x86 代码的问题。 有几种技术可以做到这一点。

如果您知道相关方法的签名,您可以使用 TMethod 并设置方法地址和数据。

procedure TForm8.Button1Click(Sender: TObject);
begin
  Showmessage('Hello1');
end;

procedure TForm8.Button2Click(Sender: TObject);
var
 M : TMethod;
begin
  M.Code := MethodAddress('Button1Click');
  M.Data := Self;
  TNotifyEvent(M)(self);
end;

如果您不知道方法签名,您可以使用 {$METHODINFO ON} 编写类 然后使用 ObjAuto.pas 中的功能调用该方法。

我在 DelphiLive 的 RTTI Presentation code 中有一个示例,说明如何做到这一点。

【讨论】:

    【解决方案2】:

    根据PaxCompiler的特点,可以创建独立的可执行文件。

    【讨论】:

    • 在添加该功能之前,我有一个旧版本的 PaxCompiler。本机代码生成功能听起来很有趣,并且在我的列表中。从开源许可的角度来看,可能不太适合。
    【解决方案3】:

    非常投机的答案: LLVM 之类的东西?我不确定它是否可以在 delphi 中使用,但您应该可以使用它创建 dll。

    【讨论】:

    • 是的,类似这样的东西,但也许更特定于 Delphi,它不需要那么强大。理想情况下,理解支持的 Delphi 调用约定(可能与 RTTI 集成)并且可以进行一些基本代码生成(当然需要汇编知识)。
    【解决方案4】:

    从逻辑上讲,您只需生成 delphi 代码,通过 cmdline 编译器编译为 DLL/BPL,然后动态加载那个?

    不幸的是,Delphi Explorer 没有附带 cmdline 编译器。而且你的主要二进制文件也必须在 Delphi Explorer 中(或者至少在 D2006 中,如果它足够兼容的话)

    Delphi 版本(或 Free Pascal)的任何混合都可能无法在包或 HLL 级别上运行,只能在基本的过程 DLL 级别上运行。

    【讨论】:

    • 嗨,Marco - 我真的想要一些更有活力的东西。我可以在 Delphi 的内联汇编器中编写代码,但不能轻易猜出所有需要预先设置的排列。
    【解决方案5】:

    我刚刚发现了一个有趣的框架,它可以完成我最初发布问题时所寻找的大部分内容。对我的目的来说有点晚了,但认为其他人可能会觉得这很有用:

    DAsmJitasmjit project 的 Delphi 端口

    【讨论】:

    • 太糟糕了,它是一个旧端口。正在寻找更新的端口。
    猜你喜欢
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2014-09-04
    • 2010-12-31
    • 2012-01-09
    • 2011-07-10
    相关资源
    最近更新 更多