簡體   English   中英

用Java / C / C ++創建MIPS機器

[英]Creating a MIPS machine in Java/C/C++

嘿大家我在匯編語言和計算機組織課上。 最近我得到了一項任務,要求我創建一個emulates a MIPS machine in Java, C, or C++.

該程序從ASM文件中讀取十六進制並將這些行存儲在一個數組中。 然后它應該模仿MIPS機器。

我一直在尋找,但不知道如何開始。 有沒有人有一些想法甚至偽代碼讓我走上正確的道路?

要讀取的文件的示例:

24080019
2409001e
240a0023
01094020
010a4020
00082021

如果有人能讓我開始走上正確的道路,那將是非常棒的,謝謝!

你需要做的第一件事就是學會解釋這些指示。

它們看起來是8個十六進制數字。 這很好,因為MIPS指令長32位。 (當然,十六進制數字是4位。)

因此文件中的每一行都與一條指令相對應。

請查看說明格式: http//www.d.umn.edu/~gshute/spimsal/talref.html

您需要跟蹤機器內的一些寄存器。 (你知道MIPS寄存器是什么,對吧?)

然后,您需要確定操作的作用以及它們影響的寄存器。

SPIM可能是一個開始研究如何構建這樣一個程序的好地方。 這是一個MIPS32模擬器。

所以基本上你的程序將是一個讀取一條指令(輸入文件中的一行)*的循環,並以與指令改變其寄存器相同的方式改變其變量。

這將是操作碼上的一個很大的“切換案例”,並且對於每種情況,您都可以處理特定的指令。

你的程序的變量基本上是你的寄存器,你還必須以某種方式模擬一個內存(你應該能夠一次性地分配你的整個內存作為你將處理的一大塊內存)並處理從MIPS地址轉換到您的內存塊中的地址。

然后處理操作碼基本上是改變寄存器和內存的問題。 你可能可以從你的語言中受益來做一些操作(比如總和,產品......)但你肯定要處理的不止這些:例如在狀態寄存器中設置標志。

我不熟悉MIPS指令集,但您可能還需要根據可用的尋址模式進行一些地址轉換。

*:實際上,它應該比直接讀取輸入文件更聰明:你應該首先在“內存”數組中加載你的程序,並處理一個程序計數器,它將從第一條指令開始,並在處理完第一條指令后遞增現行指示。 有時,流程可能會將PC移回。 理想情況下,你也想讓這部分“記憶”不可修改,但這不是你想要首先關注的。

我希望我沒有說任何與MIPS無關的內容。

所以在結構方面,這個偽代碼給出了一個想法:

set all your register variables to their default value
allocate memory for the "memory"
load your program in the "memory"
for (initialize PC ; ??? ; PC"++")
{
    read the "memory" at the address in PC -> opcode
    switch (opcode)
    {
        case op1:
            handle_op1(); // modify registers and/or "memory", set status register
        break;
        [...]
    }
}

很多年前我做了類似這樣的課程作業。 不幸的是,消息來源沒有生存,所以我會嘗試將我記得的一些一般性想法放在一起。 我希望它能幫助你完成你的項目。

首先也是最簡單的 - 寄存器塊。 我把它做成一個簡單的結構。 對於標志寄存器,為方便起見,我創建了一些設置/清除功能。

第二,可能需要付出最多努力 - 指令解碼。 我在目標CPU指令集上有一本手冊,它解釋了二進制代碼中不同位的含義。 通常很少有基本類的指令:算術/布爾操作,控制流指令,存儲器/寄存器復制/交換以及可能的其他幾個。 另一個方面是如何通過指令處理操作數。 通常,存在2個操作數,並且每個操作數的尋址在二進制命令中被編碼。 所以要解釋它們你需要兩件事:

  • 一組處理函數,涵蓋了將執行實際工作的所有指令類的所有變體(即 - 修改機器狀態);
  • 以及一些指令選擇器功能,它將在程序計數器(PC)或指令指針(IP)上執行下一個二進制命令,准備在“機器”上執行(例如,確定它是一個加法運算,提取參數值)從內存中),調用相應的處理函數並在調用后調整PC / IP。 在這里,您還可以打印一個很好的人類可讀匯編指令以及命令的字節碼及其地址。

第三 - 記憶。 這取決於目標架構。 在我的情況下,沒有段/選擇器,最大內存量很小,所以我剛剛分配了一個相應的塊。 為了訪問具體的存儲單元,我添加了一個set / get函數。 內存的某些區域應該由ROM占用,因此這個薄層有助於實現它。

第四 - I / O和中斷。 根據需求和平台,這可能會變得非常復雜。 最簡單的終端輸出可以通過為某種屏幕緩沖區專用存儲塊來實現。 當mem-setter函數看到對該塊的寫入時,它會更新您的控制台仿真(您的應用程序中需要一個GUI,對嗎?)。 最簡單的控制台輸入也類似於8086架構 - 當用戶按下鍵時,您可以模擬中斷,將密鑰代碼傳遞給它等。如果您需要更復雜的東西,即帶有可加載中斷處理程序的真實BIOS支持和/或模擬一些I / O控制器將花費您在機器的先前部分上花費的相同時間。 所以不要把它推遲到上周。

您需要考慮兩個問題:將模擬機器的內部狀態映射到模擬器中的變量,以及執行代碼。 第一個通常由寄存器的數組處理,可能在具有各種其他信息的結構中:程序計數器,帶有條件代碼的位圖(假設處理器具有這些 - 我不知道MIPS架構),第二個將是一個開關或一個指向函數或功能對象的指針表。 如果體系結構使用不同的機器指令格式,則可以是多級表。 然后,仿真器在當前指令指針處讀取“指令”,然后通過打開它或使用它來索引到表中來“執行”它。 一遍又一遍,無休止的循環。

這應該讓你開始:

http://www.oberle.org/procsimu-index.html

您必須為MIPS指令集自定義它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM