LDM および STM を使用したスタックの実装

複数ロード/ストア命令によって、ベースレジスタを更新できます。通常、スタック操作では、ベースレジスタにはスタックポインタ SP が使用されます。つまり、これらの命令を使用すると、1 つの命令で任意の数のレジスタに対してプッシュ操作とポップ操作を実装することができます。

複数ロード/ストア命令は、以下のタイプのスタックに使用できます。

下降または上昇

スタックには、上位アドレスから下位アドレスに下に向かって展開される下降スタックと、下位アドレスから上位アドレスに向かって展開される上昇スタックがあります。

フルまたは空

スタックポインタは、スタック内の最後の項目(フルスタック)またはスタックの次の空き領域(スタック)のどちらかを指すことができます。

プレ/ポストインクリメントやプレ/ポストデクリメント接尾文字を使用する代わりに、スタック指向の接尾文字を使用することで、プログラミングがさらに容易になります。Table 13 にロード/ストア命令のスタック指向接尾文字およびそれらと同等のアドレッシングモード接尾文字を示します。

Table 13. スタック指向接尾文字および同等のアドレッシングモード接尾文字

スタック指向接尾文字ストアまたはプッシュ命令ロードまたはポップ命令
FD (フル下降スタック)DB (プレデクリメント)IA (ポストインクリメント)
FA (フル上昇スタック)IB (プレインクリメント)DA (ポストデクリメント)
ED (空下降スタック)DA (ポストデクリメント)IB (プレインクリメント)
EA (空上昇スタック)IA (ポストインクリメント)DB (プレデクリメント)

Table 14 に各種スタックタイプに対するスタック指向接尾文字が付いた複数ロード/ストア命令を示します。

Table 14. 複数ロード/ストア命令の接尾文字

スタックのタイプストアロード
フル下降STMFDSTMDB、プレデクリメント)LDMFDLDM、ポストインクリメント)
フル上昇STMFASTMIB、プレインクリメント)LDMFALDMDA、ポストデクリメント)
空下降STMEDSTMDA、ポストデクリメント)LDMEDLDMIB、プレインクリメント)
空上昇STMEASTM、ポストインクリメント)LDMEALDMDB、プレデクリメント)

以下に例を示します。

    STMFD    sp!, {r0-r5}  ; フル下降スタックへのプッシュ
    LDMFD    sp!, {r0-r5}  ; フル下降スタックからのポップ

Note

ARM アーキテクチャのプロシージャコール標準(AAPCS)、および armclang では、常にフル下降スタックを使用します。

PUSH 命令と POP 命令では、フル下降スタックが使用されることが想定されます。これらは、ライトバックを使用する STMDBLDM と同義語です。

Show/hide関連項目

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