簡體   English   中英

如何將mips指令表示為十六進制表示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM