假设当前PC为0x00400010 (增量后),并且目标标签的值为0x00400040。指令中常量的二进制值是多少?
beq $s0, $s0, target我不太清楚该如何处理这个问题。我希望你能给我一个提示,或者解释一下如何解决这个问题。
发布于 2017-09-23 08:29:53
我不确定我是否理解你的问题。我假设您要求的偏移量将被编码到指令中。
由于目标位于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字节才能到达目标。然后,存储在指令中的偏移量将是0x00000030 / 4,与0x00000030 >> 2相同,后者是0x0000000C0。您要求使用二进制表示:
0000 0000 0000 0000 0000 0000 0000 1100在解码/执行指令时,CPU会自动将偏移量乘以4,这样就可以得到所需的实际偏移量。
https://stackoverflow.com/questions/46374911
复制相似问题