2014-06-27 93 views
0

我被困在將MIPS指令轉換爲下面的機器代碼。MIPS對機器代碼的指令

sb $t3, 40($s2) 
    beq $s0, $s1, Lab1 
    j Lab1 

    jr $s0 

到目前爲止,我有

101000 10010  01011  101000 
000100 10000  10001  0x00400000 

我怎麼走?由於0x00400000是地址不值,我不認爲我把它翻譯成二進制。 Andn等等...我真的找不到從這裏繼續的例子。請幫忙。

回答

0

啊我覺得我現在看到MIPS: Calculating BEQ into Hexadecimal Machine Code和Lưu的答案我現在得到一個更好的主意。

beq $s0, $s1, Lab1 
=>000100 10000 10001 0x00400000 
=>0001 0010 0001 0001 (0x004000040 + 1 away instruction) 
=>0001 0010 0001 0001 0000 0000 0000 0101 
=12110001 
    j Lab1 
=>0000 1000 0001 0000 0000 0000 0000 0000 
=08100000 
    jr $s0 
=>0000 0000 0000 0000 0000 0000 0000 1000 
=02000008 

所以這就是我得到的。如果有任何錯誤,請讓我知道。

0

MIPS指令中的立即值直接作爲它們的二進制表示進行編碼。

+0

如何在0x00400000被表示爲010000000000000000000000(24位)時在I型中應該是16?我如何壓縮它? – user3754212

+0

如果''0x00400000''代表'Lab1''的地址,那麼你需要編碼你想要跳過的指令的數量,我相信它只是「目標指令的地址 - 分支指令的地址 - 1'',但我可能是錯的。但是,如果'0x00400000''已經代表跳轉,那麼這是不可能的,並且你的代碼需要調整。 –

+0

實際上,在反思時我意識到如果'0x00400000'是一個偏移量就可以組裝,但是它需要增加額外的指令來跳轉超過16位通常允許 –

0

編碼取決於指令類型。

對於相對分支beq,立即數是偏移量,所以您需要指定當前指令和分支目標之間的距離。例如,跳過下一3只說明你需要beq $s0, $s1, +3編碼爲

opcode  $s0  $s1      +3 
000100 10000 10001 0000 0000 0000 0011 

對於絕對跳轉你需要確保目標和當前指令的高6位是相同的。眼前的地址是目標的低26位移2.第j指令的格式0000 10ii iiii iiii iiii iiii iiii iiii所以j 0x00400000將被編碼爲

0000 1000 0001 0000 0000 0000 0000 0000 

你可以閱讀更多關於this question編碼以及這裏的課程:

指令編碼也可用here

但是,爲什麼你使用兩個條件分支並跳轉到Lab1右邊對方?這是沒用的,因爲它最終會跳沒有做任何事情

+0

這是由教授分配。他可能是爲了讓學生知道它做什麼而做的。 – user3754212