assembly - MIPS跳转指令编码: why left shifted,为什么保留PC的高4位?

标签 assembly mips cpu-architecture machine-code

在跳转指令中,

  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 的地址空间。

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

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

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

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

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

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

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

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

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

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

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

更有可能的是:

循环的开始与循环的结束(跳转指令)在相同的 256 兆字节范围内,或者循环的开始在前 256 兆字节的内存中?

关于assembly - MIPS跳转指令编码: why left shifted,为什么保留PC的高4位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61065614/

相关文章:

assembly - x86组装-将rax夹紧到[0 .. limit)的优化

assembly - MIPs 程序使用堆栈反转字符串

高速缓冲存储器的组织

c++ - 如何优化和提高这个涉及浮点运算的特定代码的效率?

cuda - 如果IPC为1,GPU的32位ALU在一个周期内可以进行多少次8位运算?

c - 使用内联汇编在 C 中添加值

linux - 我不明白 "and ax, 1111111100000000b"指令在做什么

assembly - 相对跳转超出范围 0020h 字节

assembly - 正确使用CPU寄存器——调度概念

c++ - MIPS 语言中的嵌套和递归过程