도서 정리/혼자 공부하는 컴퓨터 구조 + 운영체제
[혼자 공부하는 컴퓨터 구조 + 운영체제] 3강 명령어
라일라엘
2025. 1. 11. 22:53
고급 언어와 저급 언어
- 고급 언어 : 사람이 이해할 수 있는 언어.
- 저급 언어 : 컴퓨터가 직접 이해하고 실행할 수 있는 언어. 명령어로 이루어져있다.
저급언어는 기계어와 어셈블리어로 나뉜다.
- 기계어 : 0과 1의 비트로 이루어진 언어.
- 어셈블리어 : 0과 1의 명령어 비트를 사람이 읽기 좋게 매핑한 명령어로 번역한 언어.
컴파일 언어와 인터프리터 언어
- 컴파일 : 소스코드를 저급 언어로 변환하는 과정
- 컴파일러 : 컴파일을 수행하는 도구
- 목적 코드 : 컴파일러를 통해 저급 언어로 변환된 코드
- 컴파일 언어 : 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어.
- 인터프리터 : 소스코드를 한 줄씩 차례로 실행하며 실시간으로 번역하는 도구
- 인터프리터 언어 : 인터프리터에 의해 소스코드가 한 줄씩 실행되는 고급 언어
컴파일 언어와 인터프리터 언어의 경계는 모호하다. 컴파일러와 인터프리터를 함께 사용하는 언어가 많기 때문이다.
목적코드는 컴퓨터가 바로 실행할 수 없다. 여러개의 목적코드를 하나로 묶는 링킹 과정을 추가로 거쳐야 한다. 링킹을 통해 생성된 파일이 컴퓨터가 실행할 수 있는 파일인 실행파일이다.
명령어의 구조
연산 코드와 오퍼랜드
명령어는 연산 코드와 오퍼랜드로 나눌 수 있다.
- 연산 코드 : 명령어가 수행할 연산
- 데이터 전송, 산술/논리 연산, 제어 흐름 변경, 입출력 제어가 가능하다.
- 오퍼랜드 : 연산에 사용할 데이터 또는 데이터가 저장된 위치.
- 오퍼랜드는 명령어의 종류에 따라서 없을수도 있고, 여러개일수도 있다. 오퍼랜드가 없으면 0-주소 명령어, 하나만 있으면 1-주소 명령어 처럼 오퍼랜드의 개수에 따라서 n-주소 명령어와 같은 이름으로 불린다.
- 오퍼랜드 필드에는 데이터가 직접 명시되기보단, 오퍼랜드가 저장된 레지스터의 이름이 담기는 경우가 많다. 그래서 오퍼랜드 필드를 주소필드라고 부르기도 한다.
주소 지정 방식
명령어는 제한적인 크기를 가지고 있다. 이 크기는 아키텍처와 명령어 체계에 따라 다르다. 예를들어 하나의 명령어는 16비트의 크기를 가지고 있다고 가정해보자. 이때 명령 코드의 크기가 4비트라면 12비트로 오퍼랜드를 표현해야한다. 만약 3-주소 명령어라면 하나의 오퍼랜드는 4비트만으로 표현되어야한다.
이때 연산해야 하는 데이터의 크기가 4비트를 넘어간다면 어떻게 해야할까? 이런 문제를 해결하기 위해 주소 지정 방식이 존재한다.
대표적인 주소 지정 방식은 다음과 같다.
- 즉시 주소 지정 방식
- 오퍼랜드에 직접 데이터를 넣는 방식이다. 표현할 수 있는 데이터의 크기가 매우 작다는 단점이 있지만, 가장 빠른 주소 지정방식이다.
- 직접 주소 지정 방식
- 유효 주소를 직접 명시하는 방법이다. 즉시 주소 지정 방식보다 표현할 수 있는 데이터의 범위가 넓지만, 여전히 제한이 존재한다. 속도는 즉시 주소 지정 방식보다는 다소 느리다.
- 간접 주소 지정 방식
- 유효 주소의 주소를 명시하는 방법이다. 직접 주소 지정 방식보다 표현할 수 있는 데이터의 범위가 넓지만, 속도는 떨어진다.
- 레지스터 주소 지정 방식
- 연산에 사용할 데이터를 저장한 레지스터의 이름을 명시하는 방식이다. 레지스터의 크기만큼 데이터를 표현할 수 있다.
- 레지스터 간접 주소 지정 방식
- 레지스터가 유효주소를 가지고 있고, 오퍼랜드에 레지스터의 이름을 명시하는 방법이다. 표현할 수 있는 값의 범위가 커진다는 장점이 있지만, 속도가 그만큼 떨어진다.
- 스택 주소 지정 방식
- 스택과 스택 포인터를 이용한 주소 지정 방식이다. 여기에서 스택은 메모리의 스택 영역에 존재한다.
- 변위 주소 지정 방식
- 오퍼랜드 필드 값(변위, Offset)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정방식이다. 이 방식을 사용할 땐 명령어에 어떤 레지스터의 값과 더할지를 나타내는 레지스터 필드가 추가된다. 이때 어떤 레지스터에 저장된 값을 사용하는지에 따라서 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식으로 나뉜다.
- 상대 주소 지정 방식은 레지스터 필드에 프로그램 카운터가 들어있다. 즉, 프로그램 카운터의 값과 변위값을 더하여 사용하는 방식이다.
- 베이스 레지스터 주소 지정방식은 레지스터 필드에 베이스 레지스터가 들어있다. 마찬가지로 베이스 레지스터의 값과 변위값을 더한 주소에 접근하는 방식이다.
- 오퍼랜드 필드 값(변위, Offset)과 특정 레지스터의 값을 더하여 유효 주소를 얻어내는 주소 지정방식이다. 이 방식을 사용할 땐 명령어에 어떤 레지스터의 값과 더할지를 나타내는 레지스터 필드가 추가된다. 이때 어떤 레지스터에 저장된 값을 사용하는지에 따라서 상대 주소 지정 방식, 베이스 레지스터 주소 지정 방식으로 나뉜다.
유효주소란 연산에 사용할 데이터가 저장된 위치를 의미한다.
Q : 어떤 주소 지정방식을 사용할지는 컴파일러가 결정하는가?
A : 어느정도는 컴파일러가 결정한다. 프로세서(ISA; Instruction Set Architecture)가 제공하는 주소 지정 방식을 기반으로, 컴파일러가 최적의 명령어와 주소지정 방식을 선택한다.
Q : 하나의 프로그램에 여러개의 주소 지정방식이 존재할 수 있는가?
A : 그렇다. 컴파일러가 각 코드 부분, 각 명령어에 대해 최적의 주소 지정 방식을 선택하기 때문이다.
Q : 각 명령어의 주소 지정방식을 어떻게 구분하는가?
A : 명령어 내에 있는 비트(필드)를 통해 구분한다. 각 명령어의 인코딩 형식에 주소 지정 관련 정보를 담고 있기 때문에 구분할 수 있다.