Next: , Previous: , Up: Assembler and Code Words   [Contents][Index]


6.29.9 ARM Assembler

ARM アセンブラには、 ARM アーキテクチャ・バージョン 4 のすべての命令と、 アーキテクチャ・バージョン 5 の BLX 命令が含まれています。 Thumb 命令は (まだ) サポートされていません。 また、 コ・プロセッサーもサポートされていません。

アセンブラは、 「ARM Architecture Reference Manual」で使用されているのと同じオペランド順序を持つ後置構文(postfix syntax)を使用します。 ニーモニックにはカンマが付けられます。

レジスタは r0r15 までの名前で指定され、別名は 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

Next: Other assemblers, Previous: PowerPC assembler, Up: Assembler and Code Words   [Contents][Index]