ADSP-2191はロード・ストア・アーキテクチャーです。と、いうことはデータをメモリーから持ってくる方法はロード・ストア命令に固有に結びついています。以前のCISCでは演算命令のオペランド取得方法の一つがメモリー・アクセスであり、アドレッシング・モードはプロセッサを性格付ける重要な要素でした。ADSP-2191では演算のオペランドはレジスタだけです。
その代わりに、ADSP-2191はロード・ストア命令を演算と同時に実行できます。この強力な機能はADSP-2191の設計全体を貫く信号処理重視主義の結果です。そして、同時に信号処理「だけ」重視する結果として、ADSP-2191のアドレッシングはかつてのCISCからみると見る影も無いほど貧弱です。
強力且つ貧弱なADSP-2191のアドレッシングを理解するにはたった二種類のレジスタ間接アドレッシング方式と、それとは独立なアドレッシング・モードを二つだけ把握すれば十分です。それ以外は刺身のつまみたいなものです。このページではアドレッシング方式を説明します。
いきなり日本語に訳せない言葉です。しかも例によってセンスありません。「後でモディファイする。アップデート付き」。意味がわかりません。modifyって辞書を引くと「修正する、変える」とあります。同語反復です。ちょっと違うか。アナログデバイセズの資料を読むと「後更新」とあります。
Post-Modify with updateとは、一般のプロセッサが「ポスト・インクリメント」と呼んでいるアクセス方式によく似ています。つまり、あるレジスタを使ってメモリー・アクセスを行った後、そのレジスタの値を増やすのがポスト・インクリメントですが、Post-Modify with updateはIxレジスタの値でメモリー・アクセス後、指定したMxレジスタの値をIxレジスタに足します。Mxレジスタの値は負の値でもかまいません。あんまりひねった名前にせずに「ポスト・インクリメント・アクセス」と呼んだほうがわかりやすかったと思いますがいかがでしょうか。
IxとMxは同じDAGの中であれば自由に組み合わせてかまいません。つまり、以下のような例は許されます。
ax0=dm(I0+=M1); // DAG1のレジスタによるアクセス ax0=dm(I7+=I6); // DAG2のレジスタによるアクセス
しかし以下のような例は許されません。
ax0=dm(I0+=M7); // DAG1のIxレジスタをDAG2のMxレジスタで修飾している ax0=dm(I7+=I0); // DAG2のIxレジスタをDAG1のMxレジスタで修飾している
実際の動作を考えるために次のような例を見てみましょう。
// プログラム実行時点で0x8000番地には0x1234が、 // 0x8001番地には0x5678が格納されていると仮定する m0=1; i0=0x8000; a0=dm(i0+=m0); // 実行後、ax0には0x1234が入っている。i0の値は0x8001に変化している。
Ixレジスタはどのようなアクセスにおいても常にベースアドレスを提供します。それに対してMxレジスタは常に修飾量(更新値やオフセット)を与えます。それゆえIndex、Modifierの頭文字からレジスタ名をつけています。
これまたセンスの無い名前です。変更するのかしないのかどっちだと言いたくなります。アナログデバイセズの資料を読むと「前修飾」とあります。苦心してます。
Pre-Modify without updateとは一般のプロセッサが「オフセット付き」と呼んでいるアクセス方式です。つまり、Ixレジスタの値にMxレジスタの値を足した値をメモリー・アドレスとしてアクセスします。アクセス後、Ixの値は変わりません。
IxとMxは同じDAGの中であれば自由に組み合わせてかまいません。つまり、以下のような例は許されます。
ax0=dm(I0+M1); // DAG1のレジスタによるアクセス ax0=dm(I7+I6); // DAG2のレジスタによるアクセス
一目見てわかるように、規則はPost-Modify with updateと同じです。したがって、DAG1とDAG2のIxとMxを組み合わせることはできません。
実際の動作を考えるために次のような例を見てみましょう。
// プログラム実行時点で0x8000番地には0x1234が、 // 0x8001番地には0x5678が格納されていると仮定する m0=1; i0=0x8000; a0=dm(i0+m0); // 実行後、ax0には0x5678が入っている。i0の値は0x8000のまま
すでに述べたようにこの二つのアクセス方式がADSP-2191のメモリー・アクセスの最も重要な方法です。