한국으로/ARM
다중 메모리 이동: LDM, STM
영킴.
2018. 7. 22. 00:05
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 때 마다 주소가 감소됨.