[英]How to represent mips instruction as it's hex representation
我得到了一條MIPS指令:
top:
lw $t1, ($t0)
beq $s0, $0, end
jal func
add $s0, $s0, $t0
addi $s0, $s0, -1
j top
bne $s0, $0, top
end:
func:
sll $v0, $t1, 4
jr $ra
並被告知將每行轉換為“十六進制指令”。 我遇到的問題是jal
指令。 我了解它是一個偽直接地址,我不了解它如何按照要求寫出來。
給定jal
指令的OPCode為3hex
,則J-Type指令格式的前6位為000011
,我如何算出其余的?
我知道如何完成R-Type和I-Type指令格式的任務,但無法弄清楚這一點。
任何幫助表示贊賞。
操作碼: 0000 11
剩余的26位: Bits 2-27 of the address of label
說明 :
到目前為止,您所知道的機器語言等效項是:
0000 11xx xxxx xxxx xxxx xxxx xxxx xxxx
x
表示目前未知。
要找到jal func
32位機器語言表示形式,您需要的第一件事是標簽func
的內存地址。 如果您知道上述任何一條指令的地址,則為每條指令加4即可得到func
標簽的地址。
可以說func
的地址是0x12345678
(二進制: 0001 0010 0011 0100 0101 0110 0111 1000
)
該地址為32位,而您只能容納26位。
為了解決這個問題,您需要做兩件事:
1.由於此地址將始終為四的倍數,因此最后兩位始終為00
。 因此,我們不需要包括它們。 因此, func
新“地址”變為: 0001 0010 0011 0100 0101 0110 0111 10--
2.現在,由於操作碼占用6位,因此我們需要將26位的30位func
地址適合。 為此,我們忽略了4個最高有效位。 機器從PC
獲取這些4位。 因此, func
新“地址”變為: ---- 0010 0011 0100 0101 0110 0111 10--
func
這些26位地址使jal
32位機器語言變為:
0000 1100 1000 1101 0001 0101 1001 1110
首先,您對最高6位采用操作碼。
0b000011 = 0x03
然后拿下一條指令的地址,假設
0x00155874
將其向右移動二(或執行四的整數除法),這使其
0x0005561D
將兩個值填充到4個字節
0x3 << 26 = 0x0C000000
0x0005561D = 0x0005561D
執行按位或
0x0C05561D
而已。 (不過,我可能在某個地方犯了一個錯誤)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.