如何表示mips指令,因为它是十六进制表示

时间:2015-06-11 02:24:14

标签: assembly mips

我收到了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指令格式完成此任务,但是无法解决这个问题。

任何帮助都表示赞赏。

2 个答案:

答案 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

那就是它。 (不过我可能在某个地方犯了错误。)