我被困在將MIPS指令轉換爲下面的機器代碼。MIPS對機器代碼的指令
sb $t3, 40($s2)
beq $s0, $s1, Lab1
j Lab1
jr $s0
到目前爲止,我有
101000 10010 01011 101000
000100 10000 10001 0x00400000
我怎麼走?由於0x00400000是地址不值,我不認爲我把它翻譯成二進制。 Andn等等...我真的找不到從這裏繼續的例子。請幫忙。
我被困在將MIPS指令轉換爲下面的機器代碼。MIPS對機器代碼的指令
sb $t3, 40($s2)
beq $s0, $s1, Lab1
j Lab1
jr $s0
到目前爲止,我有
101000 10010 01011 101000
000100 10000 10001 0x00400000
我怎麼走?由於0x00400000是地址不值,我不認爲我把它翻譯成二進制。 Andn等等...我真的找不到從這裏繼續的例子。請幫忙。
啊我覺得我現在看到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
所以這就是我得到的。如果有任何錯誤,請讓我知道。
MIPS指令中的立即值直接作爲它們的二進制表示進行編碼。
編碼取決於指令類型。
對於相對分支像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
右邊對方?這是沒用的,因爲它最終會跳沒有做任何事情
這是由教授分配。他可能是爲了讓學生知道它做什麼而做的。 – user3754212
如何在0x00400000被表示爲010000000000000000000000(24位)時在I型中應該是16?我如何壓縮它? – user3754212
如果''0x00400000''代表'Lab1''的地址,那麼你需要編碼你想要跳過的指令的數量,我相信它只是「目標指令的地址 - 分支指令的地址 - 1'',但我可能是錯的。但是,如果'0x00400000''已經代表跳轉,那麼這是不可能的,並且你的代碼需要調整。 –
實際上,在反思時我意識到如果'0x00400000'是一個偏移量就可以組裝,但是它需要增加額外的指令來跳轉超過16位通常允許 –