【问题标题】:Assembly PC Relative Addressing Mode汇编 PC 相对寻址模式
【发布时间】:2016-10-18 00:50:23
【问题描述】:

我正在研究数据路径,并且一直在尝试理解分支指令。

这就是我所理解的。在 MIPS 中,每条指令都是 32 位的。这是 4 个字节。所以下一条指令将在四个字节之外。

就例子而言,我说PC地址是128。我的第一个问题是理解这个128是什么意思。我目前的信念是它是内存中的一个索引,所以 128 是指内存中的 128 个字节。因此,在数据路径中,它总是说要向 PC 添加 4。将 4 位添加到 128 位得到 132,但这实际上是现在的 132 个字节(下一条指令)。我是这样理解的。

在分支等于中,假设偏移量是二进制数 001。我知道我必须扩展符号,所以我会添加零(为了便于阅读,我将省略)。然后你左移两个,结果是 100。这个移位的目的是什么?偏移量实际上是否代表字节,而左移将代表位?如果是这样,将其添加到 PC 对我来说毫无意义。因为如果 PC 指的是字节数,那么添加向左移动 2 的偏移量就是将字节数的偏移量添加到以字节数为单位的 PC 上。如果 PC 128 实际上指的是 128 位,即 32 个字节,那么为什么我们只在其上加 4 来执行下一条指令呢?当它说 PC+4 时,这实际上意味着添加 4 个字节吗?

我的基本问题是 PC 相对寻址的工作原理、PC+4 的含义以及偏移量为何移动 2。

【问题讨论】:

  • “将 4 位添加到 128 位中得到 132” 这在这里完全不相关(尽管在数学上是正确的)。 PC 是 32 位的,你正在向它添加值 4,而不是位大小。而这里“偏移量实际上代表字节,左移将代表位”你再次以混乱的方式进入“位”。位/字节只是考虑一些数值的一种方式,即。值 12 可以表示 12 条指令或 12 字节(3 instr),或者您可以将其视为 1100 位掩码,但它仍然是相同的数字 12。移位在位级别(二进制格式)很容易想象,但是影响价值。 12>>1 = 0110b = 6.

标签: assembly mips pipeline cpu-architecture


【解决方案1】:

左移 n 位相当于将数字乘以 2n。左移 2 位乘以 4。

如果您的分支偏移量左移 2,这意味着您的分支偏移量操作数是整个指令单元,而不是字节。所以一个8个操作数的分支指令意味着,跳转8条指令,也就是32个字节。

MIPS 乘以 4,因为指令总是 32 位。 32 位是 4 个字节。

MIPS 指令保证从可被 4 整除的地址开始。这意味着 PC 的低两位保证始终为零,因此所有分支偏移量保证在低两位中为 00 .因此,在分支指令中存储低两位是没有意义的。 MIPS 设计者试图最大化分支指令可以达到的范围。

PC 的意思是“程序计数器”。程序计数器是当前指令的地址。 PC+4 指的是当前指令后 4 个字节的地址。

分支偏移

MIPS 分支偏移量与大多数处理器一样,是相对于分支之后 指令的地址。立即操作数为零的分支是无操作的,它分支到分支之后的指令。带有符号扩展立即操作数 -1 的分支分支返回到该分支。

分支目标在((branch instruction address) + 4 + ((sign extended branch immediate operand) << 2))

【讨论】:

  • 那么如果它给 PC 的值是 128,加上 4 个字节的结果是 132 对吗?偏移量为 1,左移 2 为 4 (4*1)。如果偏移量是 4,PC+4 是 132,那么新的 PC 是 PC+4+offset,也就是 136。为了这个例子,我正确吗?
  • @user3794422 是的。分支偏移量是相对于紧跟分支的指令的地址,因此分支偏移量为 0 是无操作(它分支到分支之后的指令)。立即操作数为 -1 的分支返回分支(-1
  • 所以我在我的教科书中尝试这个练习问题,说将指令 00010000011001011111111111110100 转换为 MIPS 代码并告诉新的 PC 地址是什么,因为 PC 地址当前是 128。所以我假设 128指字节。我取最后 16 位,即 1111111111110100。自然,这些将被符号扩展,在前面添加 16 个 1 位。无论如何,这个数字是十进制的 -12。它基本上乘以4,所以它是-48。而这添加到 128 会导致地址为 80 对吗?我的推理是否正确?教科书没有给出答案。谢谢。
  • 如果分支指令在地址 128,并且分支的符号扩展立即操作数是-12,那么分支目标在(128 + 4 + (-12 << 2))128 + 4 - 48 所以分支的目标是地址84。请记住,分支偏移量是相对于分支之后的指令地址。
  • 啊,你是对的。 84也是我得到的答案。忘记了+4位。感谢您的帮助。欣赏它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多