한국으로/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 때 마다 주소가 감소됨.