竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS RISCのアドレッシングモード

<<   作成日時 : 2012/04/24 02:54   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

 RISCはメモリをアクセスする番地を指定するのに汎用レジスタ+オフセット程度しか使わない。

 メモリを参照する方式をアドレッシングモードと呼び、この時計算されるアドレスをEffective Address等と呼ぶ。
 CISC系はアドレッシングモードにレジスタ+即値の他にレジスタの中の値を使ったり(間接アドレッシング)、参照の前後にインクリメント/デクリメントしたりと多彩だった。RISCではアドレスの計算は基本的に整数演算命令で行う。また、同じアーキで32bit→64bitに拡張されてもアドレッシングモードはほとんど変わらない。(SPARC V8→SPARC V9でASIの即値指定が拡張されたくらい?)
 一般的にアドレス参照に使う汎用レジスタをベースレジスタ、それに対するオフセットをインデックスレジスタと呼ぶ。

 アドレッシングモードが単純な順番で調べてみた。

※PA-RISCに追記


□MIPS
レジスタ+即値しかない。ゼロレジスタあり。

LD rt, offset(base)
baseは汎用レジスタ
offsetは16bitを符号拡張したもの。


□Alpha
レジスタ+即値しかない。アドレス計算した値をレジスタに転送する命令がある。ゼロレジスタあり。

LDx Ra.wq,disp.ab(Rb.ab)
va ← {Rbv + SEXT(disp)}
dispは16bitで、符号拡張される。

LEA(Load Effective Address)相当の命令LDA,LDAHがある。

LDA Ra.wq,disp.ab(Rb.ab)
va ← {Rbv + SEXT(disp)}
LDAH Ra.wq,disp.ab(Rb.ab)
va ← {Rbv + SEXT(Memory_disp*65536)}


□SPARC V9
基本はレジスタ+レジスタ、レジスタ+即値で指定する。ゼロレジスタあり。

ld %Rd,[%Rs1+%Rs2]
ld %Rd,[%Rs1+simm13]
simm13は13bitで、64bitに符号拡張する。

SPARCはASI(Alternative Space Identifier)レジスタで別空間を指定できる。これにより物理メモリアクセスやキャッシュメモリの診断アクセスなどができる。%asiレジスタと即値で指定できる。ASI空間は0x00-0xffの8bit幅。

lda %Rd,[%Rs1+%Rs2],imm_asi
lda %Rd,[%Rs1+simm13] ← %asiレジスタの内容を使用する。


□PA-RISC
レジスタ+即値、レジスタ+レジスタだが即値のバリエーションが多い。ゼロレジスタを持つ。

1. Loads and Stores, Load and Store Word Modify, Load Offset
b(ベース)+imm14(即値14bit)
2. Load and Store Word Modify (Complement)
b(ベース)+imm11a(即値11bit)
3. Load and Store Doubleword
b(ベース)+imm10a(即値10bit)
4. Indexed Loads
b(ベース)+x(インデックス)
5. Short Displacement Loads/6. Short Displacement Stores
b(ベース)+imm5(即値5bit)

ベースレジスタの値を更新できる。アセンブラ表記ではコンプリータで指定。
ベース+即値、ベース+インデックスの値をベースレジスタに反映できる。
pre-decrement or post-increment,post-decrement or pre-incrementがある。

ベースレジスタの更新とDestinationに設定されたレジスタの番号が同じ場合は、Effective Addressで指定された番地の内容がロードされる。
If base register modification is specified and b = t, GR t receives the aligned word at the
effective address.



□POWER
レジスタ+即値、レジスタ+レジスタ、アドレスの更新がある。ベースレジスタにR0を指定した場合はゼロ扱い。

lbz RT,D(RA)
RAはベースレジスタ、Dは即値16bit。RA=0の時はR0の値ではなくゼロを使う。

lbzx RT,RA,RB
RA+RBで指定する。RA=0の時はR0の値ではなくゼロを使う。

lbzu RT,D(RA)
アップデート形式。RA+Dでアドレスを指定し、そのアドレスの値をRAにセットする。
RA=0の時とRA=RTの時はInvalid。
LEA(Load Effective Address)相当としても使える。

lhzux RT,RA,RB
アップデート形式。RA+RBでアドレスを指定し、そのアドレスの値をRAにセットする。
RA=0の時とRA=RTの時はInvalid。
LEA(Load Effective Address)相当としても使える。


□AArch64 ※まだ確定ではない
レジスタ+即値。アドレスを反映するPre-indexed/Post-indexedがある。ゼロレジスタを持つ。

通常
[base,#simm9]
ベースレジスタ+simm9(即値9bit)の符号拡張

Pre-indexed/Post-indexed、AdvancedSIMD load/Storeのみ
[base,#simm7]
ベースレジスタ+simm7(即値7bit、scaled)の符号拡張 scaledはレジスタ幅に合わせて左シフトした値

Pre-indexedはbase+offsetでアクセスした後、ベースレジスタにそのアドレスを反映。
Post-indexedはbaseでアクセスした後、ベースレジスタにbase+offsetの値を反映。

Pre-indexed by immediate offset (scaled 7-bit signed);
Post-indexed by immediate offset (scaled 7-bit signed).
Base plus offset addressing means that the address is the value in the 64-bit register base plus an offset.
Pre-indexed addressing means that the address is the value in the 64-bit register base plus offset, then the address is written back to base.
Post-indexed addressing means that the address is the value in the 64-bit register base, then address plus offset is written back to base.

☆Pre/Post-indexedを使うと*(p++)みたいなことができる。


 間接アクセスがないというのは共通だが、どれも大体同じだろうと思っていたら意外にも異なっていた。勉強になる。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




RISCのアドレッシングモード 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる