도서 정리/혼자 공부하는 컴퓨터 구조 + 운영체제

[혼자 공부하는 컴퓨터 구조 + 운영체제] 3강 명령어

라일라엘 2025. 1. 11. 22:53

고급 언어와 저급 언어

  • 고급 언어 : 사람이 이해할 수 있는 언어.
  • 저급 언어 : 컴퓨터가 직접 이해하고 실행할 수 있는 언어. 명령어로 이루어져있다.

저급언어는 기계어와 어셈블리어로 나뉜다.

  • 기계어 : 0과 1의 비트로 이루어진 언어.
  • 어셈블리어 : 0과 1의 명령어 비트를 사람이 읽기 좋게 매핑한 명령어로 번역한 언어.

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

  • 컴파일 : 소스코드를 저급 언어로 변환하는 과정
  • 컴파일러 : 컴파일을 수행하는 도구
  • 목적 코드 : 컴파일러를 통해 저급 언어로 변환된 코드
  • 컴파일 언어 : 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어.
  • 인터프리터 : 소스코드를 한 줄씩 차례로 실행하며 실시간으로 번역하는 도구
  • 인터프리터 언어 : 인터프리터에 의해 소스코드가 한 줄씩 실행되는 고급 언어

컴파일 언어와 인터프리터 언어의 경계는 모호하다. 컴파일러와 인터프리터를 함께 사용하는 언어가 많기 때문이다.

목적코드는 컴퓨터가 바로 실행할 수 없다. 여러개의 목적코드를 하나로 묶는 링킹 과정을 추가로 거쳐야 한다. 링킹을 통해 생성된 파일이 컴퓨터가 실행할 수 있는 파일인 실행파일이다.

명령어의 구조

연산 코드와 오퍼랜드

명령어는 연산 코드와 오퍼랜드로 나눌 수 있다.

  • 연산 코드 : 명령어가 수행할 연산
    • 데이터 전송, 산술/논리 연산, 제어 흐름 변경, 입출력 제어가 가능하다.
  • 오퍼랜드 : 연산에 사용할 데이터 또는 데이터가 저장된 위치.
    • 오퍼랜드는 명령어의 종류에 따라서 없을수도 있고, 여러개일수도 있다. 오퍼랜드가 없으면 0-주소 명령어, 하나만 있으면 1-주소 명령어 처럼 오퍼랜드의 개수에 따라서 n-주소 명령어와 같은 이름으로 불린다.
    • 오퍼랜드 필드에는 데이터가 직접 명시되기보단, 오퍼랜드가 저장된 레지스터의 이름이 담기는 경우가 많다. 그래서 오퍼랜드 필드를 주소필드라고 부르기도 한다.

주소 지정 방식

명령어는 제한적인 크기를 가지고 있다. 이 크기는 아키텍처와 명령어 체계에 따라 다르다. 예를들어 하나의 명령어는 16비트의 크기를 가지고 있다고 가정해보자. 이때 명령 코드의 크기가 4비트라면 12비트로 오퍼랜드를 표현해야한다. 만약 3-주소 명령어라면 하나의 오퍼랜드는 4비트만으로 표현되어야한다.

이때 연산해야 하는 데이터의 크기가 4비트를 넘어간다면 어떻게 해야할까? 이런 문제를 해결하기 위해 주소 지정 방식이 존재한다.

대표적인 주소 지정 방식은 다음과 같다.

  • 즉시 주소 지정 방식
    • 오퍼랜드에 직접 데이터를 넣는 방식이다. 표현할 수 있는 데이터의 크기가 매우 작다는 단점이 있지만, 가장 빠른 주소 지정방식이다.
  • 직접 주소 지정 방식
    • 유효 주소를 직접 명시하는 방법이다. 즉시 주소 지정 방식보다 표현할 수 있는 데이터의 범위가 넓지만, 여전히 제한이 존재한다. 속도는 즉시 주소 지정 방식보다는 다소 느리다.
  • 간접 주소 지정 방식
    • 유효 주소의 주소를 명시하는 방법이다. 직접 주소 지정 방식보다 표현할 수 있는 데이터의 범위가 넓지만, 속도는 떨어진다.
  • 레지스터 주소 지정 방식
    • 연산에 사용할 데이터를 저장한 레지스터의 이름을 명시하는 방식이다. 레지스터의 크기만큼 데이터를 표현할 수 있다.
  • 레지스터 간접 주소 지정 방식
    • 레지스터가 유효주소를 가지고 있고, 오퍼랜드에 레지스터의 이름을 명시하는 방법이다. 표현할 수 있는 값의 범위가 커진다는 장점이 있지만, 속도가 그만큼 떨어진다.
  • 스택 주소 지정 방식
    • 스택과 스택 포인터를 이용한 주소 지정 방식이다. 여기에서 스택은 메모리의 스택 영역에 존재한다.
  • 변위 주소 지정 방식
    • 오퍼랜드 필드 값(변위, Offset)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정방식이다. 이 방식을 사용할 땐 명령어에 어떤 레지스터의 값과 더할지를 나타내는 레지스터 필드가 추가된다. 이때 어떤 레지스터에 저장된 값을 사용하는지에 따라서 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식으로 나뉜다.
      • 상대 주소 지정 방식은 레지스터 필드에 프로그램 카운터가 들어있다. 즉, 프로그램 카운터의 값과 변위값을 더하여 사용하는 방식이다.
      • 베이스 레지스터 주소 지정방식은 레지스터 필드에 베이스 레지스터가 들어있다. 마찬가지로 베이스 레지스터의 값과 변위값을 더한 주소에 접근하는 방식이다.

유효주소란 연산에 사용할 데이터가 저장된 위치를 의미한다.

 

Q : 어떤 주소 지정방식을 사용할지는 컴파일러가 결정하는가?
A : 어느정도는 컴파일러가 결정한다. 프로세서(ISA; Instruction Set Architecture)가 제공하는 주소 지정 방식을 기반으로, 컴파일러가 최적의 명령어와 주소지정 방식을 선택한다.
Q : 하나의 프로그램에 여러개의 주소 지정방식이 존재할 수 있는가?
A : 그렇다. 컴파일러가 각 코드 부분, 각 명령어에 대해 최적의 주소 지정 방식을 선택하기 때문이다.
Q : 각 명령어의 주소 지정방식을 어떻게 구분하는가?
A : 명령어 내에 있는 비트(필드)를 통해 구분한다. 각 명령어의 인코딩 형식에 주소 지정 관련 정보를 담고 있기 때문에 구분할 수 있다.