2009-05-29 25 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