存储在MIPS PC中的值

时间:2016-10-07 20:25:45

标签: mips cpu-architecture

我知道所有MIPS指令都是4个字节长。由于PC包含下一条指令的地址,因此PC的前2位始终为0。 在PC中包含这两个位似乎会缩小PC的范围,那么为什么PC会以这种方式实现呢?

我是计算机架构的新手,所以请指出我对这个概念的理解上的任何差距。

1 个答案:

答案 0 :(得分:2)

mips [32位]架构只能有32位地址。这意味着4GB的地址空间。因此,一个32位宽且使用字节寻址的PC可以在该空间中寻址任何

您所考虑的是,而不是包含字节地址的PC,其中最右边的两位始终为零,因为指令必须是4字节/字对齐,并且似乎是“浪费了“,为什么不让PC包含一个地址,该地址将被移位两位以产生一个34位地址。这将超过16GB。

但是,这将超过mips内存系统能够解决的问题。因此,没有任何结果,因为它不能使用更宽的结果地址,因为它超出了体系结构的可寻址性。因此,对于字节地址,没有真正浪费。

整个32位/ 4GB地址空间的所有地址计算都适合32位宽的寄存器。在64位架构中,寄存器为64位,可以跨越更大的范围。

所以,无论如何,PC本身包含字节地址,但是......

...您的想法可以使用 的地方是在分支指令中编码目标偏移时。它们的形式如下:

00000000     beqz    $t0,XXXX
00000004     nop

mips与其他架构有些独特:

XXXX是相对于PC + 4签名的 16位偏移量。在这种情况下,PC + 4是0x00000004。我们将XXXX符号扩展为32位。然后,我们将它移位两位。然后,我们将其添加到PC + 4以获取分支的最终目标地址。 “我们”是指mips分支指令硬件。

考虑我们有以下程序片段的反向:

00000000            nop
00000004:           nop
00000008    loop:   nop
0000000C            nop
00000010            nop
00000014            beqz    $t0,loop
00000018            nop

为了在分支指令中得到XXXX的正确值,汇编器获取标签loop:的地址并从中减去PC + 4以产生相对字节偏移量。此处,loop的地址为0x00000008,PC + 4的地址为0x00000018,因此我们0x08 - 0x18-0x100xFFFFFFF0。这是字节偏移量,因此我们将其右移两位以产生偏移量:0xFFFFFFFC。我们将{16}的低16位用于XXXX,因此我们有FFFC

因为分支指令使用偏移而不是字节偏移,所以它们不会“浪费”两个“必须为零”位。他们利用这一点将分支指令 byte 的范围从-32768 to 32767扩展到-131072 to 131068