假设当前PC为0x00400010(递增后)且目标标签的值为0x00400040。指令中常量的二进制值是什么?
beq $s0, $s0, target
我不确定如何处理这个问题。我将不胜感激,或者解释如何找到解决方案。
答案 0 :(得分:0)
我不确定我是否理解了你的问题。我假设您要求的偏移量将被编码到指令中。
由于目标位于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会自动将该偏移量乘以4,然后返回所需的实际偏移量。