ARM アセンブラーには、 ARM アーキテクチャー・バージョン 4 のすべての命令と、 アーキテクチャー・バージョン 5 の BLX 命令が含まれています。 Thumb 命令は (まだ) サポートされていません。 また、 コ・プロセッサーもサポートされていません。
アセンブラーは、 「ARM Architecture Reference Manual」で使用されているのと同じオペランド順序を持つ後置構文(postfix syntax)を使用します。 ニーモニックにはカンマが付けられます。
レジスターは r0
〜r15
までの名前で指定され、別名は pc
, lr
, sp
,
ip
, fp
で、これらは利便性のために提供されています。 ip
は「プロシージャ内呼び出しスクラッチ・レジスター」(intra procedure call scratch register)(注意:
r12
) を指し、 命令ポインターを指すわけではないことに注意してください。 sp
は、 Forth
のスタック・ポインターではなく、 ARM ABI スタック・ポインター (r13
) を指します。
条件コードは命令内のどこにでも指定できますが、 ニーモニックの直前に指定すると最も読みやすくなります。 「S」フラグは別個のワードではなく、
命令ニーモニックにエンコードされます。 ステータス・レジスターを更新したい場合は、 add,
の代わりに adds,
を使用してください。
以下の表に、 一般的な命令のオペランドの構文を示します:
Gforth normal assembler description 123 # #123 immediate r12 r12 register r12 4 #LSL r12, LSL #4 shift left by immediate r12 r1 LSL r12, LSL r1 shift left by register r12 4 #LSR r12, LSR #4 shift right by immediate r12 r1 LSR r12, LSR r1 shift right by register r12 4 #ASR r12, ASR #4 arithmetic shift right r12 r1 ASR r12, ASR r1 ... by register r12 4 #ROR r12, ROR #4 rotate right by immediate r12 r1 ROR r12, ROR r1 ... by register r12 RRX r12, RRX rotate right with extend by 1
メモリー・オペランドの構文を以下の表に示します:
Gforth normal assembler description r4 ] [r4] register r4 4 #] [r4, #+4] register with immediate offset r4 -4 #] [r4, #-4] with negative offset r4 r1 +] [r4, +r1] register with register offset r4 r1 -] [r4, -r1] with negated register offset r4 r1 2 #LSL -] [r4, -r1, LSL #2] with negated and shifted offset r4 4 #]! [r4, #+4]! immediate preincrement r4 r1 +]! [r4, +r1]! register preincrement r4 r1 -]! [r4, +r1]! register predecrement r4 r1 2 #LSL +]! [r4, +r1, LSL #2]! shifted preincrement r4 -4 ]# [r4], #-4 immediate postdecrement r4 r1 ]+ [r4], r1 register postincrement r4 r1 ]- [r4], -r1 register postdecrement r4 r1 2 #LSL ]- [r4], -r1, LSL #2 shifted postdecrement ' xyz >body [#] xyz PC-relative addressing
複数のロード/ストア命令のレジスター・リストは、 それぞれ {
および }
というワードを使用して開始および終了します。
{
〜 }
の間に、 レジスター名を 1 つずつリストすることも、 後置演算子 r-r
を使用してレジスター範囲を形成することもできます。 ^
フラグはレジスター・リスト・オペランドではエンコードされませんが、
命令ニーモニックに直接エンコードされます。 つまり、 ^ldm,
と ^stm,
を使用します。
複数のロード/ストアのアドレッシング・モードは命令接尾辞としてエンコードされず、 代わりにアドレッシング・モードのように指定されます。
DA
, IA
, DB
, IB
, DA!
, IA!
,
DB!
, IB!
のいずれかを使います。
以下の表にいくつかの例を示します:
Gforth normal assembler r4 ia { r0 r7 r8 } stm, stmia r4, {r0,r7,r8} r4 db! { r0 r7 r8 } ldm, ldmdb r4!, {r0,r7,r8} sp ia! { r0 r15 r-r } ^ldm, ldmfd sp!, {r0-r15}^
Forth アセンブラーに典型的な制御構造ワードが利用可能です: if,
, ahead,
, then,
,
else,
, begin,
, until,
, again,
, while,
,
repeat,
, repeat-until,
。 条件は以下のワードの前に指定します:
r1 r2 cmp, \ compare r1 and r2 eq if, \ equal? ... \ code executed if r1 == r2 then,
ARM アセンブラーを使用した定義の例:
abi-code my+ ( n1 n2 -- n3 ) \ arm abi: r0=SP, r1=&FP, r2,r3,r12 saved by caller r0 IA! { r2 r3 } ldm, \ pop r2 = n2, r3 = n1 r3 r2 r3 add, \ r3 = n1+n1 r3 r0 -4 #]! str, \ push r3 pc lr mov, \ return to caller, new SP in r0 end-code