MIPSsim下載:https://files.cnblogs.com/files/jiangxinnju/MIPSsim.zip
啟動模擬器
雙擊MIPSsim.exe,即可啟動該模擬器。MIPSsim是在Windows操作系統上運行的程序,它需要用.NET運行環境。如果你的機器沒有該環境,請先下載和安裝"Microsoft .NET Framework 2.0 版可再發行組件包"。
模擬器啟動時,自動將自己初始化為默認狀態。所設置的默認值為:
-
所有通用寄存器和浮點寄存器為全0;
-
內存清零;
-
流水寄存器為全0;
-
清空時鍾圖、斷點、統計數據;
-
內存大小為4096字節;
-
載入起始地址為0;
-
浮點加法、乘法、除法部件的個數均為1;
-
浮點加法、乘法、除法運算延遲分別為6、7、10個時鍾周期;
-
采用流水方式;
-
不采用定向機制;
-
不采用延遲槽;
-
采用符號地址;
-
采用絕對周期計數。
當模擬器工作在非流水方式下(配置菜單中的"流水方式"前沒有"√"號)時,下面敘述中有關流水段的內容都沒有意義,應該忽略之。
MIPSsim的窗口
在流水方式下,模擬器主界面中共有7個子窗口,它們是:代碼窗口、寄存器窗口、流水線窗口、時鍾周期圖窗口、內存窗口、統計窗口和斷點窗口。每一個窗口都可以被收起(變成小圖標)、展開、拖動位置和放大/縮小。當要看窗口的全部內容時,可以將其放大到最大。
在非流水方式下,只有代碼窗口、寄存器窗口、內存窗口和斷點窗口。
1. 代碼窗口
代碼窗口給出內存中代碼的列表,每條指令占一行,按地址順序排列。每行有5列(當全部顯示時):地址、斷點標記、指令的機器碼、流水段標記和符號指令。如圖2.1所示。

圖2.1 代碼窗口
圖中不同抹色的行代表相應的指令所處的執行段。黃色代表IF段,綠色代表ID段,紅色代表EX段,青色代表MEM段,棕色代表WB段。
該窗口中各列的含義如下:
-
地址:以16進制的形式給出。內存是按字節尋址的,每條指令占4個字節。 當采用符號地址時,會在相應的位置給出匯編程序中出現的標號。
-
斷點標記:如果在該指令處設有斷點,則顯示相應的標記。斷點標記的形式為 B.X(X為段名),表示該斷點是設置在該指令的"X"段。例如,若某行的斷點標記為"B.EX",則表示在該指令的EX段設置了斷點。
當模擬器工作在非流水方式下時,斷點的標記為B。
-
機器碼:該行所對應的指令的十六進制機器碼。若該行無指令,則僅僅顯示4字節數據;
-
流水段標記:表示當該指令正在執行時,它在當前周期該指令所處的流水段。當模擬器工作在非流水方式下時,它沒有意義。
-
符號指令:機器代碼所對應的符號指令。
在該窗口中選中某行(用鼠標左鍵單擊),然后再點擊鼠標右鍵,就會彈出菜單:設置斷點,清除斷點,它們分別用於在所選指令處設置斷點和清除斷點。
-
設置斷點
選擇(點擊)要設斷點的指令à點擊右鍵à"設置斷點",彈出"設置斷點"小對話框,在"段"的下拉框中選擇斷點所在的流水段(在非流水方式下,不存在該下拉框),單擊"確定"即可。
-
清除斷點
選擇(點擊)指令à點擊右鍵à"清除斷點",則設置在該指令處的斷點被刪除。
2. 寄存器窗口
寄存器窗口顯示MIPSsim模擬器中的寄存器的內容。共有4組寄存器:通用寄存器、浮點寄存器、特殊寄存器和流水寄存器,分為4欄來顯示。每一欄下分別有各自的數據格式選項,如圖2.2所示。

圖2.2 寄存器窗口
(1) 通用寄存器
MIPS64有32個64位通用寄存器:R0,R1,…,R31。它們被簡稱為GPRs(General-Purpose Registers),有時也被稱為整數寄存器。R0的值永遠是0。
通過數據格式選項,可以選擇顯示的格式是十進制還是十六進制。
(2) 浮點寄存器
共有32個64位浮點數寄存器:F0,F1,…,F31。它們被簡稱為FPRs(Floating-Point Registers)。它們既可以用來存放32個單精度浮點數(32位),也可以用來存放32個雙精度浮點數(64位)。存儲單精度浮點數(32位)時,只用到FPR的一半,其另一半沒用。
(3) 特殊寄存器
特殊寄存器有4個:
-
PC:程序計數器(32位);
-
LO:乘法寄存器的低位;
-
HI:乘法寄存器的高位;
-
FCSR:浮點狀態寄存器。
(4) 流水寄存器
-
IF/ID.IR:流水段IF與ID之間的指令寄存器;
-
IF/ID.NPC:流水段IF與ID之間的下一指令程序計數器;
-
ID/EX.A:流水段ID與EX之間的第一操作數寄存器;
-
ID/EX.B:流水段ID與EX之間的第二操作數寄存器;
-
ID/EX.Imm:流水段ID與EX之間的立即數寄存器;
-
ID/EX.IR:存放從IF/ID.IR傳過來的指令;
-
EX/MEM.ALUo:流水段EX與MEM之間的ALU計算結果寄存器;
-
EX/MEM.IR:存放從ID/EX.IR傳過來的指令;
-
MEM/WB.LMD:流水段MEM與WB之間的數據寄存器,用於存放從存儲器讀出的數據;
-
MEM/WB.ALUo:存放從EX/MEM.ALUo傳過來的計算結果;
-
MEM/WB.IR:存放從EX/MEM.IR傳過來的指令。
除了流水寄存器外,其他寄存器都可以修改。只要雙擊某寄存器所在的行,系統就會彈出一個小對話框。該對話框顯示了該寄存器原來的值。在新值框中填入新的值,然后點擊"保存",系統就會將新值寫入該寄存器。
3. 流水線窗口
流水線窗口顯示流水線在當前配置下的組成以及該流水線的各段在當前周期正在處理的指令。如圖2.3所示。
非流水方式下,沒有該窗口。

圖2.3 流水線窗口
在該窗口中,每一個矩形方塊代表一個流水段,它們用不同的顏色填充。在該窗口的左側是IF到WB段,其右邊為浮點部件。浮點部件分有浮點加法部件(fadd)、浮點乘法部件(fmul)和浮點除法部件(fdiv)三種。在菜單"配置"à"常規配置"中修改浮點部件個數,可看到該窗口中對應類型的浮點部件個數會發生相應的變化。
在運行過程中,各段的矩形方塊中會顯示該段正在處理的指令及其地址(16進制)。當雙擊某矩形方塊時,會彈出窗口顯示該段出口處的流水寄存器的內容(16進制)。
4. 時鍾周期圖窗口
該窗口用於顯示程序執行的時間關系,畫出各條指令執行時所用的時鍾周期。非流水方式下,沒有該窗口。
以窗口左上為原點,橫軸正方向指向右方,表示模擬器先后經過的各個周期(列),縱軸正方向指向下方,表示模擬器中先后執行的各條指令(行)。如圖2.4所示。

圖2.4 時鍾周期圖窗口
橫坐標有相對周期計數和絕對周期計數兩種不同的表示形式。在默認的絕對周期計數下,按0、1、2、… 依次遞增的順序計數。而在相對周期計數下,當前周期記為第0個周期,而其余周期(在左邊)則按其相對於當前周期的位置,分別記為-1,-2,-3,…等。
在由指令軸和周期軸組成的二維空間下,坐標(n, i)對應的矩形區域表示指令i在第n+1周期時所經過的流水段(假設采用絕對周期計數)。
雙擊某行時,會彈出一個小窗口,顯示該指令在各流水段所進行的處理。
該窗口中還顯示定向的情況。這是用箭頭來表示的。若在第m周期和第m+1周期間產生從指令i1到指令i2的定向,則在坐標(m, i1)和(m+1, i2)表示的矩形區域之間會有一個箭頭。
5. 內存窗口
該窗口顯示模擬器內存中的內容,左側一欄為十六進制地址,右側為數據,如圖2.5所示。可以直接通過雙擊來修改其內容。這時會彈出一個"內存修改"對話框,如圖2.6所示。對話框的上部區域為數據類型與格式選擇區,通過勾選其中的一項,就可以指定所采用的數據類型與格式。

圖2.5 內存窗口

圖2.6 "內存修改"對話框
在該"內存修改"對話框中,地址框最開始顯示的是被雙擊的單元的地址,用戶可以直接修改該地址。在新值框中輸入新值,然后點擊按鈕"修改",模擬器就會把新值寫入內存中相應的單元。新值的格式必須與所選的數據類型和格式一致。
"前地址"與"后地址"按鈕分別將當前地址減少和增加一個數據長度(字節數),並顯示當前地址所指定單元的內容。"前地址"和"后地址"用於連續修改一片的內存數據。"顯示"按鈕用於顯示當前地址所指單元的內容。在修改地址后,點擊該按鈕就可以顯示內存單元的內容。
6. 統計窗口
該窗口顯示模擬器統計的各項數據。如下所示。
(非流水方式下,沒有該窗口)
匯總:
執行周期總數:0
ID段執行了0條指令
硬件配置:
內存容量:4096 B
加法器個數:1 執行時間(周期數):6
乘法器個數:1 執行時間(周期數)7
除法器個數:1 執行時間(周期數)10
定向機制:不采用
停頓(周期數):
RAW停頓:0 占周期總數的百分比:0%
其中:
load停頓:0 占所有RAW停頓的百分比:0%
分支/跳轉停頓:0 占所有RAW停頓的百分比:0%
浮點停頓:0 占所有RAW停頓的百分比:0%
WAW停頓:0 占周期總數的百分比:0%
結構停頓:0 占周期總數的百分比:0%
控制停頓:0 占周期總數的百分比:0%
自陷停頓:0 占周期總數的百分比:0%
停頓周期總數:0 占周期總數的百分比:0%
分支指令:
指令條數:0 占指令總數的百分比:0%
其中:
分支成功:0 占分支指令數的百分比:0%
分支失敗:0 占分支指令數的百分比:0%
load/store指令:
指令條數:0 占指令總數的百分比:0%
其中:
load:0 占load/store指令數的百分比:0%
store:0 占load/store指令數的百分比:0%
浮點指令:
指令條數:0 占指令總數的百分比:0%
其中:
加法:0 占浮點指令數的百分比:0%
乘法:0 占浮點指令數的百分比:0%
除法:0 占浮點指令數的百分比:0%
自陷指令:
指令條數:0 占指令總數的百分比:0%
7. 斷點窗口
斷點一般是指指定的一條指令,當程序執行到該指令時,會中斷執行,暫停在該指令上。在本模擬器中,斷點可以設定在某條指令的某一個流水段上(如果是在流水方式下)。當該指令執行到相應的流水段時,會中斷執行。
斷點窗口列出當前已經設置的所有斷點,每行一個。每行由3部分構成:地址(16進制),流水段名稱,符號指令。如圖2.7所示。(在非流水方式下,"段"沒有意義)

圖2.7 斷點窗口
該窗口上方有四個按鈕:添加、刪除、全部刪除、修改。
-
添加
單擊"添加",會彈出小對話框"設置斷點",在"地址"框中輸入斷點的十六進制地址,在"段"的下拉框中選擇在哪個流水段中斷(非流水方式下,不需要該操作,下同),單擊"確定"即可。
-
刪除
選中某個斷點(單擊斷點列表中相應的一項),單擊"刪除",則該斷點被清除。
-
全部刪除
單擊"全部刪除",所有斷點都將被清除。
-
修改
選中某個斷點,單擊"修改",會彈出小對話框"設置斷點",在"地址"框中輸入斷點的地址,在"段"的下拉框中選擇在哪個流水段中斷,單擊"確定"即可將原斷點修改為新設斷點。
MIPSsim的菜單
1. 文件菜單
文件菜單如下所示:

(1) CPU復位
將模擬器中CPU的狀態復位為默認值。
(2) 全部復位
將整個模擬器的狀態復位為默認值。模擬器啟動時,也是將狀態設置為默認值。
(3) 載入程序
將被模擬程序載入模擬器的內存。被模擬程序可以是匯編程序(.s文件),也可以是匯編后的代碼(.bin文件)。點擊該菜單后,系統將彈出"載入"對話框,選擇要載入的文件,然后點擊"打開"。如果是.s文件,系統會對該文件進行匯編。若匯編過程無錯誤,則將產生的二進制代碼載入至模擬器的內存;若有錯誤,則報告錯誤信息。如果是.bin文件,則直接將該文件的內容載入到模擬器內存。
被載入程序在內存中連續存放,其起始地址默認為0。該起始地址可以從"代碼"菜單中的"載入起始地址"來查看和修改。修改時,如果輸入的地址不是4的整數倍,模擬器會自動將其歸整為4的整數倍。
(4)退出
退出模擬器。
2. 執行菜單
該菜單提供了對模擬器執行程序進行控制的功能。在下面的執行方式中,除了單步執行,當遇到斷點或者用戶手動中止(用"中止"菜單項)時,模擬器將立即暫停執行。
在流水方式下,執行菜單如下所示:

在非流水方式下,執行菜單如下所示:

(1)單步執行一個周期
執行一個時鍾周期,然后暫停。其快捷鍵為F7。該菜單僅出現在流水方式下。
(2)撤銷上一個周期
模擬器回退一個時鍾周期,即恢復到執行該周期之前的狀態。其快捷鍵為F8。該菜單僅出現在流水方式下。
(3)執行多個周期
執行多個時鍾周期,然后暫停。點擊該菜單后,系統會彈出一個小對話框,由用戶指定要執行的周期的個數。該菜單僅出現在流水方式下。
(4)連續執行
從當前狀態開始連續執行程序,直到程序結束或遇到斷點或用戶手動中止。
(5)執行到…
點擊該菜單項后,系統會彈出一個"設定終點"小對話框,由用戶指定此次執行的終點,即在哪條指令的哪個流水段暫停。點擊"確定"后,模擬器即開始執行程序,直到到達終點位置或遇到斷點或用戶手動中止。所輸入的終點地址將被歸整為4的整數倍。
(6) 中止
點擊該菜單項后,模擬器會立即暫停執行。當模擬器執行程序出現長期不結束的狀況時,可用該菜單強行使模擬器停止執行。
(7)單步執行一條指令
執行一條指令,然后暫停。該指令的地址由當前的PC給出。其快捷鍵為F7。該菜單僅出現在非流水方式下。
(8)撤銷上一條指令
模擬器回退一條指令,即恢復到執行該指令之前的狀態。其快捷鍵為F8。該菜單僅出現在非流水方式下。
(9) 執行多條指令
執行多條指令,然后暫停。點擊該菜單項后,系統會彈出一個小對話框,由用戶指定要執行的指令的條數。
3. 內存菜單
該菜單下有3項:顯示,修改,符號表。
(1)顯示
該菜單項用於設置顯示內存的值的數據類型與格式。點擊該菜單項后,系統會彈出"內存顯示"對話框,如圖3.1所示。在選定所要的數據類型與格式后,單擊"確定"按鈕,內存窗口中的數據就會按指定的數據類型與格式顯示。

圖3.1 內存顯示窗口
(2) 修改
該菜單項用於對內存的值進行修改。點擊該菜單項后,系統會彈出"內存修改"對話框,該對話框與圖2.6的"內存修改"相同。請參見相關的論述。
(3) 符號表
該菜單項用於顯示符號表。符號表中列出了當前被執行的程序中各符號的地址(內存地址)。
4. 代碼菜單
(1) 載入起始地址
該菜單項用於顯示和修改代碼載入內存的起始地址。如果要修改,只要在彈出的"載入起始地址"對話框中輸入新的地址,然后點擊"確認"即可。
(2) 設置斷點
點擊該菜單項,會彈出"設置斷點"小對話框,輸入斷點地址,並在"段"的下拉框中選擇斷點所在的流水段(在非流水方式下,不存在該下拉框),單擊"確定"即可。
(3) 取消斷點
在代碼窗口中選擇某條指令,然后點擊該菜單項,則設置在該指令處的斷點被刪除。
(4) 清除所有斷點
清除所有斷點。
5. 配置菜單
配置菜單用於修改模擬器的配置。需要注意的是:修改配置將會使模擬器復位。
配置菜單如下所示:

(1) 常規配置
該菜單項用於查看和設置以下參數:(其默認值見"一、啟動程序")
-
內存容量;
-
浮點加法運算部件個數
-
浮點乘法運算部件個數
-
浮點除法運算部件個數
-
浮點加法運算延遲周期數
-
浮點乘法運算延遲周期數
-
浮點除法運算延遲周期數
如果要修改這些參數,只要直接修改,然后點擊"確定"按鈕即可。
(2) 流水方式
"流水方式"開關。當該項被勾選(即其前面有個"√"號)時,模擬器按流水方式工作,能模擬流水線的工作過程。否則(即沒有被勾選)就是按串行方式執行程序。
該項的勾選和去選(即去掉其前面的"√"號)都是通過點擊該項來實現的。下同。
當從流水方式切換為非流水方式(或相反)時,系統將強行使模擬器的狀態復位。
(3) 符號地址
"符號地址"開關。當該項被勾選時,代碼窗口中的代碼將顯示原匯編程序中所采用的標號。否則(即沒有被勾選)就不顯示。
(4) 絕對周期計數
"絕對周期計數"開關。當該項被勾選時,時鍾周期圖窗口中的橫坐標將顯示為絕對周期,即時鍾周期按0、1、2、… 順序遞增的順序計數。否則(即沒有被勾選)就按相對周期計數,即把當前周期記為第0個周期,而其余周期(在左邊)則按其相對於當前周期的位置,分別記為-1,-2,-3,…等。
在非流水方式下,該菜單項不起作用(變灰)。
(5) 定向
"定向"開關,用於指定是否采用定向技術。當該項被勾選時,模擬器在執行程序時將采用定向技術。否則就不采用。
在非流水方式下,該菜單項不起作用(變灰)。
(6) 延遲槽
"延遲槽"開關,用於指定是否采用延遲分支技術。當該項被勾選時,模擬器在執行程序時將采用一個延遲槽。否則就不采用。
在非流水方式下,該菜單項不起作用(變灰)。
(7) 載入配置
用於將一個配置文件(.cfg)載入模擬器,模擬器將按該文件進行配置並復位。點擊該菜單項,系統將彈出"打開"對話框,讓用戶指定所要載入的配置文件。
(8) 保存配置
用於將模擬器當前的配置保存到一個配置文件(.cfg)中,以便以后重用。點擊該菜單項,系統將彈出"保存文件"對話框,讓用戶指定配置文件的名稱和位置。
6. 窗口菜單
(1) 平鋪
將當前已打開的子窗口平鋪在主窗口中。
(2) 層疊
將當前已打開的子窗口層疊在主窗口中。
(3) 打開所有
將所有子窗口都打開。
(4) 收起所有
將所有子窗口最小化。
(5) 選擇子窗口
在該菜單中還列出了所有的子窗口的名稱,選擇其中的任一個,將使該窗口被選中,並被提到最上層。
7. 幫助菜單
該菜單下有兩項:"幫助"和"關於MIPSsim"。前者提供用戶手冊,后者給出關於MIPSsim的版權信息和設計開發者信息。
