2010. 4. 20. 09:34ㆍ개발자 공부방/임베디드교육
다중의 메모리 이동을 위해 LDM 및 STM 이 사용됨.
(op) {cond} <mode> Rn, <reg list>
{cond} : 조건부 실행을 위한 조건
<mode> : 주고 계산 방식을 지정함 = IA, IB, DA, DB, FA, FD, EA, ED
Rn : 메모리를 가리키고 있는 베이스 주소 레지스터 (R0~R3 또는 R12)
ex)
LDMDB R1,{R1-R4, R12, LR}
R1 에 든 포인터에 있는 값을 읽어 들인다.
STMNEIA R0 {R0,R1,R2,SP}
R0 에 든 포인터 주소에 값을 쓴다.
STM, LDM 이 수행 되어도 base register 값은 고정이다
STM, LDM 수행 후 base register 를 변경하도록 하려면 ! 을 붙인다.
(op) {cond} <mode> Rn!,<reg list>
ex)
LDMDB R1!, {R1,R2,LR}
각 주소 계산 지정자
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 때 마다 주소가 감소됨.
-실습 1-
and r2, r1, #15 // r2 = r1 & 15
orr r2, r2, r0, lsl #2 // r2 = r2|(r0 << 2)
mov r0, r2
mov pc, lr
-실습 2 –
mov r3, #0 // c =0
Loop
add r3, r0, r3 // c = a + c
add r0, r0, #1 // a++
//방법1
//cmp r0, r1 // r0 <= r1
//ble Loop
cmp r1, r0 // r1 >= r0
bge Loop
//cmp r0 ,r1
//bgt Finish
//Finish
mov r0, r3
mov pc, lr
-실습3-
//방법1
/*
Loop1
cmp r0, r1
subgt r0, r0, r1
cmp r0, r1
sublt r0, r1 ,r0
beq Loop1
*/
//방법2
Loop2
cmp r0, r1
subgt r0, r0, r1
sublt r1, r1, r0
bne Loop2
mov pc, lr
-실습4-
LOOP3
LDR r3, [r1], #4
STR r3, [r0], #4
SUBS r2, r2, #1
//add r4, r4, #LOOP3
//mov r4, #1
//cmp r2, r4
bne LOOP3
-실습5-
LOOP4
LDMIA r1!,{r3-r5}
STMIA r0!,{r3-r5}
SUBS r2, r2, #3
bne LOOP4
Made in SLC
'개발자 공부방 > 임베디드교육' 카테고리의 다른 글
임베디드 용어정리 03 (0) | 2010.04.15 |
---|---|
임베디드 용어정리 02 (0) | 2010.04.15 |
임베디드 용어정리 01 (0) | 2010.04.15 |