LDM、STM

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

Show/hide構文

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

各パラメータには以下の意味があります。

op

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

LDM

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

STM

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

addr_mode

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

IA

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

IB

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

DA

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

DB

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

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

cond

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

Rn

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

!

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

reglist

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

^

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Show/hide16 ビット命令

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

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

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

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

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

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

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

Note

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

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

Note

これらの 16 ビット命令は、ThumbEE では使用できません。

Show/hidePC へのロード

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

ARMv4 では、ロードされたアドレスのビット [1:0] は 0b00 になっている必要があります。

ARMv5T 以降には以下のような特徴があります。

  • ビット [1:0] は 0b10 にできません。

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

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

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

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

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

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

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

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 © 2010-2011 ARM. All rights reserved.ARM DUI 0489FJ
Non-ConfidentialID111211