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

Elm*_*sry 4 assembly mips cpu-architecture machine-code

在跳转指令中,

  1. 为什么要将26位地址移至28位?
  2. 为什么我们要将 PC 中最左边的 4 位添加到 28 位中?

Mar*_*nau 5

为什么要将26位地址移至28位?

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

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

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

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

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

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

为什么我们要将 PC 中最左边的 4 位添加到 28 位中?

PC寄存器为32位宽,跳转指令仅包含26位。所以我们必须从其他地方获取 6 位:

PC寄存器的低2位始终为零,因此我们仍然要考虑“左”4位。

如果我们始终将左侧 4 位设置为零,则只能跳转到位于前 256 MB 内存内的某些代码。

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

让我们考虑一下for()orwhile()循环:

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

我们假设该程序不一定位于前 256 MB 内存中。

更有可能的是:

循环的开始位置与循环结束位置(跳转指令)位于相同的 256 MB 范围内,或者循环的开始位置位于前 256 MB 内存内?