2.6.2. LDR Rd, =label을 통한 주소 로드

LDR Rd,= 의사 명령어는 32비트 숫자 상수를 레지스터에 로드할 수 있습니다 (LDR Rd, =const를 통한 직접 로드 참조). 또한 레이블 및 오프셋 포함 레이블과 같은 프로그램 상대 식을 허용합니다. 구문 설명을 보려면 LDR 의사 명령어를 참조하십시오.

어셈블러에서는 다음을 수행하여 LDR r0, =label 의사 명령어를 변환합니다.

ADRADRL 의사 명령어와 달리 LDR은 현재 섹션 외부의 레이블에 사용할 수 있습니다. 레이블이 현재 섹션의 외부에 있으면 어셈블러는 소스 파일을 어셈블할 때 재배치 지시어를 개체 코드에 배치합니다. 재배치 지시어는 링크 타임에 링커가 주소를 확인하도록 지정합니다. 링커가 LDR과 리터럴 풀이 포함된 섹션을 배치하는 위치에 관계없이 주소는 유효한 상태로 유지됩니다.

Example 2.6에서는 이 작업을 수행하는 방법을 보여 줍니다. 이 예제는 주 예제 디렉토리인 install_directory\RVDS\Examplesldrlabel.s로 제공되어 있습니다. 이 예제를 어셈블, 링크 및 실행하는 방법에 대한 자세한 내용은 코드 예제를 참조하십시오.

주석에 나열된 명령어는 어셈블러에서 생성된 ARM 명령어입니다.

Example 2.6. 

        AREA    LDRlabel, CODE,READONLY
        ENTRY                              ; Mark first instruction to execute
start
        BL      func1                      ; Branch to first subroutine
        BL      func2                      ; Branch to second subroutine
stop
        MOV     r0, #0x18                  ; angel_SWIreason_ReportException
        LDR     r1, =0x20026               ; ADP_Stopped_ApplicationExit
        SVC     #0x123456                  ; ARM semihosting (formerly 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                         ; Return
        LTORG                              ; Literal Pool 1
func2
        LDR     r3, =Darea + 6000          ; => LDR r3, [PC, #offset into
                                           ; Literal Pool 1]
                                           ; (sharing with previous literal) 
        ; LDR   r4, =Darea + 6004          ; If uncommented produces an error
                                           ; as Literal Pool 2 is out of range
        BX      lr                         ; Return
Darea   SPACE   8000                       ; Starting at the current location,
                                           ; clears a 8000 byte area of memory
                                           ; to zero
        END                                ; Literal Pool 2 is out of range of
                                           ; the LDR instructions above

LDR Rd, =label 예제: 문자열 복사

Example 2.7에서는 한 문자열에 다른 문자열을 덮어쓰는 ARM 코드 루틴을 보여 줍니다. 이 예제에서는 LDR 의사 명령어를 사용하여 두 문자열의 주소를 데이터 섹션에서 로드합니다. 다음은 특히 중요한 예제입니다.

DCB

DCB 지시어는 저장소에 하나 이상의 바이트를 정의합니다. 정수 값과 함께 DCB 는 따옴표로 묶인 문자열을 허용합니다. 문자열의 각 문자는 연속된 바이트로 배치됩니다. 자세한 내용은 DCB 를 참조하십시오.

LDR, STR

LDRSTR 명령어는 Post 인덱싱된 주소 지정을 사용하여 주소 레지스터를 업데이트합니다. 다음 명령어를 예로 들 수 있습니다.

LDRB    r2,[r1],#1

r1에 의해 지정된 주소 내용을 사용하여 r2를 로드한 다음 r1을 1씩 증가시킵니다.

Example 2.7. 문자열 복사

        AREA    StrCopy, CODE, READONLY
        ENTRY                             ; Mark first instruction to execute
start
        LDR     r1, =srcstr               ; Pointer to first string
        LDR     r0, =dststr               ; Pointer to second string
        BL      strcopy                   ; Call subroutine to do copy
stop
        MOV     r0, #0x18                 ; angel_SWIreason_ReportException
        LDR     r1, =0x20026              ; ADP_Stopped_ApplicationExit
        SVC     #0x123456                 ; ARM semihosting (formerly SWI) 
strcopy
        LDRB    r2, [r1],#1               ; Load byte and update address
        STRB    r2, [r0],#1               ; Store byte and update address
        CMP     r2, #0                    ; Check for zero terminator
        BNE     strcopy                   ; Keep going if not
        MOV     pc,lr                     ; Return
        AREA    Strings, DATA, READWRITE
srcstr  DCB     "First string - source",0
dststr  DCB     "Second string - destination",0
        END

Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IK
Non-Confidential