首页 文章

在机器代码中编码Assembly MIPS指令

提问于
浏览
0

我需要编码以下 beq 指令:

...
start: addu $8, $9, $10
       addiu $8, $8, 0x00FF7A01
       beq $8, $0, start
...

我知道它是一个 J 格式的指令,所以除法将是6位到操作码,6到目标地址 . beq 操作码是 000100 ,所以我已经有 0001000100000000 ,但我不知道如何找到剩下的16位,有什么帮助吗?

2 回答

  • 2

    执行 beq $8, $0, start 时, PC 包含下一条指令的地址 . 如果 $8$0 的内容不相等,则不会跳转,这意味着 PC 的值不会发生变化 .

    但是如果 $8$0 的内容相同,则需要跳转到标签 start . 换句话说,你想要的是这个 - 你希望 PC 包含指令 addu $8, $9, $10 的地址 .

    因此,需要计算 current value of PCvalue of PC in case of jump 之间的差异 .

    跳转的指令数= 3(但由于我们希望PC跳转到前一条指令,所以指向负方向) .

    二进制等价-3 = 2的补充( 0000 0000 0000 0011 ),结果证明是 1111 1111 1111 1101

    因此,此 beq 指令的32位表示形式为:

    0001 0010 0000 0000 1111 1111 1111 1101
    

    [beq的6位操作码] [5位寄存器$ 8] [5位寄存器$ 0] [16位相对地址]

  • 2

    在MIPS中,在 beq 期间,添加到 program counter 的偏移量计算如下:

    signextend immediate value
    
    offset = (immediate value) << 2
    

    新PC计算如下:

    pc += offset
    

    在这里,在您的代码中,如果 $8 == $0 ,您希望将 pc 移回12字节或 3 指令 . 因此,要将 FFFFFFF4 添加为 pc 的偏移量,您将需要的立即值将是最后2个字节:

    FFFFFFF4 >> 2 = FFFFFFFD
    

    你也可以理解为:

    Address
    00000000 start: addu $8, $09, $10
    00000004        addiu $8, $8, 0x00FF7A01
    00000008        beq $8, $0, start
    0000000C ...
    

    执行 beq pc 时将在 0000000C . 假设 $8 == $0 然后 pc 应该再次成为 00000000 . 因此 offset = final_pc - initial_pc = 00000000-0000000C . 所以,

    offset = FFFFFFF4
    

    immediatevalue = ((FFFFFFF4) >> 4) 的最后2个字节 . 因此,

    immediate_value = FFFD
    

    快捷方式:也可以直接计算要转移程序计数器的 words 数,而不是计算这个长度 . 在这里你想要向后 3 words ,因此 immediate_value = -3 = FFFD . 如果你想前进而不是后退,这也是正确的 .

相关问题