본문 바로가기
한국으로/ARM

다중 메모리 이동: LDM, STM

by 영킴. 2018. 7. 22.

Multiple Load 및 Store


LDM, STM

다중 메모리 이동을 위해 LDM 및 STM 사용.



STMIA R0, {R1-R3, R5}


STMIA 는 Store, Increment After 라는 뜻이다.

값을 읽고난 후에 주소가 증가된다.


이 명령 수행 후에도 R0 레지스터 값은 0x1000번지이다.

R0 레지스터 값을 업데이트시키기 위해선, '!' suffix를 사용하자.


STMIA R0!, {R1-R3, R5}  -->  R0 레지스터 값이 0x1010으로 auto-update된다.


참고로 레지스터는, <reg list> 안의 순서와 관계없이 낮은 주소에 낮은 레지스터 번호가 저장된다!




LDMDB R0, {R1-R3, R5}






FD Stack PUSH, POP

FD 스택에 PUSH

STMDB sp!, {regs} or STMFD sp!, {regs}


FD 스택에 POP

LDMIA sp!, {regs} or LDMFD sp!, {regs}





Context Switching

PUSH

STMFD SP!, 와 등가 명령


POP

LDMFD SP!, 와 등가 명령


주의: PUSH, POP 명령은 ^옵션을 쓸 수 없다.
^옵션: SPSR을 CPSR에 copy






주소 계산 방식 지정 mode 8가지

IA (Increment After) : 값을 읽고/쓰고 나서 주소가 증가됨.

AB (Increment Before) : 먼저 주소를 증가 시키고 나서 값을 씀/읽음.

DA (Decrement After) : 값을 일고/쓰고 나서 주소를 감소시킴

DB (Decrement Before) : 먼저 주소를 감소시킨다음 값을 씀/읽음.


FA (Full Ascend) : 유효한 데이터를 지칭함, push 될 때 마다 주소가 증가됨.

FD (Full Descend) : 유효한 데이터를 지칭함. push 될 때 마다 주소가 감소됨.

EA (Empty Ascend) : 유효한 데이터의 다음을 지칭함. push 될 때 마다 주소가 증가

ED (Empty Descend) : 유효한 데이터의 다음을 지칭함. push 때 마다 주소가 감소됨.



'한국으로 > ARM' 카테고리의 다른 글

Interrupt Controller  (0) 2018.07.29
ARM Mode(모드) and Exception(예외)  (0) 2018.07.24
Tail Call  (0) 2018.07.24
정수 승격과 형변환 문제  (0) 2018.07.22
AAPCS와 레지스터 테이블  (0) 2018.07.21
ARM의 특수 용도 레지스터  (0) 2018.07.21
호출 규약 __cdecl 과 __stdcall의 차이점  (0) 2018.07.21
volatile이 필요한 경우  (0) 2018.07.21