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 会自动将该偏移量乘以四,然后返回所需的实际偏移量。
假设当前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 会自动将该偏移量乘以四,然后返回所需的实际偏移量。