System Data Structure 을 기반으로 여러 Instruction들을 사용하여, 많은 실행, 동작들을 할 수 있다. ARM의 특징은 Load / Save 라고 배웠으며, 따라서 ARM의 모든 동작은 메모리로부터, 메모리에게 Load 와 Save 를 하면서 여러 연산들은 레지스터에서 처리한다. 그럼 이제부터 모든 Instructions 의 기본이 되는 Load 와 Save Instructions 을 알아보자.
Load / Store instructions
- Single register data transfer ( LDR / STR : Register )
- STR r0, [ r5 ] @ r0 := memory [r5] / 방향 >
à ‘레지스터 r5 (r5, r0 들은 레지스터 번지 수를 뜻한다.)’ 안에는 ‘메모리 주소 값’이 있다. 주소가 0x30000000인 ‘메모리’에 ‘레지스터 r0’ 안에 있는 값인 0x12345678 (16진 data)을 저장한다. ( [ x ] 는 x 의 주소를 갖는 메모리가 가지고 있는 값’을 뜻한다.)
r5 = 0x30000000 @ r5 레지스터에 '0x30..' 값은 '메모리 주소 값'이다.
r0 = 0x12345678 @ r0 레지스터에 '0x12..' 값이 들어있다. 이를 'r5 의 값'을 주소로 갖는 메모리에 작성한다.
- LDR r1, [ r5 ] @ memory [r5] := r1 / 방향 <
à 위 STR 에 이어, 주소가 (r5의 값) 0x30000000 인 메모리에서 Single Register에 해당하는 1 워드( 32비트 단위 )를 레지스터 번지 수 r1 으로 읽어낸다. r1 에 r5 값을 주소로 갖는 메모리에 있던 값이 들어간다.
r5 = 0x30000000 @ r5 레지스터에 '0x30..' 값은 '메모리 주소 값'이다.
r1 = 0x12345678 @ 'r5 의 값'을 주소로 갖는 메모리에 있는 값을 r1 레지스터에 넣는다.
- Block data transfer ( LDM / STM : Multiple )
- STMIA r0, { r2 - r9 } @ move the words to mem[r0] / 방향 <
à STR 하고 하는 일은 유사하지만, 어디서 어디로 저장하는지에 대한 방향이 틀리다. r0 이 값을 받아내거나, 보류하는 기능을 하는 레지스터가 아니라 메모리 주소를 가리키는 포인터이다. LDMIA도 마찬가지이다. 그냥 STR 에서는 싱글 레지스터에 해당하는 작은 값 (단지 1 Word = 32 bits)을 저장하는 것이 아니라, { r2 에서 r9 까지 }의 8개의 words를 읽어서 r0 이 갖고 있는 '메모리 주소 값'이 가리키고 있는 메모리에 순차적으로 저장한다.
r0 = 0x30000000 @ r0 레지스터에 '0x30..' 라는 '메모리 주소 값'을 갖는다.
이 r0 값이 가리키는 메모리부터 순서대로 8 words 만큼 저장하게 된다.
{ r2 - r9 } @ r2 부터 r9 까지의 레지스터에 저장 되어있는 8 words 만큼을 읽어낸다.
- LDMIA r1, { r2 - r9 } @ move 8 words at mem[r0] ( MIA : Multiple In Array ) / 방향 >
à 8개 레지스터에 저장될 내용(8 words)을 r1이 가리키는 주소로부터 읽어내어 r2, r3, r4, ... , r9 에 저장한다. 방향이 LDR 과는 달리 반대 방향이다. 자세히 설명하자면, r1 이 값을 받아내거나, 보류하는 기능을 하는 레지스터가 아니라 메모리 주소를 갖는 포인터와 같은 개념이다. STMIA도 마찬가지이다.
r1 = 0x30000000 @ r1 레지스터에 '0x30..' 라는 '메모리 주소 값'을 갖는다.
이 r1 값이 가리키는 메모리부터 순서대로 8 words 만큼을 읽어내게 된다.
{ r2 - r9 } @ r2 부터 r9 까지의 레지스터에 r1이 가리키는 메모리부터 8 words 만큼을 읽어 저장한다.
- Single Data Swap ( SWP )
- Used for semaphore implementation
SWP{cond} {B} Rd, Rm, [ Rn ] @ Rd := [ Rn ], [ Rn ] := Rm
Load / Store for Bytes or Half-words
- LDRB r1, [ r2 ] @ r1 := mem[r2] In Byte / 방향 <
- STRB r3, [ r4 ] @ mem[r4] := r3 In Byte / 방향 >
- LDRH r1, [ r2 ] @ r1 := mem[r2] In Unsigned Short / 방향 <
- STRH r3, [ r4 ] @ mem[r4] := r3 In Unsigned Short / 방향 >
- LDRSH r1, [ r2 ] @ r1 := mem[r2] In Signed Short / 방향 <
- STRSH r3, [ r4 ] @ mem[r4] := r3 In Signed Short / 방향 >
'시스템 프로그래밍 > - 강의 정리' 카테고리의 다른 글
시스템 프로그래밍 - 4 (2) : Data Processing Instructions - Arithmetic operations (0) | 2012.04.05 |
---|---|
시스템 프로그래밍 - 4 (1) : Data Processing Instructions - Logical operations (0) | 2012.04.05 |
시스템 프로그래밍 - 2 : System Data Structure (시스템 데이터 구조) (0) | 2012.04.04 |
시스템 프로그래밍 - 1 (2) : ARM(SoCs) 개발, 공부를 위한 환경 구축하기 (0) | 2012.03.12 |
시스템 프로그래밍 - 1 (1) : 시스템 공부의 의의 (0) | 2011.03.05 |