的子集,我想實現一個模擬器的x86架構指令的子集。給定一個二進制文件,我希望對它進行反彙編並對指令進行模擬。爲此,需要查看指令的某些位,以確定它是控制指令,算術指令還是邏輯指令,並且基於此,必須通過查看剩餘位來推導操作的參數。實現這一點的一個明顯而痛苦的方式是使用嵌套的if-else/switch-case語句。有人可以提出一個更好的方法來實現這個嗎?實現一個模擬器用於x86
回答
使用的查找表,也許在std::map
的形式。
對於那些可以運行數百萬次迭代的東西,我認爲你會比「map」更感興趣一些性能。至少,哈希表將是首選,但即使這可能不是最好的選擇。 – StilesCrisis 2012-02-17 20:57:59
做一個嵌套如果如果緩存翻譯的輸出/其他類型的構造應該罰款。如果您正在進行模擬,那麼程序中所有靜態指令中的動態指令都會相對較少。所以最好的性能優化是緩存翻譯的輸出,然後在動態指令執行時重新使用它。最終你的緩存將被填滿,你將需要清除它的新條目。但是,以某種方式緩存翻譯更有意義,而不是試圖首先提出一種非常快速的翻譯方法。
作爲一個例子QEMU是支持多種被優化性能目標的仿真器。你可以看到他們是如何在這裏翻譯x86指令:
https://github.com/qemu/QEMU/blob/master/target-i386/translate.c#L4076
如果QEMU這樣做是爲了每一個指令的表現會非常緩慢。但是,由於緩存結果,第一次翻譯指令並不重要,因此存在複雜的情況說明。
你可以看一下在x86仿真器的源找到這個想法的實現,已經完全寫和充實。
這裏有一個你可以嘗試:http://www.dosbox.com/wiki/BuildingDOSBox#1._Grab_the_source
讓我知道,如果這個不奏效;有很多可供選擇。
一般來說,仿真器,我認爲操作碼開關將是一條路可走。另一個好方法是一個256條目的函數指針數組,對應指令的第一個字節。這比起一個巨大的開關或者如果阻止,會給出更多的分離。當然,您可以根據需要重新使用這些功能。
- 1. 用於x86的Galaxy模擬器
- 2. 實現在模擬器
- 3. 用於實現ns2的JNS(Java網絡模擬器)
- 4. 無法與Xamarin一起使用x86模擬器
- 5. 如何在Android-x86模擬器(VirtualBox)中模擬gps位置?
- 6. 行爲來模擬一個枚舉實現一個接口
- 7. 如何模擬一個使用PHPUnit實現Iterator接口的類?
- 8. 我可以用PHPUnit模擬一個接口實現嗎?
- 9. 實現一個代碼來模擬有限自動機用C++
- 10. textCapSentences適用於模擬器,但不適用於真實設備
- 11. 實現雷達模擬
- 12. 存根和模擬實現
- 13. 建立一個基於網絡的iphone/ipad模擬器/模擬器
- 14. 模擬模塊的一個實例NodeJs
- 15. 80386實模式模擬器
- 16. 在Android模擬器上實現相機|需要一些知識
- 17. 使用houdini(Android模擬器)在基於x86的AVD上運行ARM庫
- 18. 使用Google模擬的模擬方法實現
- 19. 使用pthread實現errno模擬
- 20. 用於自動UI測試的模擬實現
- 21. 實現一個user_controller用於模型用戶的設計?
- 22. 在x86-64中實現rint()
- 23. Axis2用於查詢多個服務器的實現模式
- 24. Angular-ui-bootstrap.d.ts是一個用於angular-ui.github.io/bootstrap的TypeScript模擬器?
- 25. 編寫一個用於Android的GSM模擬器
- 26. 推薦使用簡單的x86模擬器和操作系統
- 27. 如何在Linux上使用x86 Android模擬器?
- 28. 用於一個地址的CXF多個實現器
- 29. 有沒有什麼辦法來模擬一個實現類
- 30. 實現一個模擬字符串的公式包含方法
你基本上想要一個switch-case語句,但不完全。檢查查找表;抓住一個字節,爲該字節的值調用處理程序,處理程序讀取操作數並返回,重複。 – ssube 2012-02-17 20:17:51