🍆
ARM Load,Store Multi Register Instruction
February 10, 2021
Load, Store 다중 레지스터 명령
- ARM, Thumb 명령어 집합에는 메모리에서 여러 레지스터를 로드하고 저장하는 명령어 가 포함되어 있다.
- 다중 레지스터 전송 명령어는 여러 레지스터의 내용을 메모리로부터 효율적으로 이동하는 방법을 제공한다.
- 블록 복사, 서브루틴 진입 및 종료시 스택 작업에 가장 자주 사용된다.
- 일련의 단일 데이터 전송 명령어 대신 다중 레지스터 전송 명령어를 사용하면 여러 이득이 있다.
- 코드의 크기를 작게 할 수 있다.
- 여러 명령 fetch가 아닌 단일 명령 fetch overhead
- 캐시되지 않은 ARM 프로세서에서 로드 또는 다중 저장에 의해 전송되는 첫 번째 워드는 항상 비 순차자적 메모리주기이지만 전송되는 모든 후속 word는 순차 메모리 주기 일 수 있다.
- 대부분의 시스템에서 순차적 메모리 주기가 더 빠르다.
ARM LDM, STM 명령
- 여러 명령어를 로드, 저장 하면 단일 명령어를 사용하여 메모리에서 16개의 범용 레지스터의 하위 집합을 로드, 저장 한다.
LDM
LDM {cond} address-mode Rn{!}, reg-list{^}
4 addressing modes:
LDMIA / STMIA
LDMIB / STMIA
LDMDA / STMDA
LDMDB / STMDB
cond
- 선택적 조건 코드 부분
address-mode
- 명령어의 주소 지정 모드를 지정한다.
- IA : 이후 증가
- IB : 이전에 증가
- DA : 이후 감수
- DB : 이전에 감소
Rn
- 로드 작업의 기본 레지스터이다.
- 해당 레지스터에 저장된 주소는 로드 작업의 시작 주소이다.
- r15(pc) 를 기준 레지스터로 지정하면 안된다.
!
- 기본 레지스터 쓰기를 지정하낟.
- 이것이 지정되면 기본 레지스터의 주소가 전송 후 업데이트 된다.
- 레지스터 목록의 각 레지스터에 대해 한 단어씩 감소하거나 증가한다.
Register-list
- 중괄호로 묶인 기호 레지스터 이름 및 레지스터 범위의 쉼표로 구분된 목록이다.
- 목록에 적어도 하나의 레지스터가 있어야 한다.
- 레지스터 범위는 대시로 지정한다.
{r0, r1, r4-r6, pc}
- 기본 레지스터 Rn이 레지스터 목록에 있으면 쓰기, 저장을 하면 안된다.
^
- 사용자 또는 시스템 모드에서 이 옵션을 사용하면 안된다.
- STM 명령어의 구문은 ^ 옵션의 효과에 대한 일부 세부 사항을 제외하고 정확히 일치한다.
LDM, STM으로 스택 구현
-
로드 , 저장 여려 명령어는 기본 레지스터를 업데이트 할 수 있다.
-
스택 연산의 경우 기본 레지스터는 일반적으로 스택 포인터 r13이다.
-
즉, 여러 명령어로드 및 저장을 사용하여 단일 명령어에서 여러 레지스터에 대한 푸시 및 팝 작업을 구현할 수 있다.
-
여러 유형의 스택에서 여러로드 및 저장 명령어를 사용할 수 있다.
내림 차순, 오름차순
- 스택은 높은 주소에서 시작해서 하위주소로 진행하거나 상위 주소에서 시작해서 상위주소로 진행하여 아래쪽으로 성장한다.
Full, Empty
-
스택 포인터는 스택의 미지막 항목(전체 스택) 또는 스택의 다음 여유 공간(빈 스택)을 가리킬 수 있다.
-
증가, 감소 대신 접미사 앞뒤에 스택 지향 접미사를 사용할 수 있다.
Stack type Push Pop
Full descending STMFD (STMDB) LDMFD (LDMIA)
Full ascending STMFA (STMIB) LDMFA (LDMDA)
Empty descending STMED (STMDA) LDMED (LDMIB)
Empty ascending STMEA (STMIA) LDMEA (LDMDB)
- 연습1
LDMXX r10, {r0, r1, r4}
STMXX r10, {r0, r1, r4}
- 연습 2
STMFD r13!, {r0-r5} ; Full 내림차순 스택으로 PUSH
LDMFD r13!, {r0-r5} ; Full 내림차순 스택에서 POP
중첩 된 서브 루틴에 대한 스택 레지스터
- 스택 작업은 서브 루틴 진입 및 종료시 매우 유용하다.
- 서브 루틴을 시작할 때 필요한 작업 레지스터를 스택에 저장할 수 있다.
- 종료할 때 다시 POP off 할 수 있다.
- 또한 링크 레지스터가 진입시 스택으로 푸시되면 반환 주소를 잃지 않고 추가 서브 루틴 호출을 안전하게 수행할 수 있다.
- 이렇게 하면 lr 를 POP 한 다음 해당 값을 PC로 이동하는 대신 종료시 스택에서 PC를 POP 하여 서브 루틴으로 복귀할 수 있다.
subroutine STMFD sp!, {r5-r7,lr} ; 작업 레지스터 및 lr 푸시
; code
BL somewhere_else
; code
LDMFD sp!, {r5-r7,pc} ; 작업 레지스터 및 pc POP