2.5.3. LDR Rd, =const를 통한 직접 로드

의사 LDR Rd,=const 명령어는 단일 명령어에서 32비트 숫자 상수를 생성할 수 있습니다. 이 의사 명령어를 사용하여 MOVMVN 명령어 범위를 벗어난 상수를 생성할 수 있습니다.

LDR 의사 명령어는 특정 상수에 대한 가장 효율적인 단일 명령어를 생성합니다.

LDR 의사 명령어의 구문에 대한 자세한 내용은 LDR 의사 명령어를 참조하십시오.

리터럴 풀 배치

어셈블러는 각 섹션의 끝에 리터럴 풀을 배치합니다. 이러한 리터럴 풀은 다음 섹션 시작에 있는 AREA 지시어 또는 어셈블리 끝에 있는 END 지시어를 통해 정의됩니다. 포함 파일 끝에 있는 END 지시어는 섹션의 끝을 나타내지 않습니다.

넓은 섹션에서는 기본 리터럴 풀이 하나 이상의 LDR 명령어 범위를 벗어날 수 있습니다. PC에서 상수까지의 오프셋은 다음과 같아야 합니다.

  • ARM 또는 Thumb-2 코드에서는 4KB 미만이지만 두 방향 중 한 방향이 될 수 있음

  • Thumb-2 이전 Thumb 코드에서 또는 Thumb-2 코드에서 16비트 명령어를 사용할 경우 1KB 미만 및 정방향

LDR Rd,=const 의사 명령어가 상수를 리터럴 풀에 배치해야 할 경우 어셈블러에서는 다음을 수행합니다.

  • 이전 리터럴 풀에서 상수를 사용할 수 있고 주소 지정이 가능한지 확인합니다. 이 경우 기존 상수에 주소를 지정합니다.

  • 아직 사용하도록 설정되지 않은 경우 다음 리터럴 풀에 상수를 배치하려고 합니다.

다음 리터럴 풀이 범위를 벗어날 경우 어셈블러는 오류 메시지를 생성합니다. 이 경우 LTORG 지시어를 사용하여 코드에 추가 리터럴 풀을 배치해야 합니다. 실패한 LDR 의사 명령어 뒤에 ±4KB (ARM, 32비트 Thumb-2) 내 또는 0 ~ +1KB 범위 (Thumb-2 이전 Thumb, 16비트 Thumb-2) 에 LTORG 지시어를 배치합니다. 자세한 내용은 LTORG를 참조하십시오.

프로세서가 지시어를 명령어로 실행하려고 하지 않으면 리터럴 풀을 배치해야 합니다. 조건부가 아닌 분기 명령어 또는 서브루틴 끝의 반환 명령어 다음에 지시어를 배치합니다.

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

주석으로 표시된 명령어는 어셈블러에서 생성된 ARM 명령어입니다.

Example 2.4. 

        AREA     Loadcon, 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, =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 contains
                                           ; literal Ox55555555
func2
        LDR      r3, =0x55555555           ; => LDR R3, [PC, #offset to
                                           ; Literal Pool 1]
        ; LDR r4, =0x66666666              ; If this is uncommented it
                                           ; fails, because Literal Pool 2
                                           ; is out of reach
        BX       lr
LargeTable
        SPACE    4200                      ; Starting at the current location,
                                           ; clears a 4200 byte area of memory
                                           ; to zero
        END                                ; Literal Pool 2 is empty

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