我正在练习根据 Mips 参考表将 Mips 指令(beq $t5, $s0, loop)转换为二进制,并且有一系列指令(PC=PC + 4 + 分支地址)用于计算“I”类型指令,它一直引用“PC”。
PC指的是什么?似乎我应该寻找“循环”标签存储在内存中的位置 - :特别是找到那个内存地址。
我正在练习根据 Mips 参考表将 Mips 指令(beq $t5, $s0, loop)转换为二进制,并且有一系列指令(PC=PC + 4 + 分支地址)用于计算“I”类型指令,它一直引用“PC”。
PC指的是什么?似乎我应该寻找“循环”标签存储在内存中的位置 - :特别是找到那个内存地址。
英特尔架构将此称为指令指针,而不是程序计数器。任何一个名称都指的是同一件事:一个寄存器,用于标识处理器要执行的当前/下一条指令的地址。
在时钟周期开始时过度简化一点(即假设是非流水线处理器),PC 保存将在时钟周期内执行的指令的地址,也就是当前指令。在时钟周期结束时,PC 寄存器被更新以保存将在下一个时钟周期执行的指令的地址。
PC = PC + 4
add
描述了由,和未采用的条件分支所使用的顺序执行addi
:它表示下一个PC 将引用当前指令之外 4 个字节的指令——对于(正常)顺序流,PC 前进 4一次字节。
这个表达式PC = PC + 4 + branch address
有点用词不当——它应该说PC = PC + 4 + offset
offset 是 I-Type 指令中的立即数,更具体地说是带符号的(符号从 16 位扩展到 32 位)立即数 * 4。
在这个公式中,PC
右边的=
指的是当前指令:指令的地址beq
,而PC
左边的 指的是在之后要执行的下一个beq
PC 。这个公式描述了执行分支时接下来要执行的指令地址,因为这是一个条件分支(如果没有执行分支,则PC = PC + 4
描述顺序执行)。
对于条件分支,立即数 -1 的值将跳转到自身,0 将跳转到下一条指令,1 将向前跳过一条指令。