アドレッシングモード
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/07/04 05:50 UTC 版)
既に使われなくなったアドレッシングモード
以下に挙げるのは、1980年代ごろまで使われていたアドレッシングモードであるが、現在では使われていない。これが全てを網羅しているものではなく、時に応じて様々なアドレッシングモードが使われてきた。例えば、直接アドレス値に複数のインデックスレジスタの論理和を加算するなどといったものもあった。
初期のコンピュータ
EDSACなどは、主記憶装置の容量が小さいため、アドレス指定は全て直接であった(命令内にアドレスが書かれていた)。しかし、これでは配列の各要素に同じ演算をするようなループをコーディングすることが困難である。というのは、ループにしたとき毎回違う配列要素にアクセスするには命令を書き換えなければならなかったからである(実際、命令を書き換えてループさせていた)。これに対してManchester Mark Iではインデックスレジスタを実装して命令を書き換えなくても済むようにした。
別の解決方法として、次の命令のオペランドを修飾する命令を持ったマシンも存在した。エリオット・ブラザーズの Elliott 503[5] や Elliott 803[5][6]、アポロ誘導コンピュータなどは絶対アドレッシングしか持たず、インデックスレジスタも持っていなかった。従って間接アドレッシングによる分岐やレジスタを使った分岐は命令セットに存在しない。その代わりとして「指定したメモリワードの内容を次の命令に加える」という命令がある。例えば次の命令が JUMP 0
だった場合、メモリから読み込んだ値が 20 だったとすると JUMP 20
に書き換えられる。これによってインデックス付きの分岐命令と同等の効果を得る。なお、命令は実行時に更新されるのであって、メモリ上の内容は書き換えられない。したがってこれは自己書き換えコードではない。指定したメモリ位置の内容が大きい場合、オペランド(アドレス)だけでなく命令コードまで変更することができる。
多重メモリ間接
何らかの実効アドレスがメモリ上の領域を示していて、そこに別のメモリ領域のアドレスが格納されていて、さらにその先にまでたどってメモリの内容をとってくるような場合を多重メモリ間接という。例えばMC68020などは二重メモリ間接までは実装していた。その際、いったんメモリアクセスして取ってきたアドレス値にさらにインデックスレジスタやディスプレースメントを加算して第二の実行アドレスを計算するモードが存在した。
TRONCHIPでは「多段間接モード」を持つ。1段の間接参照操作の中で、インデックスレジスタのスケーリングと加算、オフセットの加算、メモリの間接参照、の3動作を行い、これを任意の段数反復することが可能であった。
DEC の PDP-10では、アドレスが18ビット幅でワード長が36ビットであるため、ワード内にポインタとフラグを含めることができる。メモリに格納するワードの中の、間接メモリ参照を許可するフラグを設定することによって自動的に多重メモリ間接が可能であった。この場合、ポインタがループを形成していると永久にループをたどり続けるため、注意が必要である。一般にワード長がアドレス長より長い場合、このような多重間接が可能で、他にも IBM 1620、データゼネラルNovaなどがある。Novaの多重メモリ間接から間接スレッデッドコードの発想が生まれた。
メモリマップド・レジスタ
DEC PDP-10 などは、レジスタがメモリの先頭アドレス部分(0番地付近)を使って実現されていた(つまり、レジスタがメモリ空間にマップされていた)。これを活用すると、小さなループを構成する命令(機械語)をレジスタに並べておくと、高速にループを実行することができた。
後のPDP-11シリーズではレジスタを入出力エリアにマッピングしていたが、これは遠隔診断を意図したものである。
自動インクリメント付きメモリ間接
PDP-8などの初期のミニコンピュータでは、特別なメモリアドレスがいくつかあり、そこにメモリ間接でアクセスすると、メモリの内容をアクセス後に自動インクリメントしたり、自動デクリメントしたりする(アドレスによって異なる)。これを使うとレジスタを使わずにループを実行することが容易になる。
ゼロページとダイレクトページ
Data General Nova、MC6800ファミリ、MOS 6502 ファミリなどは内蔵レジスタ数が非常に少ないアーキテクチャである。そのため、多くの算術命令をメモリ上の値に対して行う。普通にアドレスを指定すると16ビット必要とし、コードの中でアドレス指定に要するメモリ量がかなり大きくなる。
そのため、プロセッサ設計者は「ゼロページ」アドレッシングと呼ばれる緩和手段を実装した。メモリ空間の先頭256バイト($0000 - $00FF; これがすなわちページ "0" である)を1バイトで指定できるアドレッシングモードを用意したのである。インデックス付きもある。これによって命令長が1バイト短縮され、クロックサイクルも1サイクル短縮される。結果としてゼロページはレジスタファイルのような使い方をされた。
6502を発展させた WDC 65816 や MOS 65CE02、MC6809などでゼロページ・アドレッシングが強化され、「ダイレクトページ」アドレッシングとなった。これは、256バイトのゼロページの開始アドレスを専用レジスタで自由に設定できるようにしたもので、それによって複数のソフトウェアがダイレクトページを切り換えて使えるようになった。
ワードを任意サイズのバイトで分けて指定
PDP-10は36ビットのワード長で、1ビットから36ビットまでの任意サイズのバイト単位でメモリを指定する特殊なアドレッシングモードを持つ。18ビットのワードアドレス、ワード内のビット位置、バイトのサイズを指定する1ワードの記述子を使用する。
この記述子を使ってバイト単位でロード・ストアする命令が存在し、記述子が次のバイトを指すようインクリメントする(バイトはワード境界をまたがない)。DECのソフトウェアでは1バイトを7ビット(ASCII)とし、1ワードを5バイトと未使用の1ビットにする記述子を使うことが多かった。C言語では、int 型が char 型の整数倍であるという前提で malloc 関数が成り立っていたため[7]、1バイトを9ビットとし、1ワードを4バイトちょうどにする必要があった。実際何倍なのかはコンパイル時の演算子であるsizeofで決まる。
|
- ^ "How many addressing modes are enough?" by F. Chow, S. Correll, M. Himelstein, E. Killian, L. Weber, all from MIPS Computer Systems, Inc. 1987
"An Overview of the MIPS-X-MP Project" by John L. Hennessy and Mark A. Horowitz 1986: "MIPS-X uses a single addressing mode: base register plus offset. This simple addressing mode allows the computation of the effective address to begin very early" - ^ "Instruction Set Principles: Addressing Mode Usage (Summary)" Archived 2011年9月30日, at the Wayback Machine. by Dr. Sofiène Tahar "3 programs measured on machine with all address modes (VAX)": "displacement mode" and "immediate mode" are used 75% of the time.
"Fundamentals of Computer Design"[リンク切れ] p. 112-113 "Frequency of addressing modes for TI TMS320C54x DSP. The C54x has 17 data addressing modes, not counting register access, but the four found in MIPS account for 70% of the modes. Autoincrement and autodecrement, found in some RISC architectures, account for another 25% of the usage. This data was collected form a measurement of static instructions for the C-callable library of 54 DSP routines coded in assembly language."
"Efficient and Language-Independent Mobile Programs" by Ali-Reza Adl-Tabatabai, Geoff Langdale, Steven Lucco, and Robert Wahbe 1995: "79% of all instructions executed could be replaced by RISC instructions or synthesized into RISC instructions using only basic block instruction combination." - ^ Kong and Patterson. "Instruction set design". 1995. slide 27. [1]
- ^ "Architecture of the RTX 32P" by Philip Koopman 1989
- ^ a b Dave Brooks. "Some Old Computers".
- ^ Bill Purvis. "Some details of the Elliott 803B hardware"
- ^ "C Reference: function malloc()" メモリを確保するサイズをバイト数で指定
- アドレッシングモードのページへのリンク