2015년 9월 24일 목요일

windows programming 공부하면서..(5)

레지스터를 디자인하는데 결정해야할 요소

  • 레지스터를 몇 비트로 구성할 것인가?     // 쉬운 이해와 표현을 위해 16bit라고 가정하고 실습
  • 몇 개 정도로 레지스터를 구성할 것인가?     // 8개로 제한 r0~r7
  • 레지스터 각각을 무슨 용도로 사용할 것인가?     //r4~r7은 아래와 같은 용도

16bit에서는 표현할 수 있는 명령어의 개수는 2^16 = 65536개 표현이 가능하다.
(0000 0000 0000 0000 ~ 1111 1111 1111 1111 와 같이 사용하면 65536개가 사용되는 것이다.)

사실상 C / C++언어도 연산자를 포함하는 키워드 갯수가 100개를 넘지 않는다. 그럼 좀 더 효율적인 방법은 어떤게 있을까?

'레지스터 r1에 있는 값과 숫자 7을 더해서 레지스터 r2에 저장하자'

16bit 표현을 위해 쪼개면

'덧셈' , '레지스터 r1' , '레지스터 r2' , '숫자 7'

과 같이 표현이 가능하다. 


그리고 명령어를 표현하는 16bit는 아래와 같은 형태로 표현한다.

' 예약(2bit) ',' 연산자 add(3bit) ','저장소 r2(3bit) ', '피연산자1 r1(4bit) ', '피연산자2 7(4bit) '

피연산자가 1bit가 더 있는 이유는, 피연산자가 레지스터를 의미하는지, 숫자를 의미하는지를 구분하기 위해 사용된다. 예를 들어, 1이면 레지스터를 0이면 숫자 정보를 담고 있다고 구분하는 것이다.

명령어의 흐름은 대략 이러한 흐름을 갖고 있다.우선 만들어진 Assemble가 메모리에 로드되고 I/O버스를 통해 ir레지스터로 올라가고, Control Unit(명령어를 해석)은 그 명령어를 통해 ALU로 전달하게 된다.

LOAD의 명령어 포멧

예약(2bit) , LOAD(3bit) , Destination(3bit), Source(8bit)

destination : 데이터를 저장할 레지스터 정보
source : 데이터를 읽어올 메모리의 주소 정보

메모리에 있는 데이터를 레지스터에 저장.

STORE의 명령어 포멧


예약(2bit) , LOAD(3bit) , Source(3bit) , Destination(8bit)

source : 데이터를 읽어올 레이즈터 정보
destination : 데이터를 저장할 메모리의 주소 정보

레지스터에 있는 데이터를 메모리에 저장.



메모리 접근 방법에는 Direct Addressing모드 Indirect Addressing모드로 나눌 수 있다.


Direct Addressing은 주소값을 명령어에 직접 표현하는 기법이며, Indirect Addressing은 그 단점을 해결하기 위해 등장한 모드이다. 

Indirect모드는 명령어에서 지정하는 번지에 저장된 값을 주소값으로 참조한다. (Direct는 레지스터에 저장할 데이터가 존재하는 주소를 직접적으로 표현한다.)


Indirect 모드는 [] 기호로 주소값을 감싸게 되는 것을 말하며, C에서 pointer와 같은 개념이다. 이러한 Direct와 indirect는 앞에 남겨두었던 2bit(예약)을 이용하여 구분한다.

댓글 없음:

댓글 쓰기