LDR Rd, =label を使用したレジスタへのアドレスのロード

LDR Rd,= 疑似命令を使用すると、任意の 32 ビットの数値をレジスタにロードできます。また、この命令には、ラベルやオフセット付きラベルなどの PC 相対式 も使用できます。

アセンブラは、以下を行うことにより LDR R0, =label 疑似命令を変換します。

ADR 疑似命令や ADRL 疑似命令とは異なり、LDR 命令では現在のセクションに含まれないラベルを使用できます。アセンブラでは、ソースファイルのアセンブリ時に再配置ディレクティブをオブジェクトコード内に配置します。この再配置ディレクティブは、リンク時にアドレスを解決するようにリンカに指示します。このアドレスは、リカが LDR とリテラルプールを含むセクションをどこに配置しても有効です。

Example 11 には、これを実装するコードを示しています。

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

Example 11. LDR Rd, =label を使用したロード

        AREA    LDRlabel, 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, =start                 ; => LDR R0,[PC, #offset into
                                           ; Literal Pool 1]
        LDR     r1, =Darea + 12            ; => LDR R1,[PC, #offset into
                                           ; Literal Pool 1]
        LDR     r2, =Darea + 6000          ; => LDR R2, [PC, #offset into
                                           ; Literal Pool 1]
        BX      lr                         ; 復帰
        LTORG                              ; Literal Pool 1
func2
        LDR     r3, =Darea + 6000          ; => LDR r3, [PC, #offset into
                                           ; Literal Pool 1]
                                           ; (既存のリテラルを共有する)
        ; LDR   r4, =Darea + 6004          ; コメントを解除すると、
                                           ; Literal Pool 2 が範囲外になるため、エラーになります。
        BX      lr                         ; 復帰
Darea   SPACE   8000                       ; 現在の位置から開始し、
                                           ; メモリの 8000 バイトの領域を
                                           ; ゼロにクリアする
        END                                ; Literal Pool 2 は上記の
                                           ; LDR 命令の範囲外になる

Show/hideLDR Rd, =label の使用例:文字列のコピー

Example 12 には、ある 1 つの文字列を別の文字列で上書きする ARM コードルーチンを示しています。ここでは、LDR 疑似命令を使用してデータセクションから 2 つの文字列のアドレスをロードします。以下は特に重要です。

DCB

DCB ディレクティブは、ストアする 1 バイト以上の値を定義します。DCB には整数値だけでなく、引用符で囲んだ文字列も使用できます。文字列の各文字は、連続したバイトに配置されます。

LDR、STR

LDR 命令と STR 命令は、ポストインデクスアドレシングを使用して、アドレスレジスタを更新します。例えば、以下の命令

LDRB    r2,[r1],#1

は、R1 が指すアドレスの内容を R2 にロードし、R1 を 1 ずつインクリメントします。

Example 12. 文字列のコピー

        AREA    StrCopy, CODE, READONLY
        ENTRY                             ; 最初に実行する命令をマークする
start
        LDR     r1, =srcstr               ; 最初の文字列を指すポインタ
        LDR     r0, =dststr               ; 2 番目の文字列を指すポインタ
        BL      strcopy                   ; コピーを実行するサブルーチンを呼び出す
stop
        MOV     r0, #0x18                 ; angel_SWIreason_ReportException
        LDR     r1, =0x20026              ; ADP_Stopped_ApplicationExit
        SVC     #0x123456                 ; ARM セミホスティング(以前の SWI)
strcopy
        LDRB    r2, [r1],#1               ; バイトをロードし、アドレスを更新する
        STRB    r2, [r0],#1               ; バイトを格納し、アドレスを更新する
        CMP     r2, #0                    ; ゼロ終端文字をチェックする
        BNE     strcopy                   ; NULL でない場合は続行する
        MOV     pc,lr                     ; 復帰
        AREA    Strings, DATA, READWRITE
srcstr  DCB     "最初の文字列 - ソース",0
dststr  DCB     "2 番目の文字列 - デスティネーション",0
        END

Show/hide関連項目

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