2010-11-05 44 views
8

有沒有人有任何建議的裝配文件分析工具?我試圖在通過-S選項時分析由LLVM(或者GCC)生成的ARM/Thumb-2 ASM文件。我對基本塊級的指令統計特別感興趣,例如,內存操作計數等。我可能會用Python自己編寫工具,但在開始之前很好奇看看是否有任何現有的工具。裝配分析工具

更新:我已經做了一些搜索,並找到了反彙編工具/十六進制編輯器/ etc的很好資源here,但不幸的是它主要集中在x86彙編上,也不包括任何實際的彙編文件分析器。

+0

分析LLVM IR的方法會更容易,因爲它使用寄存器的SSA格式。 – delnan 2010-11-05 23:20:44

+0

@delnan我同意,但我添加了一個彙編級別的優化通行證,所以我需要能夠分析實際生成的ASM。 – Zeke 2010-11-05 23:21:44

+0

我是否可以建議您的通行證既可以作爲LLVM MachineFunctionPass工作,也可以在MC基礎架構內部完成必要工作?真的沒有理由解析asm,重建所有的控制和數據流信息,然後做一些優化。 – ohmantics 2010-12-01 18:35:52

回答

2

您需要的是一種可以定義彙編語言語法,然後構建定製分析器的工具。你的分析器可能很簡單(「指令需要多少空間?」)或者複雜(「這個指令需要執行多少個週期?」[這取決於前面的指令序列,也可能是一個複雜的處理器模型關心])。

專門爲此設計的是New Jersey Machine Toolkit。它的確設計用於構建代碼生成器和調試器。我懷疑它會擅長「指令字節數」。目前還不清楚它是否擅長更復雜的分析。我相信它堅持要遵循語法風格,而不是你的。

一個沒有專門設計來做到這一點,但一般在解析/分析語言是我們的 DMS Software Reengineering Toolkit

可以給DMS幾乎任何上下文無關語言(涵蓋大多數彙編語言語法)的語法描述,然後可以將該語法的特定實例(彙編代碼)解析爲AST以供進一步處理。我們已經完成了幾個彙編語言,包括IBM 370,摩托羅拉的8位CPU線,以及一個相當獨特的DSP,沒有任何問題。

您可以輕鬆地爲DMS指定屬性語法(通過AST計算)。這些編碼只需要本地信息的分析的好方法,比如「這條指令有多大?」。對於更復雜的分析,您需要一個處理器模型,它是由一系列指令驅動的;通過這樣一個機器模型ASTs個別指令將是一個簡單的方法來應用機器模型來計算更復雜的事情,如「這條指令需要多長時間?」。

其他分析(如控制流和數據流)由DMS以通用形式提供。您可以使用屬性評估器來收集本地事實(本指令的「control-next」,「來自此指令的數據流向......」)並將它們提供給流量分析器以計算全局流量事實( 「如果我執行這條指令,下游可能執行哪些指令?」)

您必須爲您的特定(彙編)語言配置DMS。這是設計被配置爲這些任務。

是的,你可能會用Python編寫所有這些代碼;畢竟,它是一臺圖靈機。但可能不那麼容易。

其他好處:DMS願意根據您的分析將轉換應用於您的代碼。所以你也可以實現你的優化器。畢竟,您需要將優化是安全的分析指示連接到實際的優化步驟。

+0

感謝您的鏈接和迷人的TechTalk。我認爲DMS對我的特殊情況可能是過度的,但這個概念本身非常有趣。使用DMS時學習曲線有多陡峭? – Zeke 2010-11-08 17:48:48

+0

DMS是一個複雜的系統,因爲它處理複雜的工件,並且執行一些非常複雜的事情(對2500萬行C代碼進行流分析需要一些非常驚人的機器)。您可以在一週內瞭解基礎知識;請查看http://www.semanticdesigns.com/Products/DMS/SimpleDMSDomainExample.html以便快速瀏覽基礎知識。使用DMS可能需要6-12個月的時間才能成爲好的*;想想學習曲線,以善於使用C++。這可能不是思考DMS的正確方法;真正的問題是,需要多長時間才能完成同樣的任務? – 2010-11-08 18:05:52

+0

儘管它看起來並不是免費的,因此它可能不適合個人項目/自由軟件項目。或者我錯了,只是錯過了「下載」鏈接?看起來像一個很酷的工具,但。 – 2010-11-12 09:20:38

2

我寫了很多反彙編,包括手臂和拇指。不是生產質量,而是爲了學習彙編程序。對於ARM和Thumb,ARM ARM(ARM體系結構參考手冊)都有一個很好的圖表,您可以輕鬆地從加載/存儲等中統計數據操作,可能需要花費數小時的工作時間,可能是兩個小時。至少在前面,你最終會計算數據值。

另一張海報可能是正確的,就像我在談論的圖表應該很簡單,編寫一個程序來檢查ASCII尋找ldr,str,add等。如果你是需要解析所有東西的話對內存操作計數感興趣等。當然,缺點是你很可能無法檢查循環。一個函數可能有一個加載和存儲,另一個函數可能有一個加載和存儲,但是它被一個循環包裝,一旦執行就會導致更多的內存操作。

不知道你真的感興趣,我的猜測是你可能想模擬代碼並計算這些類型的東西。我寫了一個拇指模擬器(thumbulator),試圖做到這一點。 (並且我用它來比較llvm執行和gcc執行,當涉及到執行指令的數量,提取,內存操作等等時)。問題可能是它只是拇指,沒有ARM沒有Thumb2。 Thumb2可以比ARM更容易添加。 arm中有一個armulator,它位於gdb的其他地方。我現在不記得它是否執行thumb2。我的理解是,當arm使用它時會準確地告訴你這些統計數據。

+0

你沒有稱它爲「Thimbleulator」? – 2010-11-19 02:22:16

1

您可以將統計信息插入LLVM代碼生成器,它非常靈活,並且已經在收集一些統計數據,可以用作示例。