2009-05-29 54 views
4

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

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

更新:

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

谢谢, 大卫

+0

德尔福的德尔福端口不使用代码生成分派SOAP请求。它通过使用{$ METHODINFO}和ObjAuto.pas找到的RTTI信息完成。如果您对如何工作感兴趣,我有示例应用程序。 – 2009-05-29 04:50:41

+0

从技术上讲,你是正确的,但调用逻辑实际上设置了基于RTTI调用呼叫所必需的堆栈帧和参数。这需要汇编程序中的一些低级工作。我想抽象这个过程,并且能够为像Thunk这样稍微复杂一些的东西生成短代码序列。 – 2009-05-29 05:11:35

回答

2

根据PaxCompiler的功能,您可以创建独立的可执行文件。

+0

在添加该功能之前,我有一个较早版本的PaxCompiler。这个本地代码生成功能听起来很有趣,并且在我可以使用的列表上。从开源许可的角度来看,这可能不太适合。 – 2009-05-29 06:23:02

5

我越有想过你的问题。我不确定是否所有你只是做动态方法调用。即使你问关于生成x86代码。 有几种技术可以做到这一点。

如果您知道相关方法的签名,您可以通过使用方法并设置方法地址和数据轻松完成。

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

非常规范的回答: 类似LLVM?我不确定它是否可以从delphi使用,但你应该能够创建dll的。

+0

是的,就像这样,但也许更具体的德尔福,它不需要一样能力。理想情况下,理解支持的Delphi调用约定(可能与RTTI集成),并可以做一些基本的代码生成(当然需要装配知识)。 – 2009-05-29 15:06:41

+1

我确认这是可能的。 – 2011-10-31 08:24:58

0

从逻辑上讲,你会简单地生成delphi代码,通过cmdline编译器编译成DLL/BPL,然后dyn加载那个?

不幸的是Delphi Explorer没有提供cmdline编译器。而且你的主要二进制文件也必须在Delphi资源管理器中(或者至少在D2006中,如果二进制文件兼容的话)

任何Delphi版本(或者Free Pascal)的混合可能不适用于包或者HLL级别,只在基本的程序DLL级别。

0

我刚刚发现了一个有趣的框架,当我最初发布该问题时,我执行了大量的工作。有点晚了,我的目的,但认为其他人可能会发现这个有用:

DAsmJitasmjit project