앞에서 말했던 cpu의 네 가지 요소 중에서 프로그래머가 꼭 알고 있어야 하는 부분은 레지스터뿐입니다. 따라서 나머지 세가지 요소에 대해서는 별로 신경 쓸 필요가 없습니다. 그렇다면 왜 다른 요소가 아닌 레지스터를 꼭 알아야 하는 걸까요? 이것은 프로그램이 레지스터를 이용해서 처리하기 때문입니다.
리스트 1-1은 어셈블리어로 작성된 프로그램의 일부입니다. 어셈블리어는 원래 전기 신호인 각 기계어 명령어(instructiojn)그 기능을 의미하는 영어로 된 줄임말입니다. 예를 들어 mov와 add 는 각각 데이터의 이동(move)와(addition)기능을 나타내는 명령어 입니다. 이와 같이 어셈블리어와 기계어는 기본적으로 1:1 대응하고 있습니다. 어셈블리어는 그 특성이 basic 이나 c 언어 드의 고급 언어와 크게 다르기 때문에 cpu 의 작동을 설명할 경우 어셈블리어가 적합합니다. 어셈블리어로 된 프로그램을 기계어로 변환하는 것을 어셈블, 반대로 기계어로 된 프로그램을 어셈블리어로 변환시키는 것을 역어셈블 이라고 것도 기억해 둡시다.
어셈블리어로 된 프로그램을 보면 기계어로 변화된 프로그램이 어떻게 작동하는지 자세히 알 수 있습니다. 리스트 1-1에 어셈블리어 프로그램을 그대로 나타낸 이유는 기계어로 이루어진 프로그램이 레지스터를 이용해 명령어들을 처리하고 있는 모습을 제시하려고 앳기 때문입니다. 즉 프로그램머의 관점에서 보았을때 'cpu는 레지스터의 집합체이다' 라고 할 수 있습니다. 제어 장치와 연산 장치, 그리고 클록 등의 다른 요소들은 그것들이 있다는 사실만 알아도 됩니다.
리스트 1-1의 코드에 포함된 eax 와 ebp는 레지스터를 나타냅니다. 이것을 보념, 레지스터를 이용해 데이터의 이동 및 덧셈 등의 명령어가 실행되고 있다는 사실을 알 수 있습니다 또한 이 어셈블리어는 80836* 이후의 cpu용이고, eax와 ebp는 cpu의 내부에 있는 레지스터의 명칭입니다. 메모리에서 데이터의 보관 장소는 어드레스로 구분되지만, 레지스터는 그 종류에 따라 이름을 가지고 있습니다.
약간 어려운 단어들이 계속 나오고 있습니다만, 이것은 특정 cpu가 가진 레지스터의 종류를 모두 알아야 한다는 의미가 아닙니다. 그리고 어셈블리어를 마스터할 필요가 잇다는 말도 아니므로 안심해도 됩니다. 그러나 cpu가 프로그램을 어떻게 처리하고 있는가는 반드시 기억해야 합니다.
이것은 다시 말해서 여러분이 고급 언어로 작성한 프로그램이 컴파일 과정을 거쳐 기계어로 변환된 후 최종적으로는 cpu 내부에서 레지스터를 통해 처리되는 과정입니다. 즉 고급 언어로 작성된 프로그램인 a=b+c가 기계어로 변환되면, 레지스터로 사용되어 가산 및 보관 드의 명려어를 처리한다는 점을 기억해야 한다는 뜻입니다.
cpu의 종류가 다르면, 그 내부에 있는 레지스터의 수와 종류 및 레지스터에 보관할 수 있는 데이터의 크기도 달라집니다. 그 역할에 따라 대충 레지스터을 분류한다면, instruction 또는 data 처럼 두 종류의 값을 보관하게 됩니다. 그리고 데이터에슨 연산에 사용되는 것(operand)과 메모리 어드레스를 나타낸느 것등 두 종류가 있습니다.
레지스터의 종류 역할
어큐뮬레이터 연산의 대상이 되는 데이터 저장
플래그 레지스터 연산 처리 후 cpu의 상태 저장
프로그램 카운터 다음에 실행할 명령어가 보관된 어드레스 저장
베이스 레지스터 데이터용 메모리 영역에서 첫번째 어드레스 저장
인텍스 레지스터 베이스 레지스터에서 상대 어드레스 저장
범용 레지스터 임의의 데어터 저장
명령어 레지스터 명령어 그 자체를 저장, cpu가 내부적으로 사용하는데, 프로그래머가 프로그램에 포함된 코드를 통해 이 레지스터의 값을 읽고 쓰는 것은 불가능.
결국 사용하는 값의 종류에 따라 보관하는 레지스터의 종류도 달라집니다. 그리고 cpu 안에 있는 레지스터는 이와 같이 각각 역할이 다릅니다. 연산에 사용되는 값은 accumulator 에 보관되고, 메로리 어드레스를 나타내는 값은 베이스 레지스토와 인텍스 레지스터에 보관됩니다. 참고로 리스토 1-1 의 프로그램에 나타난 eax 와 ebp는 모두 범용 레지스터입니다.
cpu 의 구조를 그려 보면 그림 1-3과 같이 되는데, 여기에서 역할이 다양한 레지스터의 집합체가 바로 cpu입니다. 일반적인 경우 프로그램 카운터, 어큐뮬레이터및 플레그 레지스터는 하나씩맘 닛고, 그 외의 레지스터는 여러 개입니다. 프로그램 카운터와 프래그 레지스터는 특수한 레지스터이므로 나중에 자세히 설명하겠습니다. 그리고 그림 1-3엣는 프로그램머가 몰라도 되는 레지스터(명령어 레지스터 등)가 생략되어 있습니다.