레지스터는 CPU 내부의 작은 임시저장장치로 프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장된다.

레지스터

 

로우레벨 개발자들은 레지스터에 들은 데이터를 확인할 일이 많다. 

 

CPU 내부에는 다양한 레지스터들이 있고, 각기 다른 역할을 가진다. 레지스터의 종류는 CPU마다 다르며 공용으로 사용하는 레지스터도 있다.

 

반드시 알아야 할 레지스터에는 다음과 같은 것들이 있다.

  1. 프로그램 카운터 : 메모리에서 가져올 명령어의 주소 (메모리에서 읽어 들일 명령어의 주소)
  2. 명령어 레지스터 : 해설할 명령어 (방금 메모리에서 읽어 들인 명령어)
  3. 메모리 주소 레지스터 : 메모리의 주소 (CPU가 읽어 들이고자 하는 주소를 주소 버스로 보낼 때 거치는 레지스터)
  4. 메모리 버퍼 레지스터 : 메모리와 주고받을 값 (데이터와 명령어) (CPU가 정보를 데이터 버스로 주고받을 때 거치는 레지스터) 
  5. 플래그 레지스터 :  연산 결과 또는 CPU 상태에 대한 부가적인 정보를 저장하는 레지스터
  6. 범용 레지스터 : 다양하고 일반적인 상황에서 자유롭게 사용 가능한 레지스터
  7. 스택 포인터 : 주소 지정에 사용
  8. 베이스 레지스터 :  주소 지정에 사용

 

 

위 그림처럼 CPU가 처리하고자 하는 프로그램이 1000번지 부터 ~ 1500번지까지 있다고 가정해보자 또 처음부터 프로그램을 실행한다고 가정했을때 프로그램 카운터에는 1000번지가 저장될 것이다.

 

프로그램 카운터에 저장

 

프로그램 카운터가 1000번지 프로그램을 실행하기 위해서는 메모리에 있는 1000번지 데이터를 가져와야 하는데 이때 메모리에 접근하기 위해서 메모리 주소 레지스터를 거치게 된다. (복사가 된다)

메모리 주소 레지스터

 

메모리 제어 신호를 통해 몇번지 메모리를 읽고 싶은지 메모리에게 쏴준다.

메모리 읽기

 

그렇게 되면 메모리는 1000번지에 저장된 값을 메모리 버퍼 레지스터로 데이터 버스를 통해 전달한다. 

전달한 이후 프로그램 카운터는 1이 증가한다. 다음으로 실행할 주소값을 셋팅한다.

 

메모리 -> 메모리 버퍼 레지스터

 

이렇게 가지고 온 1101 명령어를 제어장치가 해석하기 위해서 명령어 레지스터에 복사하게 된다. 

명령어 레지스터로 이동

 

위에서 강조된게 프로그램 카운터는 1 증가한다고 하였는데 이것이 프로그램이 순차적으로 실행할 수 있는 원리가 된다.

 

프로그램 카운티 1증가

 

하지만 항상 이렇게 순차적으로 프로그램이 실행되는 것은 아니다. 

  • 특정 메로리 주소로 실행 흐름을 이동하는 명령어 실행 시 ex) JUMP, CONDITIONAL, CALL, RET
  • 인터럽트 발생 시

위와 같은 경우에 순차적인 흐름이 끊기게 된다.

 

스택 포인터 레지스터에 대해 알아보자.

  • 스택 주소 지정 방식 : 스택과 스택 포인터를 이용한 주소 지정 방식 
  • 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터 

스택 포인터

 

위 그림과 같이 4번지까지 스택이 차있으면 스택 포인터에는 4번지 주소값이 저장된다. 

 

스택은 어디에 있을까??

 

스택은 메모리에 스택 영역이라는 곳에 존재한다.

스택 영역

 

다음은 베이스 레지스터에 대해 알아보자.

  • 변위 주소 지정 방식  : 오퍼랜드 필드의 값(변위)과 특정 레지스터의 값을 더하여 유효 주소 얻기

변위 주소 지정 방식에서 사용되는 특별한 레지스터이다.

변위 주소 지정 방식이란 오퍼랜드라는 값을 변위로 삼고 특정 레지스터에 있는 값을 더해서 유효 주소를 얻어내는 주소 지정 방식이다.

변위 주소 지정 방식

 

어떤 레지스터에 어떤 변위를 더할것인지 정해야 하기 때문에, 변위 주소 지정 방식을 사용하는 명령어는 다음과 같은 모양을 띄고 있다.

변위 주소 지정 방식 명령어

 

변위 주소 지정 방식에서 어떤 특정 레지스터의 값을 더할것이지에 따라 분류가 된다.

  • 상대 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더하여 유효 주소 얻기

상대 주소 지정 방식

 

위 그림은 다음으로 읽을 메모리 주소에서 3번째 전의 명령어를 실행해라 라는 명령어를 실행하려면 위 그림과 같이 표현할 수 있다.

 

  • 베이스 레지스터 주소 지정 방식 : 오퍼랜드 필드의 값(변위)과 베이스 레지스터의 값을 더하여 유효 주소 얻기

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

베이스 레지스터 주소 지정 방식의 경우 베이스 레지스터는 기준 주소역할을 한다. (=프로그램의 시작점) 그 기준으로 부터 오퍼랜드 필드 만큼 떨어져 있는 주소에 접근하고 싶을때 사용한다.

 

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

빠른 CPU를 위한 설계 기법  (0) 2024.06.28
명령어 사이클과 인터럽트  (1) 2024.06.27
ALU와 제어장치  (1) 2024.06.25
소스 코드와 명령어  (0) 2024.06.24
0과 1로 문자를 표현하는 방법  (1) 2024.06.21

ALU

ALU

계산을 하기 위해서는 피연산자수행할 연산이 필요하다.

ALU는 레지스터로부터 피연산자를 받아들이고, 제어장치로부터 제어 신호를 받아들인다. 결과값을 레지스터에 담아준다.

 

메모리가 아닌 레지스터에 저장하는 이유가 뭘까? CPU가 메모리에 접근하는 것 보다 레지스터에 접근하는것이 훨씬 빠르기 때문이다.

 

 

플래그에 대해 알아보자

 

플래그

 

ALU가 계산한 값이 음수라면 연산 결과가 음수다라는 플래그 값이 플래그 레지스터에 담기게 된다. 

 

플래그의 종류

 

 

제어장치 - 받아들이는 정보

제어장치

 

위에서 클럭이란 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위이다.

클럭

 

명령어 레지스터라는 특수한 레지스터에 의해 해석할 명령어가 제어장치에 입력되게 된다. 받아들인 명령어를 해석하여 제어신호를 내보낸다.

 

여러 장치들의 제어신호를 감지한다. ex) 입출력 장치

 

 

 

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

명령어 사이클과 인터럽트  (1) 2024.06.27
레지스터  (1) 2024.06.26
소스 코드와 명령어  (0) 2024.06.24
0과 1로 문자를 표현하는 방법  (1) 2024.06.21
0과 1로 숫자를 표현하는 방법  (0) 2024.06.20

개발자가 작성한 소스 코드를 컴퓨터는 어떻게 실행할까?

 

소스 코드
소스변환

 

개발자가 작성한 소스 코드는 고급 언어에 해당하고 이를 컴퓨터가 이해하고 실행할 수 있는 저급 언어로 변환을 해야한다.

 

저급 언어에는 2가지가 존재한다.

저급 언어

저급 언어 

 

1. 기계어

기계어

0과 1로 이루어진 언어 = 명령어로 이루어진 언어이다. 위에 0과 1이 명령어라고 생각하면 된다.

사람 입장에서 이것을 해석하는 것은 알기가 너무 어렵다. 이것을 조금 알아보기 쉬운 저급 언어로 변환한 것이 어셈블리어이다.

 

2. 어셈블리어

어셈블리어
어셈블리어 명령어
어셈블리어 예시

 

고급 언어

고급 언어

 

1. 컴파일 언어

컴파일 언어

 

고급언어가 컴파일러라는 특수프로그램에 의해 컴파일이 된다. 그렇게 되면 명령어로 이루어진 저급 언어로 변환이 된다.

 

 

 

2. 인터프리트 언어

소스 코드를 한 줄씩 실행해주는 언어. (컴파일을 할 수 있는지 없는지 확인)

인터프리터에 의해 한 줄씩 실행된다.  소스 코드 전체가 저급 언어로 변환되기까지 기다릴 필요가 없다

인터프리트 언어

 

컴파일 언어와 인터프리트 언어 비교

컴파일 방식 vs 인터프리트 방식

 

컴파일 & 인터프리트 과정 살펴보기

https://godbolt.org/

 

Compiler Explorer

 

godbolt.org

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

레지스터  (1) 2024.06.26
ALU와 제어장치  (1) 2024.06.25
0과 1로 문자를 표현하는 방법  (1) 2024.06.21
0과 1로 숫자를 표현하는 방법  (0) 2024.06.20
컴퓨터 구조를 알아야 하는 이유  (0) 2024.06.19

+ Recent posts