LDR 疑似命令

以下のいずれかの値をレジスタにロードします。

Note

これは LDR 疑似命令の説明であり、LDR 命令の説明ではありません。

Show/hide構文

LDR{cond}{.W} Rt, =expr
LDR{cond}{.W} Rt, =label_expr

各項目には以下の意味があります。

cond

任意の条件コードを指定します。

.W

任意に指定できる幅指定子を指定します。

Rt

ロード先のレジスタを指定します。

expr

数値を求める式を指定します。

label_expr

アドレスの PC 相対式または外部式をラベルから数値を加減算する形式で指定します。

Show/hide使用法

LDR 疑似命令を使用する場合:

  • expr の値を有効な MOV 命令または MVN 命令でロードできる場合は、アセンブラによってその命令が使用されます。

  • 有効な MOV 命令または MVN 命令を使用できない場合や、label_expr 構文が使用されている場合は、アセンブラは定数をリテラルプールに配置し、リテラルプールからその定数を読み出す PC 相対 LDR 命令を生成します。

    Note

    • この方法でロードされたアドレスはリンク時に固定されるため、このコードは位置依存コードになります。

    • 定数を保持するアドレスは、リンカが LDR 命令を保持する ELF セクションをどこに配置しても有効です。

アセンブラは、label_expr の値をリテラルプールに配置し、リテラルプールからこの値をロードする PC 相対 LDR 命令を生成します。

label_expr が外部式であるか、現在のセクションに含まれていない場合、アセンブラはリンカ再配置ディレクティブをそのオブジェクトファイル内に入れます。リンカはリンク時にアドレスを生成します。

label_expr が名前付きまたは数値ローカルラベルの場合、アセンブラはリンカ再配置ディレクティブをオブジェクトファイル内に入れ、そのローカルラベルのシンボルを生成します。アドレスはリンク時に生成されます。ローカルラベルが T32 コードを参照する場合、アドレスの T32 ビット(ビット 0)が設定されます。

PC からリテラルプール内の値までのオフセットは ±4KB(A32、および 32 ビット T32 エンコーディングの場合)より小さいか、0 ~ +1KB(16 ビット T32 エンコーディングの場合)の範囲内である必要があります。このとき範囲内にリテラルプールがあることを必ず確認して下さい。

参照されているラベルが T32 コード内にある場合、LDR 疑似命令は label_expr の T32 ビット(ビット 0)を設定します。

Note

RealView® Compilation Tools(RVCT)v2.2 では、アドレスの T32 ビットが設定されませんでした。この動作に依存するコードでは、コマンドラインオプション --untyped_local_labels を使用して、アセンブラが T32 コード内のラベルを参照する際に T32 ビットを設定しないようにします。

Show/hideT32 コード内の LDR

.W 幅指定子を指定して、LDR で T32 コードの 32 ビット命令を生成できます。LDR.W を指定した場合は、16 ビット MOV でイミディエート値をロードできる場合や、リテラルプールが 16 ビット PC 相対ロードの範囲内にある場合でも、常に 32 ビット命令が生成されます。

ロードされる値がアセンブラの初回パスで未知の場合、.W なしの LDR は 16 ビット T32 コード命令を生成します。その結果 32 ビットの MOV 命令または MVN 命令で生成できる値でも 16 ビット PC 相対ロードになります。値が初回パスで既知で、32 ビットの MOV 命令または MVN 命令を使って生成できる場合は、MOV 命令または MVN 命令が使用されます。

LDR 疑似命令は 16 ビットフラグを設定する MOV 命令を生成することはありません。アセンブラの --diag_warning 1727 コマンドラインオプションを使用して、16 ビット命令の使用を確認できます。

MOV32 疑似命令を使用すると、イミディエート値やアドレスをリテラルプールからロードせずに生成できます。

Show/hide

        LDR     r3,=0xff0    ; 0xff0 を R3 にロードする
                             ; =>  MOV.W r3,#0xff0
        LDR     r1,=0xfff    ; 0xfff を R1 にロードする
                             ; =>  LDR r1,[pc,offset_to_litpool]
                             ;     ...
                             ;     litpool DCD 0xfff
        LDR     r2,=place    ; place のアドレスを
                             ; R2 にロードする
                             ; =>  LDR r2,[pc,offset_to_litpool]
                             ;     ...
                             ;     litpool DCD place

Show/hide関連項目

Copyright © 2014 ARM. All rights reserved.ARM DUI 0802AJ
Non-ConfidentialID061814