汇编PC相对寻址模式

标签 assembly mips pipeline cpu-architecture

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

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

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

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

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

最佳答案

左移 n 位与将数字乘以 2n 是一样的。左移 2 位乘以 4。

如果您的分支偏移量左移 2,则意味着您的分支偏移量操作数位于整个指令单元中,而不是字节中。所以一 strip 有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相对寻址模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40097829/

相关文章:

assembly - NES游戏开发: ASM6 tutorials?

assembly - CPU 从用户模式切换到内核模式 : What exactly does it do? 它是如何进行这种转换的?

c++ - 将 MIPS 代码移植到 x86_64 时的浮点差异

PowerShell:有没有办法获取通过管道传输到函数中的对象总数?

c++ - fork() 2 children with pipeline, wait() 时出错

assembly - 切换到保护模式并进行远跳转后出错

linux - Linux AMD64 中如何使用 fs/gs 寄存器?

arrays - MIPS addi 指令到数组基数

java - Mars MIPS 模拟器无法运行,安装有问题吗?

python - 将 n_features_to_select RFE 设置为管道中的百分比