我收到了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
指令。我知道它是一个Pseudodirect地址,我不明白它是如何写出来的。
鉴于jal
指令的OPCode是3hex
,J-Type指令格式的前6位将是000011
,我如何计算剩余的?
我理解如何为R-Type和I-Type指令格式完成此任务,但是无法解决这个问题。
任何帮助都表示赞赏。
答案 0 :(得分:3)
操作码: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.由于此地址始终为4的倍数,因此最后两位始终为00
。因此,我们不需要包含它们。因此,我们func
的新“地址”变为:0001 0010 0011 0100 0101 0110 0111 10--
2.现在我们需要在26位中装入30位func
地址,因为操作码占用了6位。为此,我们忽略了4个最重要的位。机器从PC
获取这些4位。因此,我们func
的新“地址”变为:---- 0010 0011 0100 0101 0110 0111 10--
func
的这些26位地址使jal
的32位机器语言成为:
0000 1100 1000 1101 0001 0101 1001 1110
答案 1 :(得分:0)
首先,您采用操作码,前6位。
0b000011 = 0x03
然后你拿下一条指令的地址,让我们说
0x00155874
将它向右移动两个(或执行整数除以4),这使得
0x0005561D
将两个值填充为4个字节
0x3 << 26 = 0x0C000000
0x0005561D = 0x0005561D
执行按位或
0x0C05561D
那就是它。 (不过我可能在某个地方犯了错误。)