ALIGN

ALIGN ディレクティブは、ゼロ、または NOP 命令でパディングすることにより、現在の位置を指定された境界で整列させます。

Show/hide構文

ALIGN {expr{,offset{,pad{,padsize}}}}

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

expr

20 ~ 231 の 2 の累乗を返す数値式を指定します。

offset

任意の数値式を指定できます。

pad

任意の数値式を指定できます。

padsize

1、2、または 4 を指定できます。

Show/hide演算

現在の位置は、以下の形式の次の最下位アドレスで整列されます。

offset + n * expr

n は、アセンブラがパディングを最小限に抑えるために選択する任意の整数です。

expr が指定されていない場合、ALIGN によって現在の位置に次のワード(4 バイト)境界が設定されます。 以前の位置と現在の新しい位置との間にある未使用の空間は、以下で埋められます。

  • pad が指定されている場合は pad のコピー

  • 以下すべての条件が満たされている場合は NOP 命令

    • pad は指定されていません。

    • ALIGN ディレクティブは、ARM または Thumb 命令に従います。

    • 現在のセクションには、AREA ディレクティブに設定された CODEALIGN 属性があります。

  • それ以外の場合はゼロ

pad は、padsize の値に応じて、バイト、ハーフワード、またはワードとして処理されます。 padsize が指定されていない場合、pad は、デフォルトでデータセクションのバイト、Thumb コードのハーフワード、ARM コードのワードになります。

Show/hide使用法

ALIGN を使用して、データとコードを適切な境界で整列させます。 このディレクティブは、一般的に以下の状況で必要となります。

  • ADR Thumb 疑似命令は、ワード境界で整列されたアドレスしかロードできませんが、Thumb コード内のラベルはワード境界で整列されていない場合があります。 ALIGN 4 を使用して、Thumb コード内のアドレスを 4 バイト境界調整で整列させることができます。

  • ALIGN を使用すると、一部の ARM プロセッサに搭載されているキャッシュを利用することができます。 例えば、ARM940T には、16 バイトのラインから構成れるキャッシュがあります。 このような場合は、ALIGN 16 を使用して、関数エントリを 16 バイト境界で整列させてキャッシュの効果を最大限に高めることができます。

  • LDRD および STRD のダブルワードデータ転送命令は、8 バイト境界で整列させる必要があります。 LDRD または STRD を使用してデータにアクセスする場合は、DCQ などのメモリ割り当てディレクティブの前に ALIGN 8 を使用します。

  • ラベルだけの行は任意の境界で整列されます。 それに続く ARM コードはワード境界で整列されます(Thumb コードはハーフワード境界で整列されま)。 そのため、このラベルではコードが正しくアドレス指定されません。 このような場合は、ラベルの前に ALIGN 4(Thumb の場合は ALIGN 2)を使用します。

アラインメントは、ルーチンが配置される ELF セクションの開始位置から相対的に行われます。 ELF セクションは、同じ境界またはそれよりも粗い境界で整列させる必要があります。 AREA ディレクティブの ALIGN 属性は異なる方法で指定されます。

Show/hide

        AREA    cacheable, CODE, ALIGN=3
rout1   ; コード         ; 8 バイト境界で整列
        ; コード
        MOV     pc,lr  ; 4 バイト境界でのみ整列
        ALIGN   8      ; 8 バイト境界で整列
rout2   ; コード

以下の例では、ALIGN ディレクティブがアセンブラに、次の命令はワード境界で整列され、3 バイトでオフセットされることを伝えます。 3 バイトのオフセットは前のード境界で整列されているアドレスから計算されるので、2 番目の DCB は同じワードの最後のバイトに配置され、2 バイトのパディングが追加されることになります。

        AREA    OffsetExample, CODE
        DCB     1      ; この例では、2 つのバイトを同じワードの
        ALIGN   4,3    ; 先頭バイトと 4 バイト目に配置。
        DCB     1      ; 2 つ目の DCB は 1 つ目の DCB から 3 バイトのオフセット

以下の例では、ALIGN ディレクティブがアセンブラに、次の命令はワード境界で整列され、2 バイトでオフセットされることを伝えます。 この例では、2 バイトのオフセットは次のワード境界で整列されるアドレスから計算されるので、値 n は 1 に設定されます(n=0 が 3 つ目の DCB と競合)。 この場合は、3 バイトのパディングが追加されます。

        AREA    OffsetExample1, CODE
        DCB     1      ; この例では、3 つ目の DCB と競合するため
        DCB     1      ; n をゼロにはできない。 アセンブラによって n は 1 に設定される
        DCB     1
        ALIGN   4,2    ; 次の命令はワード境界で整列され、2 でオフセットされる。
        DCB     2

次の例では、DCB ディレクティブによる PC の境界調整が不適切になります。 ALIGN ディレクティブは、ラベル subroutine1 とそれに続く命令がワード境界に整列されるようにします。

        AREA    Example, CODE, READONLY
start   LDR     r6,=label1
        ; コード
        MOV     pc,lr
label1  DCB     1      ; PC の境界調整が不適切
        ALIGN          ; subroutine1 に
subroutine1            ; 次の命令を参照させる
        MOV r5,#0x5

Show/hide関連項目

Copyright © 2010-2012 ARM. All rights reserved.ARM DUI 0489GJ
Non-ConfidentialID051612