MIPS跳转指令编码:为什么要左移,为什么要保留PC的高4位?

MIPS Jump instruction encoding: why left shifted, and why keep the high 4 bits of PC?

跳转指令中,

  1. 为什么要把26位地址移到28位?
  2. 为什么要把PC最左边的4位加到28位上?

Why do we shift 26-bit address to 28-bit?

当我们将地址移动2位时,跳转指令的参数(地址)可以在0...2^28-1范围内。

如果我们不移动地址,它只能在 0...2^26-1 范围内。

这意味着我们只能使用地址的 1/4 space。

另一方面,不转移地址的表面好处并不是真正的好处:

不移动地址将允许使用不能被 4 整除的地址。但是,因为指令总是位于能被 4 整除的地址,跳转指令到不能被 4 整除的地址是没有意义的。

顺便说一句:其他 CPUs(例如 MC68000)确实使用 16 位 "branch"(跳转)指令,其中低位始终必须为零 - 因此可以使用更多内存如果 CPU 将地址移动一位,则地址。

why do we add the leftmost 4-bit from PC to the 28-bit?

PC寄存器是32位宽,跳转指令只有26位。所以我们必须从其他地方取 6 位:

PC寄存器的低2位始终为零,所以我们还要考虑"left"4位。

如果我们总是将左边的 4 位设置为零,我们只能跳转到位于前 256 MB 内存中的某些代码。

如果我们简单地不修改 PC 的左 4 位,我们可以跳转到与跳转指令本身位于相同 256 兆字节范围内的一些代码。

让我们考虑一个 for()while() 循环:

在这样的循环结束时,有一个跳转到循环开始的指令。

假设程序不一定位于内存的前 256 兆字节中。

更有可能的是:

循环的起点与循环的终点(跳转指令)处于相同的 256 兆字节范围内,或者循环的起点位于内存的前 256 兆字节内?