首页 文章

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

提问于
浏览
0

我给了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

并告诉我将每行转换为"instruction in hex."我遇到的问题是 jal 指令 . 我知道这是一个Pseudodirect地址,我不明白它是如何写出来的 .

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

我理解如何完成R-Type和I-Type指令格式的这个任务,但是不能解决这个问题 .

任何帮助都很感激 .

2 回答

  • 3

    首先,您采用操作码,前6位 .

    0b000011 = 0x03
    

    然后你拿下一条指令的地址吧

    0x00155874
    

    将其向右移动两个(或执行整数除以4),这样就可以了

    0x0005561D
    

    将两个值都填充为4个字节

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

    执行按位或

    0x0C05561D
    

    而已 . (虽然我可能在某个地方犯了错误) .

  • 0

    操作码: 0000 11

    剩余26位: Bits 2-27 of the address of label

    Explanation
    到目前为止,您所知道的机器语言相当于:

    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 的新"address"成为: 0001 0010 0011 0100 0101 0110 0111 10--

    2.现在我们需要在26位中装入30位的 func 地址,因为操作码占用了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
    

相关问题