命令実行フローの具体例
序論
前節で整理した命令セット、機械語、マイクロコードの関係を具体的に示すため、
ここでは典型的な命令(加算・減算・条件分岐)を例に、
CPU内部のフローをASCII図で可視化する。
本論
1. 加算命令の実行
Instruction: ADD R1, R2 Fetch: PC -> MAR MEM[PC] -> IR Decode: IR[Opcode] -> Microcode (CISC) or IR[Opcode] -> Control Signals (RISC/ARM) Execute: ALU: R1 + R2 -> TEMP Update Flags: Z, N, C, V Writeback: TEMP -> R1 PC = PC + 1
– ADD命令は、レジスタR1とR2を加算し、結果をR1に格納
– フラグ(Zero, Negative, Carry, Overflow)も更新
– CISCではマイクロコードに展開され、RISC/ARMでは直接ハードワイヤで制御
2. 減算命令の実行(2の補数利用)
Instruction: SUB R1, R2 Execute (2's complement): R2 -> invert bits -> R2' R2' + 1 -> -R2 ALU: R1 + (-R2) -> TEMP Update Flags: Z, N, C, V TEMP -> R1
– SUB命令は減算を直接回路で行わず、R2を2の補数にして加算
– 結果とフラグは加算命令と同じ方式で更新される
– これにより、減算回路を作らずに済む
3. 条件分岐命令の実行
Instruction: BNE LABEL ; Branch if Not Equal (Z=0)
Fetch:
PC -> MAR
MEM[PC] -> IR
Decode:
IR[Opcode] -> Check Flags (Z)
Execute:
if Z == 0:
PC -> LABEL
else:
PC = PC + 1
– 条件分岐はフラグ(Zero, Negative, Carry, Overflow)をチェック
– 条件が成立するとプログラムカウンタ(PC)をジャンプ先に変更
– マイクロコードを使うCISCも、ハードワイヤ制御のRISCも基本流れは同じ
4. 流れまとめ(ASCIIフロー)
Fetch -> Decode -> Execute -> Writeback
|
+--> Microcode / Control Signals
+--> ALU Operation
+--> Update Flags
+--> PC increment / Branch
Q&A
Q1. SUB命令はなぜ加算だけで済むのですか?
A1. 2の補数を使うことで、R2の符号を反転し1を足すだけで -R2 となる。
加算回路に通すことで減算と同じ結果が得られる。
Q2. 条件分岐はどうやって決定されますか?
A2. 実行前のフラグ(Z, N, C, V)をチェックし、条件が成立した場合にPCを書き換える。
Q3. CISCとRISCで流れは違いますか?
A3. 基本フローは同じ(Fetch→Decode→Execute→Writeback)。
CISCは複雑命令をマイクロコードに分解して制御信号を出す。
RISC/ARMは命令を直接ハードワイヤで制御する。