如何将 mips 指令表示为十六进制表示

How to represent mips instruction as it's hex representation

我得到一条 MIPS 指令:

top:
 lw $t1, ($t0)
 beq $s0, [=10=], end
 jal func
 add $s0, $s0, $t0
 addi $s0, $s0, -1
 j top
 bne $s0, [=10=], top
end:
func:

 sll $v0, $t1, 4
 jr $ra

并被告知将每一行转换为 "instruction in hex." 我遇到的问题是 jal 指令。我理解是伪直接地址,我不明白怎么按要求写出来。

鉴于 jal 指令的 OPCode 是 3hex,J 类型指令格式中的前 6 位将是 000011,我如何计算剩余的?

我知道如何为 R-Type 和 I-Type 指令格式完成这项任务,但无法弄清楚这一点。

感谢任何帮助。

首先获取操作码的前 6 位。

0b000011 = 0x03

然后你取下一条指令的地址,比方说

0x00155874

将其右移二(或执行除以 4 的整数除法),这使得它

0x0005561D

将两个值填充为 4 个字节

0x3 << 26  = 0x0C000000
0x0005561D = 0x0005561D

执行按位或

0x0C05561D

就是这样。 (虽然我可能在某个地方犯了错误)。

操作码: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.Since 这个地址永远是四的倍数,最后两位永远是 00。因此,我们不需要包括它们。因此,func 的新 "address" 变为:0001 0010 0011 0100 0101 0110 0111 10--

2.Now 我们需要将 func 地址的 30 位放入 26 位中,因为操作码占用了 6 位。为此,我们忽略了 4 个最高有效位。机器从 PC 中获取这 4 位。因此,func 的新 "address" 变为:---- 0010 0011 0100 0101 0110 0111 10--

func地址的这26位使得jal的32位机器语言变成:

0000 1100 1000 1101 0001 0101 1001 1110