2011-09-01 23 views
0

嗨,我堅持我的任務,這就要求我寫一個C程序讀取輸入文件,如這一發現地址:幫助與十六進制的MIPS指令

Registers 
r1 = 0c100009 

Instructions 
0c100009 
3c071001 
8ce20011 
84e33080 
80e48000 
ace2ffff 
a4e39001 
a0e48088 
03e00008 

,並找出是否指令是保存或加載,指令訪問的字節數,以及內存中的第一個字節的地址。

我需要幫助瞭解指令是如何工作的。我知道,我必須指示爲二進制翻譯,例如

8ce20011 

100011 00111 00010 0000000000010001 

這是

lw $t3 17($s7) 

,但我不知道如何計算的地址和訪問的字節數。我想忽略所有不保存或加載的指令。

而且,符號擴展是什麼意思?

謝謝你的幫助。

回答

0

你在正確的軌道上。

操作碼8ce20011反彙編爲 「LW V0,17(A3)」 或等效於 「LW $ 2.17($ 7)」

在你的 「LW $ T3,17($ 7)」 的例子,你需要在計算它從中加載的地址之前,請知道$ 7的當前值(即$ a3)。提示:看看前面的指令。 「lw」指令加載一個字,或4個字節。

順便說一句,「lw」的偏移量如17,它不在字邊界上對齊是非法的,會導致MIPS陷阱。

Sign extension

+0

我的任務要我忽略除磅,LBU,LH,LHU,LW,SB,sh和SW其他所有指令。但是,在這種情況下,我的程序是否需要處理第二行指令lui $ 7 4097來計算第三行lw的地址?而地址只是4097 + 17並且轉換回1012的十六進制?我有點混淆這是如何工作的。 – CFC

+0

LUI將一個常量加載到目標寄存器的高16位中,並將低16位清零。所以「lui $ 7,0x1001」將$ 7設置爲0x10010000。然後「lw $ 2,17($ 7)」將嘗試從0x10010000 + 0x11加載32位,即0x10010011(這將觸發地址錯誤異常)。你的家庭作業不是很精確。 – markgz

+0

噢好吧,這意味着我必須通過每條指令來了解下一個人在說什麼。謝謝。 – CFC