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 |