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

问题描述 投票:0回答:1

在跳转指令中,

  1. 为什么我们将26位地址转换为28位?
  2. 为什么我们将PC中最左边的4位添加到28位?
assembly mips cpu-architecture machine-code
1个回答
0
投票

为什么我们将26位地址转换为28位?

当我们将地址移位两位时,跳转指令的参数(地址)可以在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 MB范围内的某些代码。

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

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

假定程序不必位于前256 MB内存中。

更有可能:

循环的开始与循环的末尾(跳转指令)在相同的256 MB范围内,还是循环的开始在内存的前256 MB之内?

© www.soinside.com 2019 - 2024. All rights reserved.