관리 메뉴

나만을 위한 블로그

[혼공컴운] 3. 명령어 본문

책/혼자 공부하는 컴퓨터 구조 + 운영체제

[혼공컴운] 3. 명령어

참깨빵위에참깨빵_ 2023. 11. 4. 22:06
728x90
반응형

모든 코드는 컴퓨터 안에서 명령어로 바뀐다. 컴퓨터는 C, CPP, 자바, 파이썬 등 언어를 이해할 수 없다.

프로그래밍 언어는 사람이 이해하고 작성하기 쉽게 만들어진 언어다. 컴퓨터는 이 언어를 이해하지 못한다.

 

  • 사람을 위한 언어 : 고급 언어
  • 컴퓨터가 직접 이해, 실행할 수 있는 언어 : 저급 언어

 

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

 

  • 기계어 : 0, 1로 이뤄진 명령어 모음. 컴퓨터만을 위한 언어라서 사람은 의미를 이해하기 어려움
  • 어셈블리어 : 기계어가 사람이 이해하기 어려워서 만들어진 언어

 

어떤 개발자를 희망하냐에 따라 저급 언어의 중요성이 달라진다. 임베디드 개발자, 게임 개발자, 정보 보안 분야 개발자는 하드웨어와 밀접하게 닿아 있어서 어셈블리어를 많이 쓴다.

 

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

 

고급 언어가 저급 언어로 변환되는 방식은 2가지 있다.

 

  • 컴파일 언어 : 컴파일러가 코드 전체를 저급 언어로 바꿔서(컴파일) 실행되는 고급 언어. C언어가 컴파일 언어다. 컴파일러에 의해 바뀐 코드를 목적 코드라고 한다
  • 인터프리터 언어 : 인터프리터가 코드를 한 줄씩 실행하는 고급 언어. 파이썬이 인터프리터 언어다. 일반적으로 인터프리터 언어가 컴파일 언어보다 느리다

 

명령어의 구조

 

연산 코드, 오퍼랜드

 

명령어는 연산 코드, 오퍼랜드로 구성돼 있다. 명령어가 수행할 연산(색 배경 필드 값 등)을 연산 코드라 하고 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치(흰색 배경 필드 값 등)을 오퍼랜드라고 한다. 연산 코드는 연산자, 오퍼랜드는 피연산자라고 부른다.

 

  • 연산 코드 필드 : 연산 코드가 담기는 영역
  • 오퍼랜드 필드 : 오퍼랜드가 담기는 영역

 

오퍼랜드

 

 

오퍼랜드 필드엔 숫자, 문자 같이 연산에 사용할 데이터를 직접 명시하기보다 연산에 사용할 데이터가 저장된 위치(메모리 주소, 레지스터 이름)가 담긴다. 그래서 오퍼랜드 필드를 주소 필드라고 부르기도 한다.

오퍼랜드가 하나도 없는 명령어를 0-주소 명령어, 하나인 명령어를 1-주소 명령어라고 부른다.

 

연산 코드

 

연산 코드는 명령어가 수행할 연산이다. 연산 코드의 기본 유형은 4개 있다.

 

  • 데이터 전송
  • 산술/논리 연산
  • 제어 흐름 변경
  • 입출력 제어

 

주소 지정 방식

 

오퍼랜드 필드에 메모리, 레지스토 주소를 담는 이유는 명령어 길이 때문이다. 한 명령어가 n비트고 연산 코드 필드가 m비트인 경우, 오퍼랜드 필드에 가장 많은 공간을 할당할 수 있는 1-주소 명령어라도 오퍼랜드 필드의 길이는 n-m비트가 된다.

명령어가 16비트, 연산 코드 필드가 4비트인 2-주소 명령어에선 오퍼랜드 필드당 6비트 정도밖에 남지 않는다. 즉 하나의 오퍼랜드 필드로 표현 가능한 정보 가짓수는 2^6개다.

오퍼랜드 필드 안에 메모리 주소가 담기면 표현 가능한 데이터 크기는 하나의 메모리 주소에 저장 가능한 공간만큼 커진다.

 

연산 코드에 사용할 데이터가 저장된 위치를 유효 주소라고 한다. 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 한다. 즉 주소 지정 방식은 유효 주소를 찾는 방법이다.

현대의 CPU는 여러 주소 지정 방식을 쓴다. 아래는 대표적인 주소 지정 방식 5개다.

 

  • 즉시 주소 지정 방식 : 연산에 쓸 데이터를 오퍼랜드 필드에 직접 명시. 가장 간단한 형태의 주소 지정 방식이다. 표현 가능한 데이터 크기가 작아지지만, 연산에 쓸 데이터를 메모리, 레지스터에서 찾는 과정이 없어 아래 주소 지정 방식들보다 빠르다
  • 직접 주소 지정 방식 : 오퍼랜드 필드에 유효 주소를 명시. 오퍼랜드 필드엣거 표현 가능한 데이터 크기는 즉시 주소 지정 방식보다 크지만 유효 주소 표현 가능한 범위가 연산 코드의 비트 수만큼 줄어들어, 표현 가능한 유효 주소에 제한이 생긴다
  • 간접 주소 지정 방식 : 유효 주소의 주소를 오퍼랜드 필드에 명시. 표현 가능한 유효 주소의 범위가 넓어지지만 2번의 메모리 접근이 필요해서 일반적으로 느린 방식이다
  • 레지스터 주소 지정 방식 : 연산에 쓸 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시. CPU 밖의 메모리에 접근하는 것보다 CPU 안의 레지스터에 접근하는 게 더 빠르다. 그래서 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있다. 그러나 표현 가능한 레지스터 크기에 제한이 생길 수 있다
  • 레지스터 간접 주소 지정 방식 : 연산에 쓸 데이터를 메모리에 저장하고 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시. 유효 주소 찾는 과정이 간접 주소 지정 방식과 비슷하지만 메모리 접근 횟수가 1번으로 줄어든다. 간접 주소 지정 방식보다 빠르다
반응형
Comments