MIPS跳转指令编码:为什么要左移,为什么要保留PC的高4位?
MIPS Jump instruction encoding: why left shifted, and why keep the high 4 bits of PC?
跳转指令中,
- 为什么要把26位地址移到28位?
- 为什么要把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 兆字节内?
跳转指令中,
- 为什么要把26位地址移到28位?
- 为什么要把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 兆字节内?