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 / 방향 >

 

Signed and Unsigned Integer

 

 

 

 

 

 

 

 

 

Posted by 하늘_