我需要编码以下 beq 指令:
beq
... start: addu $8, $9, $10 addiu $8, $8, 0x00FF7A01 beq $8, $0, start ...
我知道它是一个 J 格式的指令,所以除法将是6位到操作码,6到目标地址 . beq 操作码是 000100 ,所以我已经有 0001000100000000 ,但我不知道如何找到剩下的16位,有什么帮助吗?
J
000100
0001000100000000
执行 beq $8, $0, start 时, PC 包含下一条指令的地址 . 如果 $8 和 $0 的内容不相等,则不会跳转,这意味着 PC 的值不会发生变化 .
beq $8, $0, start
PC
$8
$0
但是如果 $8 和 $0 的内容相同,则需要跳转到标签 start . 换句话说,你想要的是这个 - 你希望 PC 包含指令 addu $8, $9, $10 的地址 .
start
addu $8, $9, $10
因此,需要计算 current value of PC 和 value of PC in case of jump 之间的差异 .
跳转的指令数= 3(但由于我们希望PC跳转到前一条指令,所以指向负方向) .
二进制等价-3 = 2的补充( 0000 0000 0000 0011 ),结果证明是 1111 1111 1111 1101
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位相对地址]
在MIPS中,在 beq 期间,添加到 program counter 的偏移量计算如下:
program counter
signextend immediate value offset = (immediate value) << 2
新PC计算如下:
pc += offset
在这里,在您的代码中,如果 $8 == $0 ,您希望将 pc 移回12字节或 3 指令 . 因此,要将 FFFFFFF4 添加为 pc 的偏移量,您将需要的立即值将是最后2个字节:
$8 == $0
pc
3
FFFFFFF4
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 . 所以,
0000000C
00000000
offset = final_pc - initial_pc = 00000000-0000000C
offset = FFFFFFF4
和 immediatevalue = ((FFFFFFF4) >> 4) 的最后2个字节 . 因此,
immediatevalue
((FFFFFFF4) >> 4)
immediate_value = FFFD
快捷方式:也可以直接计算要转移程序计数器的 words 数,而不是计算这个长度 . 在这里你想要向后 3 words ,因此 immediate_value = -3 = FFFD . 如果你想前进而不是后退,这也是正确的 .
words
3 words
immediate_value = -3 = FFFD
2 回答
执行
beq $8, $0, start
时,PC
包含下一条指令的地址 . 如果$8
和$0
的内容不相等,则不会跳转,这意味着PC
的值不会发生变化 .但是如果
$8
和$0
的内容相同,则需要跳转到标签start
. 换句话说,你想要的是这个 - 你希望PC
包含指令addu $8, $9, $10
的地址 .因此,需要计算 current value of PC 和 value of PC in case of jump 之间的差异 .
跳转的指令数= 3(但由于我们希望PC跳转到前一条指令,所以指向负方向) .
二进制等价-3 = 2的补充(
0000 0000 0000 0011
),结果证明是1111 1111 1111 1101
因此,此
beq
指令的32位表示形式为:[beq的6位操作码] [5位寄存器$ 8] [5位寄存器$ 0] [16位相对地址]
在MIPS中,在
beq
期间,添加到program counter
的偏移量计算如下:新PC计算如下:
在这里,在您的代码中,如果
$8 == $0
,您希望将pc
移回12字节或3
指令 . 因此,要将FFFFFFF4
添加为pc
的偏移量,您将需要的立即值将是最后2个字节:你也可以理解为:
执行
beq
pc
时将在0000000C
. 假设$8 == $0
然后pc
应该再次成为00000000
. 因此offset = final_pc - initial_pc = 00000000-0000000C
. 所以,和
immediatevalue
=((FFFFFFF4) >> 4)
的最后2个字节 . 因此,快捷方式:也可以直接计算要转移程序计数器的
words
数,而不是计算这个长度 . 在这里你想要向后3 words
,因此immediate_value = -3 = FFFD
. 如果你想前进而不是后退,这也是正确的 .