레지스터
- CPU 내부에 있는 작은 임시 저장 장치
- 개발하고 실행하는 프로그램 속의 명령어와 데이터는 실행 전후로 그 관련된 값들이 레지스터 저장된다.
반드시 알아야 할 레지스터
레지스터의 종류는 CPU마다 다르다. CPU마다 레지스터의 개수도 다르고 똑같은 용도인 레지스터도 CPU마다 이름이 다른 경우도 있다. 그럼에도 대부분의 CPU가 공통적으로 사용하는 레지스터들.
- 프로그램 카운터: 현재 CPU가 실행할 다음 명령어의 주소를 저장한다. 명령어가 실행될 때마다, 프로그램 카운터는 다음 명령어의 위치로 업데이트된다. 즉, 갖고 오고자 하는 주소를 CPU로 갖고 왔다면 프로그램 카운터는 1증가.
- 명령어 레지스터: CPU가 현재 실행 중인 명령어를 저장한다. 명령어가 프로그램 카운터로부터 가져와질 때, 그 명령어는 먼저 명령어 레지스터에 로드되고, 그 후 CPU에 의해 해석, 실행된다.
- 메모리 주소 레지스터: 메모리에 접근할 때 사용될 메모리의 주소를 저장한다. CPU가 데이터를 읽거나 쓸 메모리 위치를 나타낸다. 주소버스로 주소를 내보낼 때 거치게 되는 레지스터가 메모리 주소 레지스터.
- 메모리 버퍼 레지스터: 메모리와 CPU 사이에 데이터를 전송할 때 사용되는 레지스터로 메모리에서 읽은 데이터나 메모리에 쓸 데이터를 임시로 저장한다. 데이터 버스로 주고받을 정보 즉 데이터 명령어가 거치는 레지스터.
- 플래그 레지스터: CPU 연산의 결과에 대한 여러 상태 플래그를 저장한다. 산술 연산 결과가 0이면 제로 플래그(Zero Flag)가, 오버플로가 발생하면 오버플로 플래그(Overflow Flag)가 설정된다.
- 범용 레지스터: 다양한 목적으로 사용되는 레지스터로, 프로그래머에 의해 자유롭게 사용될 수 있다. 데이터 연산, 주소 지정, 중간 결과 저장 등에 사용된다.
- 스택 포인터: 스택의 최상단을 가리키는 주소를 저장한다. 함수 호출과 반환, 로컬 변수 저장 등에 사용되는 스택 메모리 영역을 관리한다.
- 베이스 레지스터: 데이터 세그먼트의 시작 주소나 특정 배열의 시작 주소를 저장하는 데 사용된다. 주로 메모리 관리 및 복잡한 데이터 구조체의 참조에 사용된다.
프로그램을 순차적으로 실행할 수 있는 원리가 프로그램 카운터가 1씩 증가하는 것이다라고 보면 된다. 그런데 프로그램 카운터가 마냥 증가만 되는 건 아니다. 프로그램의 순차적인 흐름이 끊기는 경우도 있는데 아래의 이유로 프로그램의 순차적인 실행 흐름이 끊기는 경우가 발생한다.
- 특정 메모리 주소로 실행 흐름을 이동하는 명령어가 실행됐을 경우 (e.g. JUMP, CONDITIONAL JUMP, CALL, RET)
- 인터럽트 발생 시
- ETC…
CPU가 메모리에 접근하는 데 사용되는 두 가지 중요한 방식
스택 주소 지정 방식 (Stack Addressing Mode)
스택 주소 지정 방식은 CPU 내의 스택 포인터 레지스터를 이용하여 메모리 내의 스택 구조에 접근하는 방식이다. 스택은 후입선출(LIFO, Last In First Out) 방식의 자료 구조로서, 마지막에 들어간 데이터가 가장 먼저 나오는 특징을 가지고 있다. 스택 포인터는 스택의 최상단을 가리키며, 데이터가 스택에 추가되거나 제거될 때 업데이트된다.
스택을 사용할 때 주요 두 가지 연산
- 푸시(Push): 데이터를 스택에 삽입. 스택 포인터가 가리키는 주소에 데이터를 저장하고, 스택 포인터를 감소시켜 새로운 '맨 위'의 위치를 업데이트.
- 팝(Pop): 데이터를 스택에서 제거. 스택 포인터의 위치에서 데이터를 읽고, 스택 포인터를 증가시켜 '맨 위'의 위치를 업데이트.
스택 주소 지정 방식은 함수 호출, 로컬 변수의 저장, 임시 값의 저장 등에 널리 사용된다. 이 방식은 프로그램 카운터의 값을 저장할 때 함수가 호출되고 복귀하는 과정에서도 매우 중요하다.
변위 주소 지정 방식 (Displacement Addressing Mode)
변위 주소 지정 방식에서는 베이스 레지스터에 저장된 주소(베이스 주소)와 변위 값(오프셋)을 합산하여 유효주소(최종 메모리 주소)를 계산한다. 이 방식은 배열, 구조체, 또는 기타 연속된 데이터 구조에 대한 접근에 주로 사용된다.
- 베이스 레지스터(Base Register): 배열의 시작 주소나 구조체의 시작 주소, 혹은 함수의 로컬 변수 영역의 시작 주소 등을 가리킬 수 있다.
- 변위(Displacement) / 오프셋(Offset): 베이스 주소로부터의 상대적 거리를 나타낸다. 이는 보통 정적인 값을 가지거나, 루프나 계산에 의해 동적으로 변경될 수 있다.
- 유효주소(Effective Address): 실제 메모리 주소를 가리키며, 베이스 주소와 변위 값을 합산하여 계산된다.
변위 주소 지정 방식은 배열 요소에 접근하거나, 구조체의 특정 필드에 접근할 때 매우 유용하다. 예를 들어, 배열의 n번째 요소에 접근하려면 배열의 시작 주소에 <n * 데이터 타입의 크기>만큼의 변위 값을 더하면 된다.
이 방식은 데이터 구조의 내부에 있는 데이터에 접근할 때 특히 유용하며, 컴파일러가 배열, 구조체, 레코드와 같은 복잡한 데이터 구조체를 메모리에 매핑할 때 자주 사용된다.
스택 주소 지정 방식과 변위 주소 지정 방식 모두 현대 프로그래밍에서 메모리를 효율적으로 관리하고 접근하는 데 있어 필수적인 기법으로, 어셈블리어나 하드웨어 근접 프로그래밍에서 주로 다루어진다.
'컴퓨터구조와 운영체제' 카테고리의 다른 글
10. 빠른 CPU를 위한 설계 기법 (0) | 2023.11.10 |
---|---|
9. 명령어 사이클과 인터럽트 (0) | 2023.11.09 |
7. ALU와 제어장치 (0) | 2023.11.07 |
6. 명령어의 구조와 주소 지정 방식 (0) | 2023.11.06 |
5. 소스 코드와 명령어 (0) | 2023.11.06 |