如何将 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
我得到一条 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