リテラルプール

アセンブラでは、レジスタにロードされる特定の定数値を保持するためにリテラルプールを使用します。リテラルプールは、アセンブラによってセクションの終了位置に配置されます。セクションの終了位置は、アセンブリの終了位置にある END ディレクティブか、次のセクションの開始位置にある AREA ディレクティブによって定義されます。インクルードされたファイルの最後にある END ディレクティブは、セクションの終了位置を示しているわけではありません。

大きなセクションでは、デフォルトのリテラルプールが 1 つ以上の LDR 命令の範囲内に収まらない可能性があります。PC から定数までのオフセットは、以下の規則に従う必要があります。

LDR Rd,=const 疑似命令がイミディエート値をリテラルプールに配置するように要求している場合、アセンブラでは以下を行います。

次のリテラルプールが範囲外の場合、アセンブラによってエラーメッセージが生成されます。この場合は LTORG ディレクティブを使用して、コード内に別のリテラルプールを配置する必要があります。LTORG ディレクティブを失敗した LDR 疑似命令の後、かつ -4 ~ 4KB(ARM、32 ビット Thumb の場合)または 0 ~ 1KB(16 ビット Thumb の場合)の範囲内の位置に配置します。

リテラルプールは、プロセッサによって命令として実行されない位置に配置する必要があります。つまり、無条件分岐命令の後またはサブルーチの最後にあるリターン命令の後に配置して下さい。Example 9 には、これを実装するコードを示しています。

コメントとしてリストされている命令は、アセンブラによって生成される ARM 命令です。

Example 9.  リテラルプールの配置

        AREA     Loadcon, CODE, READONLY
        ENTRY                              ; 最初に実行する命令をマークする
start
        BL       func1                     ; 最初のサブルーチンに分岐する
        BL       func2                     ; 2 番目のサブルーチンに分岐する
stop
        MOV      r0, #0x18                 ; angel_SWIreason_ReportException
        LDR      r1, =0x20026              ; ADP_Stopped_ApplicationExit
        SVC      #0x123456                 ; ARM セミホスティング(以前の SWI)
func1
        LDR      r0, =42                   ; => MOV R0, #42
        LDR      r1, =0x55555555           ; => LDR R1, [PC, #offset to
                                           ; Literal Pool 1]
        LDR      r2, =0xFFFFFFFF           ; => MVN R2, #0
        BX       lr
        LTORG                              ; Literal Pool 1 には
                                           ; リテラル Ox55555555 が格納される
func2
        LDR      r3, =0x55555555           ; => LDR R3, [PC, #offset to
                                           ; Literal Pool 1]
        ; LDR r4, =0x66666666              ; このコメント化を解除すると、
                                           ; Literal Pool 2 が範囲外になるため、
                                           ; エラーになります。
        BX       lr
LargeTable
        SPACE    4200                      ; 現在の位置から開始し、
                                           ; メモリの 4200 バイトの領域を
                                           ; ゼロにクリアする
        END                                ; Literal Pool 2 が空になる

Show/hide関連項目

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