RVCTv2.1 以降のアセンブリ言語に関する変更点

RVCT v2.1 以前のアセンブラで使用されているアセンブリ言語は、UAL 以前の ARM および Thumb と呼ばれています。現在のアセンブラでは、UAL と UAL 以の ARM と Thumb 構文を使用できます。アセンブラは、構文の前に CODE16 ディレクティブが使用されているか、またはソースファイルが --16 コマンドラインオプションでアセンブルされている場合にのみ UAL 以前の Thumb 構文を認識します。

既に RVCT v2.1 以前で使用されている ARM および Thumb アセンブリ言語について理解しているプログラマのために、Table 14 には、UAL と UAL 以前の ARM アセンブリ言語の構文の違いを示しています。

Table 14. 以前の ARM アセンブリ言語からの変更点

変更点UAL 以前の ARM 構文適切な UAL 構文
LDM および STM のデフォルトのアドレッシングモードは IA です。
LDMIA, STMIA
LDM, STM
ARM と Thumb では、フル下降スタック操作に PUSH ニーモニックと POP ニーモニックを使用できます。
STMFD sp!, {reglist}
LDMFD sp!, {reglist}
PUSH {reglist}
POP {reglist}
ARM と Thumb では、ロテートのみを伴う(他の操作は伴わない)命令に LSLLSRASRROR、および RRX 命令ニーモニックを使用できます。
MOV Rd, Rn, LSL shift
MOV Rd, Rn, LSR shift
MOV Rd, Rn, ASR shift
MOV Rd, Rn, ROR shift
MOV Rd, Rn, RRX
LSL Rd, Rn, shift
LSR Rd, Rn, shift
ASR Rd, Rn, shift
ROR Rd, Rn, shift
RRX Rd, Rn
PC 相対アドレシングには、label 形式を使用します。新しいコードでは offset 形式は使用しないで下さい。
LDR Rd, [pc, #offset]
LDR Rd, label
ダブルワードメモリアクセスに両方のレジスタを指定します。使用できるレジスタの組み合わせについては、規則に従う必要があります。
LDRD Rd, addr_mode
LDRD Rd, Rd2, addr_mode
{cond} を使用する場合は、これがすべての命令の最後の要素になります。
ADD{cond}S
LDR{cond}SB
ADDS{cond}
LDRSB{cond}

また、それ以前のアセンブラと比較して柔軟性が向上しました(Table 15 を参照)。

Table 15. 要件の緩和

変更点使用可能な構文適切な構文
デスティネーションレジスタが最初のオペランドと同じ場合、2 レジスタ形式の命令を使用できます。
ADD r1, r3
ADD r1, r1, r3

UAL を使用して ARMv6T2 より前の Thumb プロセッサ用のソースコードを記述できます。

ARMv6T2 より前のプロセッサ用の Thumb コードを記述している場合、そのプロセッサで使用できる命令のみを使用するように注意する必要があります使用できない命令を使用すると、アセンブラからエラーメッセージが返されます。

ARMv6T2 以降のプロセッサ用の Thumb コードを記述している場合は、可能な限り 16 ビット命令を使用することでコードサイズを小さくできます。

Table 16 には、UAL と UAL 以前の Thumb アセンブリ言語の主な相違点を示しています。

Table 16. UAL 以前の Thumb 構文と UAL 構文の相違点

変更点UAL 以前の Thumb 構文UAL の構文
LDM および STM のデフォルトのアドレッシングモードは IA です。LDMIA, STMIALDM, STM
フラグを更新する命令では後置の S を使用する必要があります。これは、32 ビット Thumb 命令との競合を防止するために必要な変更でした。
ADD r1, r2, r3
SUB r4, r5, #6
MOV r0, #1
LSR r1, r2, #1
ADDS r1, r2, r3
SUBS r4, r5, #6
MOVS r0, #1
LSRS r1, r2, #1
ALU 命令では、3 本のレジスタを指定するのが適切な形式です(これには、デスティネーションレジスタが最初のオペランドと同じ場合も含まれま)。ただし、UAL 構文では、2 レジスタ構文を使用できます。
ADD r7, r8
SUB r1, #80
ADD r7, r7, r8
SUBS r1, r1, #80
RdRn が両方とも Lo レジスタの場合、MOV Rd, RnADDS Rd, Rn, #0 として逆アセンブルされます。
MOV r2, r3
MOV r8, r9
CPY r0, r1
LSL r2, r3, #0
ADDS r2, r3, #0
MOV r8, r9
MOV r0, r1
MOVS r2, r3
NEG Rd, RmRSBS Rd, Rm, #0 として逆アセンブルされます。NEG Rd, RmRSBS Rd, Rm, #0

Show/hide関連項目

参照

『アセンブラリファレンス』

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0473FJ
Non-ConfidentialID111311