編寫一個可以模擬機器代碼的Java程序的最佳方式是什麼?例如,我需要創建一系列指令,如加,減,遞增,遞減等。 假設我正在編寫接受3個參數/寄存器的add指令(在前2個寄存器中添加值並存儲結果在第3次)。是否像編寫一個函數一樣簡單,如:Java模擬組件
int add(int x, int y) {
int result;
result = x + y;
return result; }
我也開放的可能性,我在這裏的基礎。任何輸入將不勝感激。
編寫一個可以模擬機器代碼的Java程序的最佳方式是什麼?例如,我需要創建一系列指令,如加,減,遞增,遞減等。 假設我正在編寫接受3個參數/寄存器的add指令(在前2個寄存器中添加值並存儲結果在第3次)。是否像編寫一個函數一樣簡單,如:Java模擬組件
int add(int x, int y) {
int result;
result = x + y;
return result; }
我也開放的可能性,我在這裏的基礎。任何輸入將不勝感激。
模擬程序集的最好方法是處理原始位和字節並相應地執行操作。
當然你可以做到這一點,但重要的是如何打開操作碼並做所有的地址欄計算。通常情況下,地址字段可以包含文字常量,全局地址,寄存器,相對於寄存器的偏移量等。 這取決於您是模擬簡單機器還是真實機器。
如果您只是想用機器指令編寫或多或少1:1的Java代碼,我建議您爲所有寄存器創建變量,併爲大多數指令定義方法(類似於您的建議)。但是這不會「限制」你真正的機器指令所能做的事情,因爲當機器可能不允許時,你可以將BX寄存器乘以AX寄存器。
更好的辦法是爲所有指令定義一個代表機器狀態(即寄存器和RAM)和類的方法的類。那麼除非有MUL_BX_AX方法,否則不能乘以BX乘以AX。許多方法不會有參數(因爲寄存器位於「不透明」對象內),但有些會有「真實」指令接受偏移量或其他值的參數。 (例如,ADD_AX_IMMED(5))。
加入:雖然存在分支問題,但這需要一些額外的思考。 Java沒有一個GOTO等價物,可以很好地填補這個角色,所以最初(直到你想到更好的東西),你可能不得不使用邏輯等邏輯測試機器狀態類中的「條件代碼」 。
你可以用'switch'塊來實現指令的操作,並且在處理參數 –
之前/之後添加內容取決於你想要支持的操作。如果你想處理像跳躍這樣的事情,它會變得更加複雜! – bengoesboom
你想效仿什麼樣的CPU?如果您有選擇,請選擇一個像Z80一樣的8位CPU –