Elm*_*sry 4 assembly mips cpu-architecture machine-code
在跳转指令中,
为什么要将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 内存内?