2017-09-23 173 views
0

假设当前的PC是0x00400010(增量后)并且目标标签的值为0x00400040。指令中常量的二进制值是多少?MIPS PC和标签跟踪

beq $s0, $s0, target 

我不太确定如何解决这个问题。我希望有一个提示,或解释如何找到解决方案。

+1

*指令中常量的二进制值是什么?* - 什么常数? – Marco

+0

我不确定它是什么意思,当它要求的常数 – Andre

+1

的二进制值请你更具体,因为我不明白你面临的问题?你不明白'beq'是做什么的?你不明白PC发生了什么?有什么问题? – Marco

回答

1

我不知道我是否理解你的问题。我假设你要求的是将被编入指令的偏移量。

由于目标位于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会自动相乘,通过四个偏移和这样回来的真正所需的偏移。

+2

嗯,我不认为这会发生。如果两个寄存器相等,并且在偏移'offset << 2'的PC的情况下,则beq $ s,$ t,offset'分支。所以如果'target'是'0x00400040',那么nPC会变成PC +(0x00400040)<< 2' – Marco

+1

@BusyBeaver感谢您的评论和+1。正如我所说的,我不知道MIPS,但很明显,指令必须与那里的4个字节对齐。我会相应地编辑我的答案。 – Binarus