アドレッシングモード
x86など多くのアーキテクチャでは、スタックポインタという特殊なレジスタがあり、スタックにデータを置いたり、スタックからデータを取り除いたとき、自動的にインクリメントまたはデクリメントされる。また、スタックのプッシュ/ポップをする際の実効アドレスは暗黙のうちにスタックポインタに格納されているアドレスを使用する。68k、ARM、PowerPC といったアーキテクチャでは、1つ以上のレジスタをスタックポインタとして使用できる。そのため、「自動インクリメント付きレジスタ間接」などのアドレッシングモードが用意されている。
多くの場合、CPUモードの切り替えや割り込みマスク状態の変更には専用の命令があり、対応するビットなどを明示的に指定しない。このことはPopekとGoldbergの仮想化要件を満足させようとする場合、そのような命令をトラップしなければならないハードウェアを単純化できる。すなわち、トラップ処理はオペランド(あるいは最終的な実効アドレス)を調べる必要がなく、命令コードだけを調べればよい。
EDSACなどは、主記憶装置の容量が小さいため、アドレス指定は全て直接であった(命令内にアドレスが書かれていた)。しかし、これでは配列の各要素に同じ演算をするようなループをコーディングすることが困難である。というのは、ループにしたとき毎回違う配列要素にアクセスするには命令を書き換えなければならなかったからである(実際、命令を書き換えてループさせていた)。これに対してManchester Mark Iではインデックスレジスタを実装して命令を書き換えなくても済むようにした。
別の解決方法として、次の命令のオペランドを修飾する命令を持ったマシンも存在した。エリオット・ブラザーズの Elliott 503 や Elliott 803、アポロ誘導コンピュータなどは絶対アドレッシングしか持たず、インデックスレジスタも持っていなかった。従って間接アドレッシングによる分岐やレジスタを使った分岐は命令セットに存在しない。その代わりとして「指定したメモリワードの内容を次の命令に加える」という命令がある。例えば次の命令が JUMP 0 だった場合、メモリから読み込んだ値が 20 だったとすると JUMP 20 に書き換えられる。これによってインデックス付きの分岐命令と同等の効果を得る。なお、命令は実行時に更新されるのであって、メモリ上の内容は書き換えられない。したがってこれは自己書き換えコードではない。指定したメモリ位置の内容が大きい場合、オペランド(アドレス)だけでなく命令コードまで変更することができる。
ベースレジスタがアクセスすべきメモリアドレスを保持している。また、ベースレジスタを省略してインデックスレジスタだけを使う場合もこれにあたる。