2012-02-17 31 views
3

的子集,我想實現一個模擬器的x86架構指令的子集。給定一個二進制文件,我希望對它進行反彙編並對指令進行模擬。爲此,需要查看指令的某些位,以確定它是控制指令,算術指令還是邏輯指令,並且基於此,必須通過查看剩餘位來推導操作的參數。實現這一點的一個明顯而痛苦的方式是使用嵌套的if-else/switch-case語句。有人可以提出一個更好的方法來實現這個嗎?實現一個模擬器用於x86

+1

你基本上想要一個switch-case語句,但不完全。檢查查找表;抓住一個字節,爲該字節的值調用處理程序,處理程序讀取操作數並返回,重複。 – ssube 2012-02-17 20:17:51

回答

3

使用的查找表,也許在std::map的形式。

+0

對於那些可以運行數百萬次迭代的東西,我認爲你會比「map」更感興趣一些性能。至少,哈希表將是首選,但即使這可能不是最好的選擇。 – StilesCrisis 2012-02-17 20:57:59

1

做一個嵌套如果如果緩存翻譯的輸出/其他類型的構造應該罰款。如果您正在進行模擬,那麼程序中所有靜態指令中的動態指令都會相對較少。所以最好的性能優化是緩存翻譯的輸出,然後在動態指令執行時重新使用它。最終你的緩存將被填滿,你將需要清除它的新條目。但是,以某種方式緩存翻譯更有意義,而不是試圖首先提出一種非常快速的翻譯方法。

作爲一個例子QEMU是支持多種被優化性能目標的仿真器。你可以看到他們是如何在這裏翻譯x86指令:

https://github.com/qemu/QEMU/blob/master/target-i386/translate.c#L4076

如果QEMU這樣做是爲了每一個指令的表現會非常緩慢。但是,由於緩存結果,第一次翻譯指令並不重要,因此存在複雜的情況說明。

1

你可以看一下在x86仿真器的源找到這個想法的實現,已經完全寫和充實。

這裏有一個你可以嘗試:http://www.dosbox.com/wiki/BuildingDOSBox#1._Grab_the_source

讓我知道,如果這個不奏效;有很多可供選擇。

一般來說,仿真器,我認爲操作碼開關將是一條路可走。另一個好方法是一個256條目的函數指針數組,對應指令的第一個字節。這比起一個巨大的開關或者如果阻止,會給出更多的分離。當然,您可以根據需要重新使用這些功能。

相關問題