命令実行フローの具体例

命令実行フローの具体例

序論

前節で整理した命令セット、機械語、マイクロコードの関係を具体的に示すため、
ここでは典型的な命令(加算・減算・条件分岐)を例に、
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は命令を直接ハードワイヤで制御する。