假设当前 PC 为 0x00400010(增量后),目标标签的值为 0x00400040。指令中常量的二进制值是多少?
beq $s0, $s0, target
我不太确定如何处理这个问题。我将不胜感激提示或解释如何找到解决方案。
假设当前 PC 为 0x00400010(增量后),目标标签的值为 0x00400040。指令中常量的二进制值是多少?
beq $s0, $s0, target
我不太确定如何处理这个问题。我将不胜感激提示或解释如何找到解决方案。
我不确定我是否理解了你的问题。我假设您正在询问将被编码到指令中的偏移量。
由于目标位于 0x00400040 且当前 PC 位于 0x00400010,因此偏移量可能为 0x00000030(因为 0x00400040 - 0x00400010 = 0x00000030)。这可以很容易地转换成您要求的二进制格式:
0000 0000 0000 0000 0000 0000 0011 0000
但请注意,我不知道 MIPS。在某些处理器架构中,编码到指令中的偏移量是
(target PC) - ((current PC) + (size of current instruction))
由于我不知道 MIPS,所以我不知道beq
指令的字节大小是多少。因此,我无法计算这种情况的偏移量。如果您告诉我beq
指令的大小,我将对该答案进行编辑并添加。
此外,在大多数处理器架构中,大多数指令的相对偏移量都会受到限制。再说一次,我不知道 MIPS,但很有可能偏移量被限制在 16、12 甚至 8 位。在这种情况下,要获得实际的二进制偏移表示,请从我上面给出的二进制数的左侧删除零,直到只剩下用于存储偏移的位。
编辑(考虑到忙碌的海狸的评论)
在 MIPS 上,指令似乎与 32 位 / 4 字节对齐。这允许存储除以 4 所需的实际偏移量(然后 CPU 读取偏移量并将其乘以 4 以计算实际目标)。优点是您可以使用给定的位存储更大的偏移量。换句话说,您以这种方式保存了 2 个偏移位。
在您的示例中,PC 应按字节跳转0x00000030
以到达目标。那么存储在指令中的偏移量将与which 0x00000030 / 4
is 相同。您要求二进制表示:0x00000030 >> 2
0x0000000C0
0000 0000 0000 0000 0000 0000 0000 1100
在解码/执行指令时,CPU 会自动将该偏移量乘以四,这样就可以得到所需的实际偏移量。