通常,处理一条指令包括多个操作。将它们组织成某个特殊的阶段序列,即使指令的动作差异很大,但所有指令都遵循统一的序列。每一步的具体处理取决于正在执行的指令。
一条指令的处理可以划分为以下六个阶段:
- 取指(fetch):取指阶段从内存读取指令字节,地址为程序计数器(PC)的值。从指令中抽取出指令指示符字节的两个四位部分,称为icode(指令代码)和ifun(指令功能)。它可能取出一个寄存器指示符字节,表明一个或两个寄存器操作数指示符rA和rB。还可能取出一个8字节的常数valC。
- 译码(decode):译码阶段从寄存器文件读入最多两个操作数,得到valA或(和)valB。通常读入指令rA和rB字段指明的寄存器。
- 执行(execute):在执行阶段,算术/逻辑单元要么执行指令指明的操作(根据ifun的值),计算内存引用的有效地址,有么增加或减少栈指针。得到的值称为valE。也可能设置条件码。
- 访存(memory):访存阶段可以将数据写入内存,或者从内存读出数据。读出的值为valM。
- 写回(write back):协会阶段最多可以写回两个结果到寄存器文件。
- 更新PC(PC update):将PC设置成下一条指令的地址。
OPq rA,rB 的执行阶段:
阶段 | 操作 |
---|---|
取指 | i c o d e : i f u n ← M 1 [ P C ] icode:ifun\leftarrow M_1[PC] icode:ifun←M1[PC] r A : r B ← M 1 [ P C + 1 ] rA:rB\leftarrow M_1[PC+1] rA:rB←M1[PC+1] v a l P ← P C + 2 valP \leftarrow PC+2 valP←PC+2 |
译码 | v a l A ← R [ r A ] valA \leftarrow R[rA] valA←R[rA] v a l B ← R [ r B ] valB \leftarrow R[rB] valB←R[rB] |
执行 | v a l E ← v a l B O P v a l A valE \leftarrow valB \quad OP \quad valA valE←valBOPvalA |
访存 | N o n e None None |
写回 | R [ r B ] ← v a l E R[rB] \leftarrow valE R[rB]←valE |
更新PC | P C ← v a l P PC \leftarrow valP PC←valP |