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

Encode in machine code an Assembly MIPS instruction

我需要对以下 beq 指令进行编码:

...
start: addu , , 
       addiu , , 0x00FF7A01
       beq , [=10=], start
...

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

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

signextend immediate value

offset = (immediate value) << 2 

新 PC 计算如下:

pc += offset

在这里,在您的代码中,如果 == [=20=],您希望将 pc 后移 12 个字节或 3 指令。因此,要添加 FFFFFFF4 作为 pc 的偏移量,您需要的立即值将是以下 2 个字节:

FFFFFFF4 >> 2 = FFFFFFFD

你也可以理解为:

Address
00000000 start: addu , , 
00000004        addiu , , 0x00FF7A01
00000008        beq , [=13=], start
0000000C ...

在执行 beqpc 将在 0000000C。假设 == [=20=] 那么 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。如果您想前进而不是后退,这也适用。

beq , [=11=], start被执行时,PC包含下一条指令的地址。如果</code>和<code>[=14=]的内容不相等,则不会跳转,也就是说PC.

的值不会发生变化

但是如果</code>和<code>[=14=]的内容相同,则要跳转到标签start。换句话说,你想要的是这个 - 你想要 PC 包含指令的地址 addu , , .

因此需要计算PC的当前值与跳跃时PC的值的差

要跳转的指令数 = 3(但在负方向,因为我们希望 PC 跳转到上一条指令)。

-3 的二进制等值 = (0000 0000 0000 0011) 的 2 的补码 结果是 1111 1111 1111 1101

因此,此 beq 指令的 32 位表示将是:

0001 0010 0000 0000 1111 1111 1111 1101

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