オペランド部に値そのものを書く、メモリアクセス不要のアドレス指定方式
即値アドレス指定(イミディエイト:immediate)とは、命令のオペランド部に、計算で使う値そのものを直接書き込んでおくアドレス指定方式のことです。オペランド部=命令のうち「何に対して操作するか」を表す部分のことです。
ほかの方式(直接・間接など)ではオペランド部に「値が入っているメモリの番地(住所)」を書きますが、即値方式では番地ではなく値そのものを書きます。アセンブリでは #5 や =5 のように「#」記号を付けて即値であることを示します。
身近な例で言うと、買い物メモに「3階の棚を見て」と書くのが直接指定、「りんご3個」と数量を直接書くのが即値です。後者なら棚を探しに行かなくても、メモを見ただけで数が分かります。上のツールで▶ボタンを押すと、オレンジ色のオペランド部にある値「#5」がメモリを参照せずにそのまま使われる様子が見られます。
即値方式の最大の特徴は、値を取り出すために改めてメモリを読みに行く必要がない点です。命令を取り出した(フェッチした)時点で、使う値も一緒に手元に届いているからです。
オペランド値 = 命令内の値
他の方式と比べると、メモリへのアクセス回数の差がはっきりします。メモリアクセスはCPU内部の処理より時間がかかるため、回数が少ないほど高速です。
・即値:メモリアクセス 0回(命令の中に値がある)
・直接:メモリアクセス 1回(番地の場所を1回読む)
・間接:メモリアクセス 2回(番地を読み、その先をもう1回読む)
即値のメリットをまとめると次のとおりです。
・高速:余分なメモリ読み出しが無いので実行が速い
・シンプル:値の置き場所(番地)を用意しなくてよい
・命令単体で完結:他のメモリ領域に依存しない
身近な例で言うと、レジで「商品番号を調べて棚から取ってくる」のではなく、「その場で 5 個と言えばすぐ計算できる」ようなものです。探しに行く手間がない分、すばやく処理できるわけです。
即値アドレス指定は、あらかじめ値が決まっている「定数」を扱う場面でよく使われます。プログラムを書いた時点で値が分かっているものに向いています。
典型的な用途は次のとおりです。
・カウンタの増減:ループ変数に 1 を足す(ADD R1, #1)
・初期値の設定:レジスタに 0 を入れる(LOAD R1, #0)
・固定値との比較・計算:あらかじめ決まった係数を掛ける
一方で、即値には制約もあります。値が命令語の中に直接書き込まれるため、オペランド部のビット幅に収まる範囲の数しか表せないのです。
・大きすぎる値や、実行中に変化する値には使えない
・変化する値はレジスタやメモリ(直接・間接指定)に置く必要がある
・同じ値を何度も書くとプログラムが冗長になることもある
即値指定は、オペランド部の内容がそのまま処理対象の値になる方式で、メモリアクセスが不要です。「値そのもの=即値、番地=直接・間接」という対比で整理すると分かりやすいです。