관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

CPU의 작동 원리 3 - 레지스터 2 : 특정 레지스터를 이용한 주소 지정 방식 본문

알고리즘 및 자료 관리/컴퓨터 구조 & 운영체제

CPU의 작동 원리 3 - 레지스터 2 : 특정 레지스터를 이용한 주소 지정 방식

huenuri 2024. 10. 15. 12:28

특정 레지스터를 이용한 주소 지정 방식은 두 가지가 있다. 하나는 스택 주소 지정이고, 다른 하나는 변위 주소 지정 방식인데 이제부터 차근차근 학습해 볼 것이다. 컴퓨터 구조는 처음 들어보는 용어들이 많아서 낯설고 많이 어렵다. 그래도 포기하지 않고 이틀째 공부를 계속하고 있다.

아마 3일만에 이 책 전체를 다 마치는 건 불가능할 것 같고 목요일까지 4일에 걸쳐 학습해 보기로 일정을 수정해 본다.


 

 

 

특정 레지스터를 이용한 주소 지정 방식 1 : 스택 주소 지정 방식

 

스택 포인터는 스택 주소 지정 방시이라는 주소 지정 방식에 사용되고, 프로그램 카운터와 베이스 레지스터는 변위 주소 지정 방식이라는 주소 지정 방식에 사용된다. 먼저 스택 주소 지정 방식에 대해 알아보겠다.

스택 포인터는 스택 마지막으로 저장한 값의 위치를 저장하는 레지스터이다.

 

예를 들어 위에서부터 주소가 매겨져 있고 아래부터 차곡차곡 데이터가 저장되어 있는 스택이 있다고 가정해 보자. 이때 스택 포인터는 스택의 제일 꼭대기의 주소, 즉 4번지를 저장하고 있다. 

 

 

만약 4번지가 나가면 스택에는 2와 3이 남고, 스택의 꼭대기 주소가 달라졌기 때문에 스택 포인터는 5번지를 가리킨다.

 

 

 

반대로 스택에 데이터를 추가한다면 현재 스택에 4라는 데이터가 저장되어 스택 포인터는 4번지를 가리키게 된다.


 

 

그럼 스택은 도대체 어디에 있는 것일까? 스택은 메모리 안에 있다. 정확히는 메모리 안에 스택처럼 사용할 영역이 정해져 있다. 이를 스택 영역이라고 한다. 이 영역은 다른 주소 공간과는 다르게 스택처럼 사용하기로 암묵적으로 약속된 영역이다.


 

 

 

 

특정 레지스터를 이용한 주소 지정 방식 2 : 변위 주소 지정 방식

지난 장에서 명령어는 연산 코드와 오퍼랜드로 이루어져 있다고 언급했었다. 그리고 오퍼랜드 필드에서 메모리의 주소가 담길 때도 있다. 변위 주소 지정 방식은 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정 방식이다. 즉 오퍼랜드의 값을 변위로 삼는다.

 

 

 

그래서 변위 주소 지정 방식을 사용하는 명령어는 다음 그림과 같이 연산 코드 필드, 어떤 레지스터의 값과 더할지를 나타내는 레지스터 필드, 주소를 담고 있는 오퍼랜드 필드가 있다.

 

이때 변위 주소 지정 방식은 오퍼랜드 필드의 주소와 어떤 레지스터를 더하는지에 따라 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식 등으로 나뉜다.

 

 

 

상대 주소 지정 방식

 

프로그램 카운터에는 읽어 들일 명령어의 주소가 저장되어 있다.  만약 모퍼랜드가 음수인 -3이었다면 CPU는 읽어 들이기로 한 명령어로부터 '세 번째 이전' 번지로 접근한다. 한마디로 실행하려는 명령어 세 칸 이전 번지 명령어를 실행하는 것이다.

 

반대로, 오퍼랜드가 양수인 3이었다면 CPU는 읽어 들이기로 한 명령어의 '세번째 이후' 번지로 접근한다. 즉, 실행하려는 명령어에서 세 칸 건너뛴 번지를 실행한다.

상대 주소 지정 방식은 프로그래밍 언어의 if문과 유사하게 모든 코드를 실행하는 것이 아닌, 분기하여 특정 주소의 코드를 실행할 때 사용된다.


 

 

 

베이스 레지스터 주소 지정 방식

 

여게서 베이스 레지스터는 '기준 주소', 오퍼랜드는 '기준 주소로부터 떨어진 거리'로서의 역할을 한다. 이 지정 방식은 베이스 레지스터 속 기준 주소로부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산하여 유효 주소를 얻어내는 방식이다. 가령 베이스 레지서터에 200이라는 값이 있고 오퍼랜드가 40이라면 기준 주소 200번지로부터 40만큼 떨어진 240번지로 접근하라는 것을 의미한다.

 

 

 


 

 

 

 

상용화된 CPU 속 레지스터 및 주소 지정 방식

이로써 CPU를 구성하는 ALU, 제어장치, 레지스터를 모두 학습했다. 이쯤에서 우리는 선택해야 한다. 지금까지  배운 내용만 익히는데 CPU의 큰 그림만 그리고 싶었던 사람은 바로 다음 절로 넘어가도 좋다.

하지만 자신이 실제 CPU 작동법을 자세히 관찰해야 하는 개발자, 이를테면 임베디드 개발자, 게임 엔진 개발자, 보안 솔루션 개발자, 시스템 해커 등을 지망한다면 아직 하나의 단계가 더 남아있다.

 

사실 CPU는 우리가 학습할 컴퓨터 부품 중 전공서 속의 모습과 실제 모습이 가장 다른 부품이라 할 만큼 다소 괴리가 있다. 그래서 전공서의 설명만 읽고 실제 CPU의 자세한 작동법을 분석하려고 하면 책과는 다른 모습에 당황할 수도 있다.

이러한 괴리는 레시스터, 정확히 말하면 레지스터 이름 때문에 발생한다고 본다. CPU 제조사마다 레지스터 이름이 다르고 역할도 조금씩 다르다.

만약 자신이 실제 CPU의 작동법을 자세히 관찰하고 분석하길 원한다면 상용화된 CPU 속 레지스터를 들여다볼 필요가 있다.

 

여기 가장 대중적인 CPU인 x86(x86-64)과 ARM의 레지스터에 대한 링크를 첨부해 본다. 지금은 이해할 수 없겠지만 다음에 꼭 이 부분을 다시 학습해 볼 것이다. 난 게임 엔진 개발자를 지향하니 이 내용을 깊이 있게 공부할 필요가 있을 것 같다.

 

레지스터 추가 학습 자료

 

self-learning-cs/registers/registers.md at main · kangtegong/self-learning-cs

『혼자 공부하는 컴퓨터구조 & 운영체제』 (한빛미디어) 심화자료. Contribute to kangtegong/self-learning-cs development by creating an account on GitHub.

github.com


 

 

 

 

 

단원 마무리하기

 

 

1을 증가시키는 것은 데이터 버스를 통해 메모리 버퍼 레지스터로 전달된 다음이다. 하지만 여기서는 메모리 버퍼 레지스터에 아직 값이 들어있지 않으므로 메모리 주소 레지스터로 2100번지를 보내게 된다. 그러니까 답은 2100이다.

 

 

 

 

2번은 아직 내용을 암기하지 못해서 틀렸다. 프로그램 카운터와 범용 레지스터를 반대로 썼다. 나머지를 잘 썼다.


 

 

 

학습을 마치고

문제까지 모두 풀어보았다. 절반이나 틀려서 마음이 좋지 않지만, 그래도 모르는 건 틀리는 게 다음을 위해서 더 좋다는 걸 알고 있다. 그래도 절반은 맞았으니 어느 정도의 개념은 이해한 것 같다.

레지스터 단원은 솔직히 많이 지루하고 재미는 없어서 공부에 집중이 잘 되지 않았다. 그래도 꼭 필요한 부분이니 집중해서 오후에 나머지 공부를 진행해 볼 것이다.