Direct 모드와 Indirect 모드


Direct 모드                              Indirect 모드          

  LOAD r1, 0x10 실행시                LOAD r1, [0x10] 실행시              

 r0

 

 r0

 
 r1

 ←10     0x10번지

 r1

 0x30                  ↓                 0x10번지

 r2   r2

   ↖                   ↓

 r3

  r3

       ↖   10                            0x30번지

 r4     ir

 

 r4     ir

 
 r5     sp  

 r5     sp

 
 r6     lr  

 r6     lr

 

 r7     pc

 

 r7     pc

 


Direct 모드는 말그데로 메모리에 있는 값을 레지스트로 가져와라 이고

Indirect 모드는  메모리에 있는 값을 다시 메모리로 참조에서 값을 가져오는것이다.  0x10[0x30] → 0x30[10] → r1

※  LOAD r1, [0x10] 여기서 []는 Indirect 모드 라는 표시로 아무거나 써도 상관은없다.



Direct 모드의 문제점


 

 <-  LOAD  ->

 <destination>

<-                    source                   ->

 0

 0

 1

1

0

 0

1

 1

 0

 0

 0

1

 1

 1

   

int a = 10;      //0x0010 번지할당

int b = 20;     //0x0100 번지 할당

int c = 0;       //0x0020 번지 할당

c = a + b;

                                                                                      

LOAD r1, 0x0010 (구성가능)

LOAD r2, 0x0100 (구성불가)


8비트로 표현가능한 수는 0~255이다.

LOAD 명령어를 살펴보면 source 부분은 8비트 밖에 되지않는다.

0x0010같은 경우는 8비트로 표현이 가능하지만 0x0100은 딱봐다 8비트로는 표현이가능하지않는다. 

그럼 명령어로 구성 할 수없는 메모리 주소는 어떻게 사용할 것이가??



문제해결


int a = 10;      //0x0010 번지할당

int b = 20;     //0x0100 번지 할당

int c = 0;       //0x0020 번지 할당

c = a + b ;

명령어로 표현해보면 메모리 주소값문제로 Direct 모드로 표현 할 수없다는 것을 알고있다.

그래서 Indirect 로 풀어보면 


LOAD r1 , 0x0010


MUL r0, 4, 4

MUL r2, 4, 4
MUL r3, r0, r2


STORE r3, 0x0030

LOAD  r2, [0x0030]


ADD r3, r1, r2

 일단 r1에 a값을 넣는것은 그냥 LOAD명령어를 넣으면 된다 

하지만 b값은 메모리주소 0x0100 에 할당되어있어서 명령어로 표현이 불가능하다 그래서 MUL 명령어를 이용해보자.

r0에 4 곱하기 4 연산값을 넣고 r2에도 반복하자.

그리고 r3에 r0와 r2의 값을 곱한값을 넣으면 16*16 즉 256 , 16진수로 0100 이다. r3에보면 0x100이 들어가 있는상태이다.

이제 r3에 있는 값을 0x0030 번지에 값을 넣고 Indirect로 0x0030을 불러와서 r2에 넣으면 r2에 원하던 값을 넣을 수 있게 된다 .


     레지스터                                 메모리

 r0         16

 

 r1         10

   10                                 0x0010(a)

 r2         16

   0                                  0x0020(c)

 r3     265(0x0100)

   
 r4   ir

  0x0100                               0x0030

 r5   sp

  20                                      0x0100

 r6   lr  
 r7   pc  


그림으로 만들어 보면 이런 모양일 것이다.



+ Recent posts