コンピューターの心臓部であるCPU(中央演算処理装置)が効率的に動作するためには、メモリとのデータのやり取りを正確に行う必要があります。

その橋渡し役として重要な役割を担っているのが、アドレスレジスタ、一般的にはメモリアドレスレジスタ(MAR)と呼ばれるコンポーネントです。

普段私たちが意識することはありませんが、プログラムが実行される裏側では、このMARが絶え間なくメモリ上の「住所」を指し示しています。

本記事では、アドレスレジスタ(MAR)の基本的な定義から、具体的な仕組み、そして混同されやすいプログラムカウンタとの違いについて、初心者の方にも分かりやすく解説します。

アドレスレジスタ(MAR)とは何か

アドレスレジスタ(MAR:Memory Address Register)とは、CPU内部にある高速な記憶装置(レジスタ)の一種で、次に読み書きするメモリ上のアドレス(番地)を保持するためのものです。

コンピューターのメモリは膨大な数の区画に分かれており、それぞれの区画には固有の番号である「アドレス」が割り振られています。

CPUが「特定のデータを読み込みたい」あるいは「計算結果を特定の場所に書き込みたい」と考えたとき、その対象となるメモリアドレスを一時的に格納する場所がMARです。

MARは、CPU内部のバスと外部のメインメモリを繋ぐ「アドレスバス」に直結しています。

そのため、MARに値がセットされると、その値がそのままアドレス信号としてメモリへと送られる仕組みになっています。

MARの物理的な位置づけ

ハードウェアの構成上、MARはCPUの制御ユニット(コントロールユニット)と密接に連携しています。

CPUが命令を実行するプロセスにおいて、MARは情報の出入り口となる「ゲート」のような役割を果たします。

このレジスタのビット幅は、そのコンピューターが直接アクセスできる最大メモリ容量を決定する重要な要素となります。

例えば、MARが32ビットであれば2の32乗(約4GB)のアドレス空間を扱え、64ビットであればさらに広大な領域を扱うことが可能です。

アドレスレジスタ(MAR)の仕組みと動作の流れ

MARがどのように機能しているのかを理解するためには、CPUがメモリからデータを取得する「フェッチ(取り出し)」の工程を見るのが一番の近道です。

具体的なステップは、以下の順序で進められます。

1. アドレスの転送

まず、実行すべき命令のアドレスを管理している「プログラムカウンタ(PC)」などの他のレジスタから、MARへとアドレス情報がコピーされます。

この段階では、まだメモリへのアクセスは開始されておらず、準備が整った状態です。

2. アドレスバスへの出力

MARに格納されたアドレス情報は、アドレスバスを通じてメインメモリへと送出されます。

制御ユニットはこのタイミングで、「読み込み」または「書き込み」の信号をメモリに対して発行します。

3. メモリ側の応答

メモリはアドレスバスから受け取った番号に基づき、該当する場所を特定します。

読み込み命令の場合、その場所にあるデータがデータバスを通じてCPU側へ返却されます。

このとき、受け取ったデータ自体はMARではなく、メモリデータレジスタ(MDR)という別のレジスタに格納されます。

動作をイメージする例

この一連の流れを「図書館」に例えると分かりやすくなります。

図書館(メモリ)にある本(データ)を借りたいとき、利用者は「本の請求番号(アドレス)」をメモに書きます。

この「請求番号を書いたメモ」を保持しているのがMARです。

司書はそのメモを見て棚へ向かい、本を持ってきてくれますが、受け取った「本そのもの」は別の机(MDR)に置かれることになります。

プログラムカウンタ(PC)との違い

アドレスレジスタ(MAR)と非常によく似た役割を持つものに「プログラムカウンタ(PC)」があります。

どちらもメモリアドレスに関連するため混同されがちですが、その役割と目的は明確に異なります。

プログラムカウンタ(PC)の役割

プログラムカウンタは、次に実行すべき命令のアドレスを記憶しているレジスタです。

プログラムの進行具合を管理するのが目的であり、命令が一つ実行されるたびに自動的にカウントアップされます。

アドレスレジスタ(MAR)の役割

これに対し、MARは「今まさにアクセスしようとしているアドレス」を保持します。

PCが「次に何をすべきか」という将来の予定を指しているのに対し、MARは「今どこからデータを取ってくるか」という現在の操作を指しています。

両者の関係性を比較した表

以下の表は、PCとMARの主な違いをまとめたものです。

項目プログラムカウンタ(PC)アドレスレジスタ(MAR)
保持する内容次に実行する命令のアドレス現在アクセス対象のメモリ番地
更新のタイミング命令のフェッチ完了後メモリアクセスが発生する都度
接続先CPU内部の加算器などアドレスバス(メモリ直結)

実際の動作では、まずPCの内容がMARにコピーされ、その後にMARがメモリへアドレスを伝えます。

つまり、PCは司令塔、MARは実行役という関係性になります。

メモリデータレジスタ(MDR)との連携

MARを語る上で欠かせないのが、対となる存在であるメモリデータレジスタ(MDR)です。

MDRは、メモリバッファレジスタ(MBR)とも呼ばれます。

MARが「場所(どこ)」を指定するのに対し、MDRは「内容(何)」を保持します。

読み込み時の動作

CPUがメモリからデータを読み出すとき、MARにアドレスをセットすると、メモリから読み出されたデータがMDRに格納されます。

CPUはその後、MDRの中身を演算用のレジスタ(アキュムレータなど)へと移動させて計算を行います。

書き込み時の動作

逆にデータをメモリに書き込むときは、書き込み先のアドレスをMARにセットし、書き込みたいデータ本体をMDRにセットします。

その後、書き込み信号を送ることで、MDRの内容がMARの示すアドレスへと転送されます。

このように、MARとMDRは住所と荷物の関係のようにペアで動作し、メモリとCPUの間のデータ転送を実現しています。

命令サイクルにおけるMARの具体例

より深く理解するために、単純な加算命令(例:特定のメモリ番地の値を足す)がどのように実行されるか、MARの動きを追ってみましょう。

ここでは、擬似的なアセンブリコードのような流れを想定します。

asm
; メモリのアドレス 1000番地 にあるデータを読み込み、レジスタに加算する例
1. PCが 1000 を指す
2. MAR <- PC (MARに 1000 がセットされる)
3. メモリの 1000番地 からデータが読み出され、MDRに格納される
4. MDRの内容(データ)が演算器に送られる
5. 加算が実行される

このように、一つの命令を実行するだけでも、MARは必ず経由されることになります。

もしMARが存在しなければ、CPUはどのデータに対して操作を行えばよいのかをメモリに伝える手段を失ってしまいます。

現代のプロセッサにおけるアドレス管理

現代の高性能なプロセッサでは、MARの仕組みはより複雑化しています。

特に重要なのが、物理アドレスと論理アドレスの使い分けです。

仮想メモリとMAR

OSが管理する仮想メモリシステムでは、プログラムが扱う「論理アドレス」を、実際のチップ上の「物理アドレス」に変換する必要があります。

この変換を行うのはメモリ管理ユニット(MMU)というコンポーネントです。

MARには、最終的にMMUによって変換された実際の物理アドレスがセットされることになります。

キャッシュメモリの影響

また、現代のCPUはメインメモリに直接アクセスする前に、L1、L2といったキャッシュメモリを確認します。

この際も、どのアドレスのデータがキャッシュにあるかを特定するために、MARと同様の仕組みが内部的に使われています。

パイプライン処理が行われる最新のCPUでは、複数のMARが並列的に動作しているような高度な構造が採用されている場合もあります。

まとめ

アドレスレジスタ(MAR)は、CPUがメモリと通信するために不可欠な「住所管理用の窓口」です。

「次に実行する場所」を指すプログラムカウンタ(PC)から情報を受け取り、それを「今アクセスする場所」としてアドレスバスへ送り出すのがその主な任務です。

また、データの本体を扱うメモリデータレジスタ(MDR)と連携することで、読み書きのプロセスを完結させています。

コンピューターの性能やメモリの最大容量を支える基礎的な概念として、MARの役割を正しく理解しておくことは、ハードウェアの仕組みを学ぶ上で非常に重要です。

一見地味な存在ではありますが、MARは私たちが実行するすべての命令を正しい場所に届けるための、極めて重要な役割を果たし続けているのです。