본문 바로가기

레지스터

1. 레지스터(register)


앞서 언급했던 CPU를 구성하는 네 가지 요소(CU, ALU, 레지스터, 클록)에서

프로그래머는 레지스터에 대해 반드시 알고 있어야 한다.

프로그램은 레지스터를 이용해 데이터를 처리하기 때문이다.


다음은 *어셈블리어로 작성된 프로그램의 일부다.


*어셈블리어(assmebly language): 전기 신호인 기계어에 기능을 의미하는 **니모닉을 대응시킨 것.

                                           기계어와 어셈블리어는 기본적으로 1 대 1 대응이다.

                                           참고로 어셈블리어를 기계어로 변환하는 작업을 어셈블(assemble),

                                           그 반대의 작업을 디스어셈블(disassemble)이라 한다.

**니모닉(mnemonic): 인간이 기억하기 쉬운 형태로 이름을 나타내는 기호.

             add는 더한다는 의미를 나타낸 니모닉이라 할 수 있다.


mov eax, dword ptr[ebp-8]        메모리에서 eax로 값을 복사한다.
add eax, dword ptr[ebp-0ch]      eax의 값과 메모리의 값을 더해 eax에 저장한다.
mov dword ptr [ebp-4], eax       eax의 값을 메모리에 저장한다. 


위 코드에서 표시된 부분( eax 와  ebp )는 레지스터를 나타낸다.
이것을 보면 레지스터를 통해 데이터의 이동과 덧셈이 이루어짐을 알 수 있다.

메모리에서는 데이터의 보관 장소를 주소로 구분하지만,
레지스터에서는 종류에 따라 위와 같이 다른 이름을 가지며, 저장하는 데이터의 용도도 다르다.

이처럼 어셈블리어로 된 프로그램을 보면 컴파일된 프로그램이
어떻게 작동하는 지 알 수 있다.

사실 프로그래머의 입장에서는 CPU는 레지스터의 집합체라고 봐도 무방하다.
나머지 세 가지 요소는 그런 게 있다는 것만 알아도 좋다.
하지만 고급 언어로 작성된 프로그램이 컴파일된(기계어로 변환된) 후
CPU 내부에서 레지스터를 통해 처리되는 과정은 반드시 이해해야 한다.

예를 들어,  a = b + 2; 가 기계어로 변환되면
 add 와  mov  등의 명령어에 의해 레지스터에서 처리된다는 것을 알고 있어야 한다.

레지스터를 기능에 따라 대강 분류하면 다음과 같다.

 종류 

 기능

 어큐뮬레이터(accumulator)

 연산의 대상 또는 연산 후의 데이터를 저장한다.

 플래그 레지스터(flag register)

 연산 후 CPU의 상태를 저장한다.

 프로그램 카운터(PC, Program Counter)

 다음 실행할 명령어의 주소를 저장한다.

 베이스 레지스터(base register)

 데이터용 메모리 영역의 시작 주소를 저장한다.

 인덱스 레지스터(index register)

 베이스 레지스터를 기준으로 한 상대 주소를 저장한다.

 범용 레지스터(general register)

 임시 데이터를 저장한다.

 명령어 레지스터(instruction register)

 명령어 저장. 프로그래머는 이 레지스터를 읽고 쓰지 않고,

 CPU가 내부적으로 사용한다.

 스택 레지스터(stack register)

 스택 영역의 시작 주소를 저장한다.


레지스터가 저장하는 값은 크게 데이터명령어의 두 가지로 나뉜다.
그리고 데이터는 다시 연산에 사용되는 데이터메모리 주소를 나타내는 데이터로 나뉜다.
전자는 어큐뮬레이터에, 후자는 베이스 레지스터와 인덱스 레지스터에 저장된다.




2. 베이스 레지스터와 인덱스 레지스터

컴퓨터에 탑재된 메모리에 0x00000000~0xFFFFFFFF의 주소가 할당되어 있다고 하자.
이 범위라면 32비트 레지스터 하나로 모든 주소를 참조할 수 있다.
하지만 (배열처럼) 특정 메모리 영역을 연속적으로 참조하려면
2개의 레지스터를 사용하는 것이 편리하다.

참고할 메모리 영역의 시작 주소를 베이스 레지스터에 넣고
인덱스 레지스터 값만 변화시키는 것이다.

예를 들어 0x10000000~0x10000FFF를 참조하려면 베이스 레지스터에 0x10000000을 넣고
인덱스 레지스터의 값을 0x00000000 0x00000FFF까지 변화시키면 되는 것이다.

이 때 CPU는 두 레지스터 값의 합을 실제로 참조할 메모리 주소로 해석한다.

참고로 인덱스 레지스터의 값은 배열에서의 인덱스에 해당한다.


'Programming > Basis' 카테고리의 다른 글

비트 연산  (0) 2019.03.04
컴퓨터가 2진수를 사용하는 이유  (0) 2019.03.03
CPU가 수행하는 작업  (0) 2019.02.27
조건 분기와 함수 호출  (0) 2019.02.27
프로그램의 작동 원리와 CPU  (1) 2019.02.26