2.7.2. LDM 및 STM을 통한 스택 구현

다중 로드 및 저장 명령어는 기준 레지스터를 업데이트할 수 있습니다. 스택 연산의 경우 기준 레지스터는 일반적으로 스택 포인트 sp입니다. 즉, 이러한 명령어를 사용하여 단일 명령어에서 임의의 레지스터 수에 대해 푸시 및 팝 연산을 구현할 수 있습니다.

다중 로드 및 저장 명령어는 여러 유형의 스택에 사용할 수 있습니다.

내림차순 또는 오름차순

스택은 상위 주소에서 시작하여 하위 주소로 진행하여 (내림차순 스택) 아래쪽으로 증가하거나 하위 주소에서 시작하여 상위 주소로 진행하여 (오름차순 스택) 위쪽으로 증가합니다.

전체 또는 비어 있음

스택 포인터는 스택의 마지막 항목 (전체 스택) 또는 스택의 다음 빈 공간 ( 스택) 을 가리킬 수 있습니다.

프로그래머가 보다 쉽게 작업할 수 있도록 스택 지향 접미사를 증가 또는 감소 대신 접미사 앞이나 뒤에 사용할 수 있습니다. Table 2.9에서는 스택 지향 접미사 및 로드 및 저장 명령어의 해당 주소 지정 모드 접미사를 보여 줍니다.

Table 2.9. 스택 지향 접미사 및 해당 주소 지정 모드 접미사

스택 지향 접미사저장 또는 푸시 명령어의 경우로드 또는 팝 명령어의 경우
FD (전체 내림차순 스택) DB (이전 감소) IA (이후 증가)
FA (전체 오름차순 스택) ID (이전 증가) DA (이후 감소)
ED (빈 내림차순 스택) DA (이후 감소) ID (이전 증가)
EA (빈 오름차순 스택) IA (이후 증가) DB (이전 감소)

Table 2.10에서는 여러 유형의 스택에 사용할 수 있는 스택 지향 접미사가 포함된 여러 로드 및 저장 명령어를 보여 줍니다.

Table 2.10. 다중 로드 및 저장 명령어의 접미사

스택 유형저장로드
전체 내림차순STMFD (STMDB, 이전 감소) LDMFD (LDM, 이후 증가)
전체 오름차순STMFA (STMIB, 이전 증가) LDMFA (LDMDA, 이후 감소)
빈 내림차순STMED (STMDA, 이후 감소) LDMED (LDMIB, 이전 증가)
빈 오름차순STMEA (STM, 이후 증가) LDMEA (LDMDB, 이전 감소)

예를 들면 다음과 같습니다.

    STMFD    sp!, {r0-r5}  ; Push onto a Full Descending Stack
    LDMFD    sp!, {r0-r5}  ; Pop from a Full Descending Stack

Note

Procedure Call Standard for the ARM Architecture (AAPCS) 와 ARM , Thumb C 및 C++ 컴파일러에서는 항상 전체 내림차순 스택을 사용합니다.

PUSHPOP 명령어는 전체 내림차순 스택을 가정합니다. 이러한 명령어 쓰기 되돌림이 포함된 STMDBLDM의 동의어입니다.

중첩 서브루틴에 대해 레지스터 스택

스택 연산은 서브루틴 진입과 종료에 유용합니다. 서브루틴 진입 시에 필요한 작업 레지스터는 스택에 저장되고 종료 시에 다시 팝될 수 있습니다.

또한 진입 시 링크 레지스터를 스택으로 푸시하면 복귀 주소가 손실되지 않고 추가 서브루틴 호출을 안전하게 수행할 수 있습니다. 이렇게 하면 종료 시 스택에서 pc를 팝하고 해당 값을 pc로 이동하여 서브루틴에서 복귀할 수 있습니다. 예를 들어 다음과 같습니다.

subroutine  PUSH    {r5-r7,lr} ; Push work registers and lr
            ; code
            BL      somewhere_else
            ; code
            POP     {r5-r7,pc} ; Pop work registers and pc

Note

혼합 ARM 및 Thumb 시스템에서는 이 명령어를 주의하여 사용해야 합니다. ARMv4T 시스템에서 pc로 직접 팝하여 상태를 변경할 수 없습니다. 이 경우 주소를 임시 레지스터로 팝하고 BX 명령어를 사용해야 합니다.

ARMv5T 이상에서는 이 방법으로 상태를 변경할 수 있습니다.

ARM과 Thumb을 함께 사용하는 데 대한 자세한 내용은 개발자 설명서의 5장 ARM과 Thumb의 인터워킹을 참조하십시오.

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