我知道所有MIPS指令都是4个字节长。由于PC包含下一条指令的地址,因此PC的前2位始终为0。 在PC中包含这两个位似乎会缩小PC的范围,那么为什么PC会以这种方式实现呢?
我是计算机架构的新手,所以请指出我对这个概念的理解上的任何差距。
答案 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
为-0x10
或0xFFFFFFF0
。这是字节偏移量,因此我们将其右移两位以产生字偏移量:0xFFFFFFFC
。我们将{16}的低16位用于XXXX
,因此我们有FFFC
因为分支指令使用字偏移而不是字节偏移,所以它们不会“浪费”两个“必须为零”位。他们利用这一点将分支指令 byte 的范围从-32768 to 32767
扩展到-131072 to 131068
。