[컴퓨터 구조] 명령어

수민·2023년 12월 6일
0

CS 공부

목록 보기
4/5
post-thumbnail

혼자 공부하는 컴퓨터 구조 + 운영체제를 읽고 공부한 내용을 복기 목적으로 작성한 글입니다.
이해하기 쉽게 잘 설명되어 있는 책이니 관심있으신 분들은 구매해서 보시는걸 추천드립니다!


컴퓨터가 이해할 수 있는 정보는 크게 데이터명령어로 이루어진다.

데이터 : 컴퓨터와 주고받는 정보나 컴퓨터에 저장된 정보
명령어 : 데이터를 움직이고 컴퓨터를 작동시키는 정보

명령어는 컴퓨터를 작동시키지만,
우리가

#include <iostream>

int main()
{
	std::cout << "Hello World!" << std::endl;
    return 0;
}

이렇게 작성한다고 해도, 이걸 컴퓨터가 바로 알아듣지는 못한다.

왜냐면, 위에 작성한 소스코드와 같은 언어는 고급 언어로, 사람을 위한 언어이기 때문.

내가 작성한 소스코드를 컴퓨터한테 이해시키기

고급 언어와 저급 언어

C, C++, Python, Java와 같은 프로그래밍 언어는 사람을 위한 언어이다.
위와 같은 언어를 고급 언어라고 한다.
컴퓨터는 고급 언어를 이해하지 못한다.
컴퓨터가 이해하기 위한 언어는 저급 언어로, 명령어로 이루어져 있다.

따라서
사람이 고급 언어(프로그래밍 언어)로 작성한 소스코드가 실행되기 위해서는 저급 언어(명령어)로 변환되어야 한다.

저급 언어에는 기계어어셈블리어가 있다.

기계어는 01010101... 와 같은 0과 1의 명령어 비트로 이루어져 있다.
사람이 보고 이해하기 굉 장 히 어렵기 때문에,
사람이 읽을 수 있는 어셈블리어가 있다.
어셈블리어를 통해 컴퓨터에서 프로그램이 실행되는 과정을 관찰할 수 있다.

컴파일 언어와 인터프리터 언어

앞서 말했듯,
개발자가 작성한 소스코드를 컴퓨터가 이해하고 실행하기 위해서는 고급 언어저급 언어로 변환되는 과정이 필요하다.

이 과정은 두 가지로 나뉜다.

소스코드 전체를 한 번에 번역해서 컴퓨터에게 몽땅 주는 방식과, 소스코드를 한 줄 한 줄 번역해주는 방식이다.

1. 컴파일 언어

대표적으로 C/C+이 컴파일 언어에 해당한다.

소스코드가 저급 언어로 변환되는 과정을 컴파일이라고 한다.
내가 작성한 소스코드는 컴파일러라는 도구를 통해 컴파일된다.

소스코드 전체를 한 번에 변환해주기 때문에, 소스코드 전반에 오류는 없는지 검사한다.
만약 하나라도 오류가 있다면 컴파일에 실패한다.

소스코드를 저급 언어로 변환하면 목적 파일로 변환된다.
목적 파일에서 연관된 기능들을 링킹한 뒤에 실행파일로 변경되어, 해당 프로그램이 실행된다.

2. 인터프리터 언어

대표적으로 Python이 인터프리터 언어에 해당한다.
소스코드의 각 줄마다 그 때 그 때 저급 언어로 변환해준다.
1, 2, 3, ... , n 번째 줄을 순서대로 차근차근 변환해주기 때문에,
n번째 줄에 오류가 있다면 n-1번째 줄까지는 저급언어로 변환된다.

일반적으로 컴파일 방식이 인터프리터 방식에 비해 빠르다.
하나의 언어가 컴파일 방식과 인터프리터 방식 모두로 변환될 수 있다.


명령어의 구조

명령어는 연산 코드오퍼랜드로 구성되어 있다.

예를 들어,

12를 더하라

라는 명령어가 있다고 했을 때,
"더하라"라는 수행해야 하는 연산과, "1과 2"라는 수행할 데이터로 이루어졌다고 볼 수 있다.

여기서 연산코드수행해야 하는 연산. 즉 연산자를 의미하고,
오퍼랜드수행할 데이터, 또는 수행할 데이터가 저장된 위치. 즉 피연산자를 의미한다.

이렇게 연산코드와 오퍼랜드가 합쳐져서 하나의 명령어를 구성한다.


오퍼랜드는 수행할 데이터 또는 데이터가 저장된 위치를 의미한다고 했다.
일반적으로 오퍼랜드에는 데이터 본체 보다는, 데이터가 저장된 메모리나 레지스터의 주소가 적힌다.

명령어의 길이가 정해져 있을 때, 연산 코드의 길이만큼을 뺀 만큼이 오퍼랜드 필드가 가질 수 있는 크기가 된다.
오퍼랜드에는 여러 개의 데이터가 저장될 수 있다.
만약 여러 개의 데이터를 모두 각 원본 데이터로 저장하게 되면, 하나의 오퍼랜드 필드가 가질 수 있는 크기가 줄어들게 된다.
왜냐하면 오퍼랜드 필드로 표현될 수 있는 크기를 여러 개가 나눠서 가져야 하기 때문이다.

하지만, 만약 오퍼랜드 필드가 데이터가 저장된 위치를 가리킨다면, 해당 오퍼랜드 필드가 표현할 수 있는 데이터의 크기가 하나의 메모리 주소에 저장할 수 있는 크기만큼 늘어날 수 있다.

주소 지정 방식

피연산자 데이터가 저장된 위치를 유효 주소라고 한다.
그리고, 유효 주소를 찾는 방법을 주소 지정 방식이라고 한다.

CPU는 여러 가지의 주소 지정 방식을 사용한다.

1. 즉시 주소 지정 방식

  • 오퍼랜드 필드에 연산에 사용할 데이터를 직접 명시하는 방식
  • 특징
    • 간단하다
    • 표현할 수 있는 데이터의 크기가 작아진다
    • 빠르다 (데이터를 메모리/레지스터로 찾으러 가지 않아도 됨)

2. 직접 주소 지정 방식

  • 오퍼랜드 필드에 유효 주소를 직접 명시하는 방식
  • 특징
    • 표현할 수 있는 유효 주소에 제한이 있다
      (결국 유효 주소를 표현할 수 있는 범위 = 명령어의 길이 - 연산 코드의 길이)

3. 간접 주소 지정 방식

  • 오퍼랜드 필드에 유효 주소의 주소를 명시하는 방식
  • 특징
    • 표현할 수 있는 유효 주소의 범위가 크다
    • 느리다 (두 번의 메모리 접근)

4. 레지스터 주소 지정 방식

  • 오퍼랜드 필드에 연산에 사용할 데이터를 저장한 레지스터룰 직접 명시하는 방식
  • 특징
    • 빠르다 (메모리 접근 속도 < 레지스터 접근 속도)
    • 표현할 수 있는 레지스터의 크기에 제한이 있다

5. 레지스터 간접 주소 지정 방식

  • 오퍼랜드 필드에 `유효 주소를 저장한 레지스터**를 명시하는 방식
  • 특징
    • 빠르다 (메모리 접근 속도 < 레지스터 접근 속도)
    • 간접 주소 지정 방식에 비해, 메모리 접근 횟수가 1회 줄어든다.

6. 스택 주소 지정 방식

  • 메모리 내 스택 포인터를 이용한다
  • 스택 포인터 : 스택에 마지막으로 저장된 값의 위치를 저장하는 레지스터

7. 변위 주소 지정 방식 : 상대 주소 지정 방식

  • 유효 주소 = 오퍼랜드의 값 + 프로그램 카운터의 값
  • 프로그램 카운터 : 메모리에서 가져올 명령어의 주소를 저장한 레지스터
  • 분기하여 특정 주소의 코드를 실행할 때 사용된다.

8. 변위 주소 지정 방식 : 베이스 레지스터 주소 지정 방식

  • 유효 주소 = 오퍼랜드의 값 + 베이스 레지스터의 값
  • 베이스 레지스터 : 기준 주소
  • 오퍼랜드 : 기준 주소로부터 떨어진 거리
  • 베이스 레지스터에 저장된 기준 주소로 부터 얼마나 떨어져 있는 주소에 접근할 것인지를 연산해서 유효 주소를 얻어내는 방식이다.

profile
우하하

0개의 댓글