4.2.8. LDM 및 STM

다중 레지스터 로드 및 저장. ARM 상태에서는 레지스터 r0 ~ r15의 모든 조합을 전송할 수 있지만 Thumb 상태에서는 일부 조합을 전송하지 못할 수 있습니다.

PUSH 및 POP도 참조하십시오.

구문

op{addr_mode}{cond} Rn{!}, reglist{^}

인수 설명:

op

다음 중 하나일 수 있습니다.

LDM

다중 레지스터 로드

STM

다중 레지스터 저장

addr_mode

다음 중 하나입니다.

IA

각 전송 후에 주소를 증가시킵니다. 기본값이며 생략할 수 있습니다.

IB

각 전송 전에 주소를 증가시킵니다 (ARM에만 해당).

DA

각 전송 후에 주소를 감소시킵니다 (ARM에만 해당).

DB

각 전송 전에 주소를 감소시킵니다.

스택 지향 주소 지정 모드 접미사는 Table 2.9를 참조하십시오.

cond

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

Rn

기준 레지스터로, 전송할 초기 주소가 들어 있는 ARM 레지스터입니다. Rn은 r15이면 안 됩니다.

!

선택적 접미사입니다. ! 기호가 있을 경우 최종 주소가 Rn에 다시 기록됩니다.

reglist

로드 또는 저장할 하나 이상의 레지스터가 포함된 목록으로, 중괄호로 묶입니다. 이 목록에는 레지스터 범위가 포함될 수도 있습니다. 이 목록에 하나 이상의 레지스터나 레지스터 범위가 포함될 경우 콤마로 구분해야 합니다 ( 예제 참조).

자세한 내용은 32비트 Thumb-2 명령어의 reglist에 대한 제한을 참조하십시오.

^

ARM 상태에서만 사용할 수 있는 선택적 접미사로, 사용자 모드나 시스템 모드에서는 사용할 수 없습니다. 이 접미사의 용도는 다음과 같습니다.

  • 명령어가 LDM (임의의 주소 지정 모드 포함) 이고 reglist에 일반 다중 레지스터 전송 외에도 pc (r15) 가 포함되어 있는 경우 SPSRCPSR로 복사됩니다. 이는 예외 처리기에서 복귀하기 위한 것으로, 예외 모드에서만 사용해야 합니다.

  • 또는 현재 모드 레지스터 대신 사용자 모드 레지스터 내부 또는 외부로 데이터를 전송합니다.

32비트 Thumb-2 명령어의 reglist에 대한 제한

32비트 Thumb-2 명령어의 경우

  • 목록에 SP를 포함할 수 없습니다.

  • STM 명령어의 목록에 pc를 포함할 수 없습니다.

  • LDM 명령어의 목록에 pc와 lr을 둘 다 포함할 수 없습니다.

  • 이 목록에는 둘 이상의 레지스터가 있어야 합니다.

reglist에서 레지스터를 하나만 사용하여 STM 또는 LDM 명령어를 기록하는 경우 어셈블러에서 해당하는 STR 또는 LDR 명령어를 자동으로 대체합니다. 디스어셈블리 목록을 소스 코드와 비교할 때는 이러한 사항에 주의해야 합니다.

--diag_warning 1645 어셈블러 명령 행 옵션을 사용하여 명령어 대체가 발생하는 시기를 확인할 수 있습니다.

16비트 명령어

이러한 명령어의 16비트 버전 하위 세트는 Thumb-2 코드 및 다른 Thumb-2 이전 프로세서의 Thumb 코드에서 사용할 수 있습니다.

16비트 명령어에는 다음 제한이 적용됩니다.

  • reglist의 모든 레지스터가 Lo 레지스터여야 합니다.

  • Rn 이 Lo 레지스터여야 합니다.

  • addr_mode가 생략되어야 하거나 IA여야 합니다. 즉, 각 전송 후에 주소가 증가해야 합니다.

  • STM 명령어에 대해 갱신을 지정해야 합니다.

  • Rnreglist에 없는 LDM 명령어에 대해 갱신을 지정해야 합니다.

또한 PUSHPOP 명령어를 이 형식으로 표시할 수 있습니다. 일부 형식의 PUSHPOP은 16비트 명령어이기도 합니다. 자세한 내용은 PUSH 및 POP을 참조하십시오.

Note

이러한 16비트 명령어는 Thumb-2EE에서 사용할 수 없습니다.

pc로 로드

pc로 로드하면 로드된 주소에 있는 명령어로 분기됩니다.

ARMv4에서는 로드된 주소의 비트[1:0]이 0b00이어야 합니다.

ARMv5T 이상의 경우

  • 비트[1:0]은 0b10이면 안 됩니다.

  • 비트[0]이 1이면 실행이 Thumb 상태에서 계속됩니다.

  • 비트[0]이 0이면 실행이 ARM 상태에서 계속됩니다.

쓰기 되돌림을 사용하여 기준 레지스터 로드 및 저장

ARM 코드 또는 Thumb-2 이전의 Thumb 코드에서 Rnreglist에 있고 ! 접미사로 갱신이 지정될 경우 다음 사항이 적용됩니다.

  • 명령어가 STM 또는 STMIA이고 Rnreglist에서 가장 작은 숫자의 레지스터일 경우 Rn의 초기값이 저장됩니다.

  • Rn의 로드되거나 저장된 값은 신뢰할 수 없습니다.

Thumb-2 코드에서 Rnreglist에 있고 ! 접미사로 갱신이 지정될 경우 다음 사항이 적용됩니다.

  • 모든 32비트 명령어를 예상할 수 없습니다.

  • 16비트 명령어는 Thumb-2 이전의 Thumb 코드에서와 동일한 방식으로 동작하지만 이러한 명령어는 향후 사용할 수 없습니다.

예제

    LDM     r8,{r0,r2,r9}      ; LDMIA is a synonym for LDM
    STMDB   r1!,{r3-r6,r11,r12}

올바르지 않은 예제

    STM     r5!,{r5,r4,r9} ; value stored for r5 unpredictable 
    LDMDA   r2, {}         ; must be at least one register in list
Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IK
Non-Confidential