4.2.12. LDREX 및 STREX

단독 레지스터 로드 및 저장

구문

LDREX{cond} Rt, [Rn {, #offset}]
STREX{cond} Rd, Rt, [Rn {, #offset}]
LDREXB{cond} Rt, [Rn]
STREXB{cond} Rd, Rt, [Rn]
LDREXH{cond} Rt, [Rn]
STREXH{cond} Rd, Rt, [Rn]
LDREXD{cond} Rt, Rt2, [Rn]
STREXD{cond} Rd, Rt, Rt2, [Rn]

인수 설명:

cond

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

Rd

반환된 상태에 대한 대상 레지스터입니다.

Rt

로드 또는 저장할 레지스터입니다.

Rt2

더블워드를 로드 또는 저장할 두 번째 대상 레지스터입니다.

Rn

메모리 주소의 기준이 되는 레지스터입니다.

offset

Rn의 값에 적용되는 선택적 오프셋입니다. offset은 Thumb-2 명령어에서만 사용할 수 있습니다. offset이 생략될 경우 오프셋은 0으로 간주됩니다.

LDREX

LDREX는 메모리에서 데이터를 로드합니다.

  • 물리 주소에 공유 TLB 속성이 있을 경우, LDREX는 물리 주소를 현재 프로세서의 단독 액세스로 태그 설정하고 다른 모든 물리 주소에서 이 프로세서의 단독 액세스 태그를 지웁니다.

  • 또는 실행 프로세서에 미결정 태그가 설정된 실제 주소가 있다는 사실을 태그 설정합니다.

STREX

STREX는 메모리에 대한 조건부 저장을 수행합니다. 조건은 다음과 같습니다.

  • 물리 주소에 공유 TLB 속성이 없고 실행 프로세서에 미결정 태그가 설정된 물리 주소가 있는 경우 저장 작업이 수행되고 태그가 지워지며 Rd에서 값 0이 반환됩니다.

  • 물리 주소에 공유 TLB 속성이 없고 실행 프로세서에 미결정 태그가 설정된 물리 주소가 없는 경우 저장 작업이 수행되지 않고 Rd에서 값 1이 반환됩니다.

  • 물리 주소에 공유 TLB 속성이 있고 물리 주소가 실행 프로세서의 단독 액세스로 태그 설정된 경우 저장 작업이 수행되고 태그가 지워지며 Rd에서 값 0이 반환됩니다.

  • 물리 주소에 공유 TLB 속성이 있고 물리 주소가 실행 프로세서의 단독 액세스로 태그 설정되지 않은 경우 저장 작업이 수행되지 않고 Rd에서 값 1이 반환됩니다.

제한

Rd, Rt, Rt2 또는 Rn에 r15를 사용하면 안 됩니다.

STREX의 경우, RdRt, Rt2 또는 Rn과 동일한 레지스터이면 안 됩니다.

ARM 명령어의 경우

  • Rt 가 짝수의 레지스터여야 하고 r14이면 안 됩니다.

  • Rt2R (t+1) 이어야 합니다.

  • offset은 허용되지 않습니다.

Thumb 명령어의 경우

  • Rd, Rt 또는 Rt2에 r13을 사용하면 안 됩니다.

  • LDREXD의 경우 RtRt2가 동일한 레지스터이면 안 됩니다.

  • offset의 값은 0 ~ 1020 범위에 있는 4의 배수일 수 있습니다.

사용법

LDREXSTREX를 사용하여 다중 프로세서와 공유 메모리 시스템에서 프로세서 간 통신을 구현합니다.

성능상의 이유로 해당 LDREX 명령어와 STREX 명령어 사이의 명령어 수를 최소로 유지해야 합니다.

Note

STREX 명령어에 사용된 주소는 가장 최근에 실행된 LDREX 명령어에 사용된 주소와 같아야 합니다. 다른 주소에 대해 STREX 명령어를 실행하면 예상할 수 없는 결과가 발생합니다.

아키텍처

ARM LDREXSTREX는 ARMv6 이상에서 사용할 수 있습니다.

ARM LDREXB, LDREXH, LDREXD, STREXB, STREXDSTREXH는 ARMv6K 이상에서 사용할 수 있습니다.

LDREXDSTREXD를 ARMv7-M 프로필에서 사용할 수 없다는 점을 제외하고 이러한 32비트 Thumb 명령어는 ARMv6T2 이상에서 사용할 수 있습니다.

이러한 명령어의 16비트 버전은 없습니다.

예제

    MOV r1, #0x1                ; load the ‘lock taken’ value
try
    LDREX r0, [LockAddr]        ; load the lock value
    CMP r0, #0                  ; is the lock free?
    STREXEQ r0, r1, [LockAddr]  ; try and claim the lock
    CMPEQ r0, #0                ; did this succeed?
    BNE try                     ; no – try again
    ....                        ; yes – we have the lock
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IK
Non-Confidential