4.13.3. LDR 의사 명령어

다음 중 하나를 사용하여 레지스터를 로드합니다.

Note

이 단원에서는 LDR 의사 명령어에 대해서만 설명합니다. LDR 명령어에 대한 자세한 내용은 메모리 액세스 명령어를 참조하십시오.

구문

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

인수 설명:

cond

선택적 조건 코드입니다 (조건부 실행 참조).

.W

선택적 명령어 너비 지정자입니다.

Rt

로드할 레지스터입니다.

expr

숫자 상수로 평가됩니다 (숫자 상수 참조).

  • expr의 값이 범위 내에 있을 경우 어셈블러는 MOV 또는 MVN 명령어를 생성합니다.

  • expr의 값이 MOV 또는 MVN 명령어의 범위 내에 있지 은 경우 어셈블러는 리터럴 풀에 상수를 배치하고 리터럴 풀에서 상수를 읽는 프로그램 기준 LDR 명령어를 생성합니다.

상수 로드에 대한 자세한 내용은 LDR Rd, =const를 통한 직접 로드를 참조하십시오.

label_expr

레이블에 숫자 상수를 더하거나 뺀 형식으로 된 주소의 프로그램 기준 또는 외부 식입니다 (레지스터 기준 및 프로그램 기준 식 참조). 어셈블러는 label_expr의 값을 리터럴 풀에 배치하고 리터럴 풀에서 값을 로드하는 프로그램 기준 LDR 명령어를 생성합니다.

label_expr이 외부 식이거나 현재 섹션에 포함되어 있지 않으면 어셈블러에서는 객체 파일에 링커 재배치 지시어를 배치합니다. 링커에서는 링크 타임에 주소를 생성합니다.

label_expr이 지역 레이블 (지역 레이블 참조) 이면 어셈블러는 객체 파일에 링커 재배치 지시어를 배치하고 해당 지역 레이블을 나타내는 기호를 생성합니다. 주소는 링크 타임에 생성됩니다. 지역 레이블이 Thumb 코드를 참조하는 경우 주소의 Thumb 비트 (비트 0) 가 설정됩니다.

Note

RVCT 버전 2.2에서는 주소의 Thumb 비트가 설정되지 않습니다. 이 동작에 의존하는 코드가 있으면 명령 행 옵션 --untyped_local_labels를 사용하여 Thumb 코드에서 레이블을 참조할 때 Thumb 비트를 설정하지 않도록 어셈블러에 지시합니다.

사용법

LDR 의사 명령어의 주 목적은 다음과 같습니다.

  • 즉치값이 MOVMVN 명령어의 범위를 벗어나 레지스터로 이동할 수 없을 때 리터럴 상수를 생성합니다.

  • 프로그램 기준 또는 외부 주소를 레지스터로 로드합니다. 링커에 LDR이 포함된 ELF 섹션을 배치하는 위치에 관계없이 주소는 유효한 상태로 유지됩니다.

    Note

    이러한 방식으로 로드된 주소는 링크 타임에 고정되므로 코드는 위치 독립적이지 습니다.

pc부터 리터럴 풀에 있는 값까지의 오프셋은 ±4KB (ARM, 32비트 Thumb-2) 보다 작거나 0 ~ +1KB 범위 (16비트 Thumb-2, Thumb-2 이전 Thumb) 에 있어야 합니다. 범위에 리터럴 풀이 있는지 확인하는 것은 사용자의 책임입니다. 자세한 내용은 LTORG를 참조하십시오.

참조되는 레이블이 Thumb 코드에 있는 경우 LDR 의사 명령어는 label_expr의 Thumb 비트 (비트 0) 를 설정합니다.

LDR을 사용하는 방법과 MOVMVN에 대한 자세한 내용은 레지스터에 상수 로드를 참조하십시오.

Thumb 코드의 LDR

.W 너비 지정자를 사용하여 ARMv6T2 이상 프로세서의 Thumb 코드에서 32비트 명령어를 생성하도록 LDR에 지시할 수 있습니다. 16비트 MOV에서 상수를 로드할 수 있거나 16비트 pc 기준 로드 범위 내에 리터럴 풀이 있을 경우 LDR.W는 항상 32비트 명령어를 생성합니다.

상수의 값이 어셈블러의 첫 번째 패스에서 알려지지 않는 경우, 32비트 MOV 또는 MVN 명령어에서 생성될 수 있는 상수에 대해 16비트 pc 기준 로드가 수행되더라도 .W가 없는 LDR은 Thumb 코드에서 16비트 명령어를 생성합니다. 그러나 상수가 첫 번째 패스에서 알려지고 32비트 MOV 또는 MVN 명령어를 사용하여 생성될 수 있으면 MOV 또는 MVN 명령어가 사용됩니다.

LDR 의사 명령어는 16비트 플래그 설정 MOV 명령어를 생성하지 않습니다. --diag_warning 1727 어셈블러 명령 행 옵션을 사용하면 16비트 명령어가 사용될 수 있었던 시기를 확인할 수 있습니다.

리터럴 풀에서 로드하지 않고 상수나 주소를 생성하는 데 대한 자세한 내용은 MOV32 의사 명령어를 참조하십시오.

예제

        LDR     r3,=0xff0    ; loads 0xff0 into r3
                             ; =>  MOV.W r3,#0xff0
        LDR     r1,=0xfff    ; loads 0xfff into r1
                             ; =>  LDR r1,[pc,offset_to_litpool]
                             ;     ...
                             ;     litpool DCD 0xfff
        LDR     r2,=place    ; loads the address of
                             ; place into r2
                             ; =>  LDR r2,[pc,offset_to_litpool]
                             ;     ...
                             ;     litpool DCD place
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IK
Non-Confidential