ALU(算術論理演算装置)とRead-Modify-Writeのミクロ過程
たった1回の「ADD」命令の裏側で、CPUがメモリと往復しながら行っている3段階の算術処理
第2章では、メモリを書き換える代表的な命令を学びます。 まずは足し算を行う ADD 命令 のお手本を観察しましょう!
0000 番地には ADD.AB #2, $1 と書かれています。 - A(左の値): 足す数の #2 - B(右の値): 足す相手の場所 $1(1つ下の 0001 番地) - 0001 番地のデータ箱には、最初から 3 が入っています。
🎯 やってみよう(編集不要) [STEP] ボタン を1回押して、0001 番地のB値が 3 から 5(3 + 2)に増える瞬間を観察しましょう!
1. CPUの計算頭脳「ALU(算術論理演算装置)」
第2章の幕開けとなるStep 7では、メモリ上の数値を変化させる最も基本的な算術命令『ADD.AB #2, $1』の動きを観察しました。[STEP] ボタンを1回押した瞬間、1つ下の 0001 番地にあったデータ箱のB値が『3』から『5』へと変化しました。
この「3 + 2 = 5」という計算を実際に実行しているCPU内部のハードウェア回路を『ALU(Arithmetic Logic Unit:算術論理演算装置)』と呼びます。前章で学んだプログラムカウンタ(PC)が「次にどの行を読むかを指し示す案内役」だとすれば、ALUは「案内された命令に従って実際に数値を足したり引いたり比較したりする作業場(工場)」です。
ノイマン型コンピュータにおいて、メモリの箱(RAM)自体には足し算をする能力はありません。メモリの箱はただ数値を記憶しているだけの受動的な倉庫です。では、0000 番地の『ADD.AB #2, $1』が実行された1サイクルの間に、CPU(ALU)とメモリの間ではどのようなデータのやり取りが行われたのでしょうか?
[0000] ADD.AB #2, $1 ──(1. Read Source A = 2 & Target B at 0001 = 3)──► ┌─────────┐
│ ALU │ (3 + 2 = 5)
[0001] DAT.F #0, #5 ◄────────(2. Write Result 5 back to 0001.B)────────┘─────────┘2. Read-Modify-Write(読み出し・変更・書き戻し)の3ステップ
画面上では一瞬で『3』が『5』に変わったように見えますが、MARS仮想プロセッサの内部では、1サイクルの中に「Read-Modify-Write(読み出し・変更・書き戻し)」と呼ばれる厳密な3段階のパイプライン処理が走っています。
① Read(オペランドの読み出し):CPUはまず、0000 番地のAフィールドから即値『#2』を取り出します。同時に、Bフィールド『$1(1つ下の0001番地)』を見に行き、そこに現在入っているB値『3』を読み出してALUへ運びます。 ② Modify(ALUでの演算):ALUの内部回路に「2」と「3」が入力され、加算回路によって新しい値「5」が算出されます。 ③ Write(メモリへの書き戻し):算出された「5」を、再び 0001 番地のBフィールドへと送り込み、元の「3」の上から上書き保存(インプレース更新)します。
このように、メモリの値を変化させる命令はすべて「現在の値を読んでから、計算結果を同じ箱へ書き戻す」という往復運動を行っています。だからこそ、元々の値が『0』ではなく『3』であった場合、3が消えて2になるのではなく、3に2が積み重なって『5』になるのです。
3. 修飾子「.AB」が指定する部屋から部屋への配線
命令の後ろについている『.AB』という2文字のアルファベットにも注目してみましょう。第1章で「すべてのメモリの箱にはA(左)とB(右)の2つの部屋がある」と学びました。そのため、CPUが足し算をするときには「コピー元のAとBのどちらの数字を、相手先のAとBのどちらの部屋に足すのか?」を明確に指定する必要があります。
『ADD.AB』の1文字目の『A』は「自分の行のA(左)の部屋の数値(#2)を使う」ことを意味し、2文字目の『B』は「相手先の箱($1)のB(右)の部屋に足し込む」ことを意味します。もしこれが『ADD.A』なら左の部屋同士、『ADD.B』なら右の部屋同士、『ADD.F』なら両方の部屋を同時に足し算します。この修飾子(Modifier)こそが、メモリのどの部屋とどの部屋をALUの配線で繋ぐかを決めるスイッチなのです。
🔒 MISSION CLEAR で講義ノートの全編が解放されます
上段の実験シミュレーターでミッションを達成すると自動的に全編がアンロックされます。(下のボタンから今すぐ全文を先に読むことも可能です)