在机器代码中编码汇编 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 ...
在执行 beq
时 pc
将在 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 位相对地址]
我需要对以下 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 ...
在执行 beq
时 pc
将在 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 位相对地址]