2021:アドレッシングモード

 メモリと汎用レジスタ間のデータをやり取りするためには対象となる汎用レジスタの番号と対象となるメモリの番地指定が必要になる。ここではメモリの番地を指定する方法について整理する。

LD Rd,[const] 絶対番地指定:メモリの番地を定数で指定する形式。定数は命令列中に埋め込まれる。操作対象の番地は静的に決まる。

LD Rd,[Rx] インデックスレジスタによる指定: メモリの番地を別のレジスタで指定する形式。インデックスレジスタが汎用レジスタではないプロセッサもある。

LD Rd,[Rb+Rx] 2つのインデックスレジスタによる指定: 1つは例えば配列を格納する領域の先頭を示すベースレジスタとして、加算するインデックスレジスタは配列の添字相当として使う。

LD Rd,[Rb+const] インデックスレジスタ+定数による指定: 2つのインデックスレジスタによる指定のバリエーションで、例えば配列の特定の要素を扱う。

LD Rd,[PC+const] プログラムカウンタ相対指定。参照するデータは現在の命令位置からのオフセット。これはデータが命令列に含まれていることが前提になる。決まった論理アドレス上で動くユーザープログラムならば絶対番地指定で置き換え可能。

インデックスレジスタのインクリメント/デクリメント指定 メモリを参照する命令を実行する前、もしくは実行した後でインデックスレジスタの値を増減する。連続した領域のアクセスやインデックスレジスタをスタックポインタとみなした操作に便利だが、複数命令で実現できるので命令を短縮できる以上の効果はない。また、増減する値は対象となるデータの幅によって1バイトデータなら+1、4バイトデータなら+4といったように変化する。

 これらのアドレッシングモードで指定するアドレスは実効アドレス(Effective Address)と呼ばれる。実効アドレスの計算のみ行い、その値を汎用レジスタに格納するLEA命令を持つプロセッサもある。
 間接アドレッシングモードは指定した番地に格納してある値を実効アドレスとして使用する。メモリアクセスが発生するためロードストアアーキテクチャでの実現は向かない。
 メモリをアクセスする番地のアライメントについて。実効アドレスに関してアライメントがチェックされるのが通常で、2つのインデックスレジスタや定数それぞれでのアライメントチェックを行う例は知らない。LD Rd,[Rb+Rx]の形式でRb,Rxそれぞれがアライメント境界を跨いでいるが加算すればアライメントが揃っている、という状態は気にすべきだろうか?

 メモリ空間は命令列が並んでいる空間とプログラムが操作するメモリ上のデータ領域に加え、メモリオーダリングやキャッシュの有効/無効といった属性を与えたI/O空間などの定義があれば便利。i8080ではメモリ、スタック、I/O空間を区別して扱える。SPARCではASI番号でメモリ空間を区別するよう定義されている。特別なプロセッサの状態は専用レジスタから汎用レジスタに転送して操作することがあるが、メモリ空間の特別な位置に定義してしまえば特殊な命令を用意することなくロードストア命令で扱うことができる。


以上から考えた必要なもの:
・LD [Rb+Rx]、LD[Rb+const]が基本。(Rbがゼロレジスタ指定可能ならなお好都合)
・メモリ空間の定義とその参照方法

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント