'간접 주소 지정'에 해당되는 글 1건

-Immediate Addressing 즉시 주소 지정 방식
operand 가 instruction에 포함된다.
ex)  Add r3 r1 r2 
     : operand인 r3 r1 r2가 함께전달된다

장점 :  여러번 실행없이 한번의 연산으로 읽어서 사용하기 때문에 빠르다.
단점 :  operand를 같이 보내기때문에 operand크기 제약이있다.


-Direct Addressing 직접 주소 지정 방식
instruction의 operand에 직접적인 주소가 들어간다.
ex) Load r1, 0x10
    : 0x10이라는 직접적인 주소가 들어간다.
단점 : 16bit cpu라고하면 8bit정도가 명령어,예약필드로 쓰였다면 8bit주소밖에 표현못한다. 주소공간 제한.

-Indirect Addressing 간접 주소 지정 방식
위의 문제를 해결하기위한 하나의 방식이라고 할수있다.

16bit 레지스터이고

int a=10; //0x0010번지 할당
int b = 20; //0x0100번지 할당
int c = a+b; //0x0020번지 할당
을 하고싶다고 해보자.

LOAD r1,0x10
LOAD r2,0x0100
//안됨!!

여기서 문제가있다. 예약,명령어필드가 4bit이고 첫 operand r1이 4bit라 하자.
0x100이 8bit(0xff)가 넘어가기 때문에 이 주소값은 표현할수없기 때문이다.

RISC cpu의명령어는 대체로 복잡한 연산의 명령어를 제공하지 않는다.
우리가 디자인한 cpu는 LOAD ,STORE ,사칙연산이 전부다. 레지스터에 뭘저장하거나 하는 연산도없다.
따라서 사칙연산으로 0x100을 만들어보자

mul r0,4,4
mul r2, 4,4
mul r3, r0 ,r2
4bit/ 4bit/4bit/4bit
//0x100만들기!

이제 LOAD r2,r3 하고 싶지만(실제값 메모리값 대신 레지스터 지정방식) r3위치에 항상 메모리의 주소가 오게끔 설계했다고 하자. 

//~
잠깐 다른생각을 해보면 r3위치에 레지스터도 오게끔 했다면 어떤 단점이있을지 생각해보자.
레지스터와 메모리주소를 구분하기위해 1bit로 구분지어야한다. 메모리 표현이 3bit로 적어진다. 또한 그것을 구분하기 위해 cpu연산에 있어서 분명 어떠한 비용이 들것이다. 이와같이 설계했을때 장점과 단점을 잘 생각해보아야한다.
~//


r3에는 0x100이 들어있고
나는 LOAD r2,0x100을 하고싶다... 어떻게 하면좋을까?

STORE r3, 0x0030  //임시로 r3에있는 값을 적당한 아무곳에 저장
LOAD r2, [0x0030]  //indirect모드로 LOAD시키기
//메모리를 두번참조한다. 느리다..
0x0030으로가서 0x0100값을 보고 다시 0x0100으로간다.

이제나머지연산...
ADD r3 r1,r2
STORE r3,0x20


레지스터로 주소넘기는 LOAD r2,r3 방법이 편한것같기도 하다. 지금은 추상적이라 모르겠지만 요약하자면 명령어 설계시 다양한 방법이있고 속도측면과 복잡도 측면을 생각하여 설계해야 할것이다.


블로그 이미지

pringlee

하드코어보단 캐주얼!

,