我是 MIPS 的新手,我有一個 uni 的任務。我在 Mips 中有一個程式(游戲),我正在嘗試撰寫一個函式以在完成后重新啟動游戲。我已經有了重啟功能,但問題是我必須清除以前使用過的所有暫存器。有誰知道我如何以最快和最簡單的方式進行清除?(我有 740 行代碼,這就是為什么我要求最簡單和最快的。)
uj5u.com熱心網友回復:
暫存器不能是“空的”,它們總是在它們的 32 位中保存一些值。它們之外的任何地方都沒有元資料表明哪些暫存器已/尚未寫入。
你不需要做任何特別的事情。程式其余部分中的非錯誤代碼應該已經假設任何暫存器如果沒有寫入垃圾(不一定是零)。(或者做一個系統呼叫之類的事情,它會讓模擬器把一個有用的值放在一個暫存器中。)
將暫存器想象為 C 中的區域變數。就像int a0, a1, t0, t1; not int a0=0, a1=0等。這就是為什么你要撰寫類似 的回圈for(t0=5 ; t0!=0 ; t0--),其中第一次訪問是寫入(將 a 分配5給變數/暫存器)。在 asm 中,這意味著li $t0, 5在回圈之前。如果您不這樣做,您的回圈將運行一些未知次數的迭代,具體取決于$t0. (在 C 中,讀取未初始化的區域變數是未定義的行為或至少是未指定的值。在實踐中,您會從某個地方得到一些垃圾,因為 C 編譯為 asm,而在實際 CPU 的 asm 中,每個暫存器和記憶體位置總是有一個價值。)
(從某種意義上說,全域變數是一個更好的類比,因為所有代碼在不同時間出于不同目的使用相同的暫存器。但是由于您不想讀取之前的函式留在其中的任何垃圾,因此考慮單獨的生命周期作為單獨的區域變數。)
如果您確實想將一些暫存器歸零,顯然您只需撰寫如下指令
li $a0, 0
li $t0, 0 # work-around for buggy code that assumes registers are zeroed
...
j main
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/443206.html
