MIPS PC 和标签跟踪

MIPS PC and label tracking

假设当前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 位。在这种情况下,要获得实际的二进制偏移量表示,请从我上面给出的二进制数左侧删除零,直到只剩下用于存储偏移量的位。

编辑(考虑到 Busy Beaver 的评论)

在 MIPS 上,指令似乎对齐到 32 位/4 字节。这允许存储除以 4 所需的实际偏移量(CPU 然后读取偏移量并将其乘以 4 以计算实际目标)。优点是您可以使用给定的位存储更大的偏移量。换句话说,您以这种方式保存了 2 个偏移位。

在您的示例中,PC 应跳转 0x00000030 字节才能到达目标。存储在指令中的偏移量将是 0x00000030 / 4,与 0x00000030 >> 2 相同,即 0x0000000C0。您要求二进制表示:

0000 0000 0000 0000 0000 0000 0000 1100

解码/执行指令时,CPU 会自动将该偏移量乘以四,然后返回所需的实际偏移量。