2010-05-28 87 views
6

是否有任何ARM指令可用於i386指令轉換器?將ARM指令轉換爲i386指令

+9

你想達到什麼目的? – 2010-05-28 10:04:21

+0

你是否試圖運行一些你已經得到的代碼(在這種情況下,一個模擬器是好的)還是你想轉換一些你從前開發者繼承的代碼,以及你沒有源代碼的地方? – 2010-06-03 07:59:13

+2

雖然從定製編譯器(ARM到IR到x86)在技術上可以將指令從ARM指令轉換爲x86指令,但還有其他更主要的障礙,例如應用程序設計的完全不同的操作系統和運行時庫與指令轉換無關。重新編譯x86和目標操作系統的應用程序會更容易。 – tgiphil 2010-06-03 08:08:12

回答

11

您可以使用QEMU來仿真x86上的ARM指令。

0

我真的懷疑。有太多的差異來使其自動化。

+1

它們比ANSI C和x86更接近,但有很多程序可以自動完成這種轉換。 – Ken 2010-06-03 20:18:06

+0

沒有。 ANSI C旨在編譯爲各種彙編語言。 C中的許多高級(相對)概念可以用許多不同的方式在不同的彙編器中表示。然而,在彙編程序之間,則是另一回事。 – Puppy 2010-06-04 13:41:29

0

http://www.libcpu.org/

它處於測試階段非常多,但這個想法是寫一個二進制文件LLVM前端,這樣LLVM後端就可以生成任何支持平臺的代碼。目前正在積極開發ARMv6前端,我相信他們希望能夠得到它的幫助。目標是支持任何支持的體系結構之間的仿真和靜態重新編譯。

1

您可以將ARM代碼反向工程爲C,然後編譯C代碼。 This company實際上從彙編程序中生成了非常好的代碼C代碼。 (我從來沒有使用他們的產品,但我熟悉該公司背後的研究)。

1

仿真或靜態二進制翻譯是我會採取的路徑,每個都有其優點和缺點。

你需要更清楚你的問題。將一個指令集簡單地翻譯成另一個指令集是一回事,讓結果變得有用的難點在於你正在處理的是什麼。你的ARM的內存和寄存器空間與X86不匹配,所以對指令(模擬或者sbt)的直接指令是不夠的,你必須添加代碼來替換許多加載和存儲的東西來檢查地址,確定什麼它正在處理和模擬外設(仿真或者sbt)。

0

最簡單的方法是使用稱爲「軟件動態轉換」的東西。您在這裏可以找到該技術的一些信息:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.120.5182&rep=rep1&type=pdf

它通過動態翻譯「基本塊」,在那裏你把所有的指令到一個控制點(分支,調用,跳躍),然後更換代碼分支目標與回調到翻譯器的存根。它大致相當於CLR中的「JIT編譯」之類的東西,除了它在更細粒度級別(基本塊而不是方法)之外。它比靜態翻譯方法更有優勢,因爲它不依賴於準確的反彙編。獲得完美的拆卸是不可能的(這相當於暫停問題)。即使真正優秀的反彙編程序,像IDA專業版一樣,在識別諸如異常處理程序之類的東西時也會遇到問題,並經常會將代碼與數據混淆。

但是,軟件動態轉換不受任何這些限制的約束。它甚至可以(理論上)使用適當的內存保護技術處理自修改代碼。