목차
레지스터
레지스터는 CPU 내부에 있는 하드웨어 내부에 위치하는 아주 작고 빠른 메모리 공간 입니다.
이들은 데이터를 일시적으로 저장하며, CPU가 처리하는 명령어의 중간 결과나 현재 진행 중인 작업에 필요한 데이터를 보관하는 데 사용됩니다.
레지스터는 데이터 처리의 속도를 향상시키기 위해 필수적인 역할을 합니다.
레지스터의 종류와 역할
레지스터의 종류와 기능은 운영 체제와 CPU 아키텍처에 따라 사용 방법이나 이름이 달라질 수 있습니다.
따라서, 레지스터의 종류와 기능을 완벽히 이해할 필요는 없습니다. 이 부분은 운영체제의 발전과 변화에 따라 바뀔 수 있기 때문입니다.
그러나, 게임 제작을 위해서는 기본적인 패턴과 방법을 알아야 하듯이, 레지스터의 기본적인 기능에 대해 알고 있어야 합니다.
1. 범용 레지스터
•
데이터 레지스터 : 데이터를 임시 저장하거나, 계산 결과를 저장하는 데 사용됩니다.
•
주소 레지스터 : 메모리 주소를 저장하는 데 사용되며, 메모리 접근 명령에서 기준 주소로 사용됩니다. 예를 들어, 베이스 레지스터, 인덱스 레지스터 등이 있습니다.
◦
베이스 레지스터
◦
베이스 레지스터는 주로 참조 지점이나 데이터의 시작 주소를 저장하는 데 사용됩니다.
스택 프레임 내에서 로컬 변수와 매개변수에 접근할 때 기준점으로 사용되는 것이 일반적입니다. 예를 들어, 함수 내에서의 데이터 접근이나, 동적 메모리 할당 영역에 대한 참조를 저장하는 데 활용됩니다.
◦
사용 예시
함수 호출 시, 베이스 포인터는 현재 함수의 스택 프레임 시작 주소를 가리킵니다. 이를 통해, 함수 내부에서 로컬 변수와 매개변수의 주소를 쉽게 계산할 수 있습니다. 예를 들어, BP 레지스터를 사용하여 BP+4, BP+8 등의 방식으로 특정 로컬 변수나 매개변수에 접근할 수 있습니다.
◦
인덱스 레지스터
◦
인덱스 레지스터는 주로 배열이나 리스트와 같은 연속된 데이터 구조 내에서 특정 요소에 접근할 때 사용됩니다. 인덱스 레지스터의 값을 변화시키며 데이터 구조를 순회하거나, 특정 패턴에 따라 메모리 주소를 계산하는 데 사용됩니다.
◦
사용 예시
배열에 있는 요소에 접근할 때, 인덱스 레지스터를 사용하여 배열의 시작 주소로부터 특정 요소까지의 오프셋을 계산합니다. 예를 들어, 배열의 시작 주소가 베이스 레지스터에 저장되어 있고, 각 배열 요소가 4바이트를 차지한다고 가정할 때, BX + (SI * 4) 계산을 통해 배열의 i번째 요소에 접근할 수 있습니다. 인덱스 레지스터의 값을 증가시키며 배열을 순회할 수 있습니다.
2. 프로그램 카운터 또는 명령어 포인터
•
CPU가 다음에 실행할 명령어의 메모리 주소를 가리키는 레지스터입니다. 명령어가 실행될 때마다 이 레지스터의 값은 자동으로 업데이트됩니다.
3. 스택 포인터
•
프로그램의 실행 동안 마지막으로 접근한 스택의 주소를 가리키는 레지스터입니다. 함수 호출, 로컬 변수의 저장 등에 사용됩니다.
스택 포인터에 대해서는 추후 TCB 설명 시에 자세히 다룰 예정입니다.
현재로서는 함수를 실행할 때 스택 포인터가 사용된다는 것만 알고 계시면 충분합니다.
스택 포인터에 대해 미리 공부하고 싶으시다면, 왜 함수가 스택 메모리에서 실행되는 것이 좋은지, 그리고 함수의 실행과 반환에 대한 이해를 통해 공부하시면 도움이 될 것입니다.
4. 세그먼트 레지스터
•
메모리 세그먼트를 가리키는 데 사용되며 코드, 데이터, BSS, 스택, 힙 등 프로세스가 현재 사용하고 있는 메모리 사용 영역을 가리키는 용도입니다.
5. 상태 레지스터 / 플래그 레지스터
•
ㄴU의 상태를 나타내는 플래그들을 포함합니다. 이러한 플래그들은 산술 연산의 결과(오버플로, 제로, 캐리, 사인 등)를 나타내고, 조건부 분기 명령어의 결정에 사용됩니다.