LDM、STM

多重レジスタロード/ストア命令です。A32 状態ではレジスタ R0 ~ R15(PC)の任意の組み合わせを転送できますが、T32 状態では制限がいくつかあります。

Show/hide構文

op{addr_mode}{cond} Rn{!}, reglist{^}

各項目には以下の意味があります。

op

次のいずれかを指定できます。

LDM

複数のレジスタをロードします。

STM

複数のレジスタをストアします。

addr_mode

以下のいずれかを指定します。

IA

転送単位でアドレスをポストインクリメントします。これはデフォルト値なので、省略できます。

IB

転送単位でアドレスをプレインクリメントします(A32 のみ)。

DA

転送単位でアドレスをポストデクリメントします(A32 のみ)。

DB

転送単位でアドレスをプレデクリメントします。

スタックを実装するときなどに、スタック指向のアドレッシングモード接尾文字を使用することもできます。

cond

任意の条件コードを指定します。

Rn

ベースレジスタです。つまり、転送に使用する初期アドレスが保持される ARM レジスタです。Rn に PC は指定できません。

!

任意に指定できる接尾文字です。! を指定すると、最終アドレスが Rn にライトバックされます。

reglist

ロードまたはストアするレジスタのリストを中括弧で囲んで指定します。レジスタ範囲も指定できます。複数のレジスタまたはレジスタ範囲を指定する場合は、コンマで区切る必要があります。

^

任意に指定できる接尾文字です。A32 状態のみで使用できます。ユーザモードやシステムモードでは使用できません。この接尾文字には以下の目的があります。

  • 命令に(任意のアドレッシングモードで)LDM を指定し、reglist に PC(R15)が含まれている場合、通常の多重レジスタ転送が行われるだけでなく、SPSRCPSR にコピーされます。これは、例外ハンドラからの復帰に必要です。したがって、この接尾文字は必ず例外モードから使用して下さい。

  • 例外モードで使用されない場合には、現在のモードのレジスタではなく、ユーザモードのレジスタとの間でデータ転送が実行されます。

Show/hide32 ビット T32 命令の reglist に関する制約条件

32 ビット T32 命令には以下の制約条件が適用されます。

  • SP をリストに含めることはできません。

  • STM 命令では、PC をリストに含めることはできません。

  • LDM 命令では、PC と LR を両方ともリストに含めることはできません。

  • リストには複数のレジスタを指定する必要があります。

reglist にレジスタが 1 つしか指定されていない STM または LDM 命令を記述した場合は、自動的に同等の STR または LDR 命令に書き換えられます。逆アセンブルリストとソースコードを比較する場合は、この点に注意して下さい。

アセンブラの --diag_warning 1645 コマンドラインオプションを使用して、いつ命令置換が発生したかを確認できます。

Show/hideA32 命令の reglist に関する制約条件

A32 ストア命令は、reglist に SP および PC を持つことができますが、reglist に SP または PC を含む命令は非推奨です。

A32 ロード命令は、reglist に SP および PC を持つことができますが、reglist に SP を含むか、reglist に PC と LR の両方を含む命令は非推奨です。

Show/hide16 ビット命令

これらの命令のサブセットの 16 ビットバージョンは、T32 コードで使用できます。

16 ビット命令には、以下の制約条件が適用されます。

  • reglist に指定するレジスタはすべて Lo レジスタである必要があります。

  • Rn は Lo レジスタである必要があります。

  • addr_mode は省略する(または IA を指定する)必要があります。つまり、転送単位でアドレスをポストインクリメントする必要があります。

  • STM 命令に対してライトバックを指定する必要があります。

  • Rnreglist にない場合、LDM 命令に対してライトバックを指定する必要があります。

Note

Rnreglist 内の最下位レジスタとして指定する、ライトバックが使用される 16 ビット T32 STM 命令の使用は非推奨です。

また、PUSH および POP 命令は STM および LDM 命令のサブセットなので、STM および LDM 命令を使用して表現できます。PUSHPOP の一部の形式は、16 ビット命令でもあります。

Show/hidePC へのロード

PC(プログラムカウンタ)へのロードを実行すると、ロードされたアドレスにある命令への分岐が発生します。

ロードされたアドレスのビット [1:0] は 0b10 にできません。

ビット [0] が 1 なら、T32 状態で実行が継続します。ビット [0] が 0 なら、A32 状態で実行が継続します。

Show/hideベースレジスタのロードまたはストアとライトバックの使用

A32 または 16 ビット T32 命令では、Rnreglist に含まれていて、ライトバックが ! 接尾文字で指定されていると、以下のようになります。

  • 命令に STM{addr_mode}{cond} が指定され、Rnreglist 内で最も番号の小さいレジスタである場合は、Rn の初期値がストアされます。これらの命令は非推奨です。

  • 上記以外の場合は、ロードまたはストアされる Rn の値が信頼できないので、これらの命令は使用できません。

Rnreglist に含まれていて、ライトバックが ! 接尾文字で指定されている場合、32 ビット T32 命令は使用できません。

Show/hide

    LDM     r8,{r0,r2,r9}      ; LDMIA は LDM と同じ意味
    STMDB   r1!,{r3-r6,r11,r12}

Show/hide誤用例

    STM     r5!,{r5,r4,r9} ; R5 に格納された値は 不明
    LDMDA   r2, {}         ; リストに少なくとも 1 つのレジスタが必要

Show/hide関連項目

Copyright © 2014 ARM. All rights reserved.ARM DUI 0802AJ
Non-ConfidentialID061814