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 がローカルラベルの場合、アセンブラはリンカ再配置ディレクティブをオブジェクトファイル内に入れ、そのローカルラベルのシンボルを生成します。アドレスはリンク時に生成されます。ローカルラベルが Thumb コードを参照する場合、アドレスの Thumb ビット(ビット 0)が設定されます。

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

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

Note

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

Show/hideThumb コード内の LDR

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

ロードされる値がアセンブラの初回パスで未知の場合、.W なしの LDR は 16 ビット Thumb コード命令を生成します。その結果 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 © 2010-2011 ARM. All rights reserved.ARM DUI 0489FJ
Non-ConfidentialID111211