我需要编码以下beq
指令:
...
start: addu $8, $9, $10
addiu $8, $8, 0x00FF7A01
beq $8, $0, start
...
我知道它是一个J
格式指令,所以除法将是6位操作码,6位是目标地址。 beq
操作码为000100
,因此我已经0001000100000000
,但我不知道如何找到剩下的16位,有什么帮助?
答案 0 :(得分:2)
在MIPS中,在beq
期间,要添加到program counter
的偏移量计算如下:
signextend immediate value
offset = (immediate value) << 2
新PC计算如下:
pc += offset
此处,在您的代码中,如果pc
,您希望将3
移回12字节或$8 == $0
指令。因此,要将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
。如果你想前进而不是后退,这也是正确的。
答案 1 :(得分:2)
执行beq $8, $0, start
时,PC
包含下一条指令的地址。如果$8
和$0
的内容不相等,则不会跳转,这意味着PC
的值不会发生变化。
但如果$8
和$0
的内容相同,则您希望跳转到标签start
。换句话说,你想要的是这个 - 你希望PC
包含指令addu $8, $9, $10
的地址。
因此,需要计算电脑的当前值与跳跃时
跳转指令数= 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位相对地址]