[컴퓨터 구조] 명령어

byeol·2023년 3월 12일
0

🔍 명령어가 무엇이고 명령어가 어떻게 컴퓨터를 작동시키는지 그 구조를 살펴보자

소스 코드와 명령어

컴퓨터는 프로그래밍 언어를 해석할 수 있을까?
컴퓨터는 프로그래밍 언어를 읽을 수 없다.
컴퓨터가 프로그래밍 언어를 보고 작동하는 이유는 컴퓨터 내부에서 이를 컴퓨터가 읽을 수 있는 명렁어로 바꿔주기 때문이다.

프로그래밍 언어(python, Java)와 같이
사람이 이해하고 작성하기 쉽게 만들어진 언어를 "고급언어"라고 한다.

그리고 컴퓨터가 직접 이해하고 실행할 수 있는 언어(명령어)를 "저급언어"라고 한다.

소스코드 = 프로그래밍 언어 = 고급언어
명령어 = 저급언어

고급언어

고급언어를 저급언어로 바꿔주는 방식에는 두가지가 있다.
"컴파일""인터프리터"이다.
컴파일을 통해서 저급언어로 바뀌는 고급언어를 컴파일 언어라고 한다.
인터프리터를 통해서 저급언어로 바뀌는 고급언어를 인터프리터 언어라고 한다.
이 두가지 방식에는 차이가 있다.

컴파일 언어

컴파일이란 소스코드를 저급언어로 바꿔주는 행위를 말하고
이를 가능하게 하는 도구를 "컴파일러"라고 한다.

이 컴파일러는

  • 문법적인 오류가 없는지
  • 실행 가능한 코드인지
  • 실행하는데 불필요한 코드는 없는지
    를 검사하는데 만약에 하나의 오류라도 발견된다면 컴파일은 실패가 된다.

즉 컴파일은 소스코드 전체를 한번에 저급언어로 바꾸며 전체 코드에 하나라도 오류가 발견되면 컴파일을 실행하지 않는다.

컴파일러를 통해서 바뀐 고급언어를 "목적코드"라고 한다.

  • 하지만 이 목적코드가 모인 파일인 목적파일을 컴퓨터는 바로 실행할 수 있을까? 즉 목적파일 = 실행파일(?)

    답은 아니다!
    컴퓨터는 목적코드를 그냥 볼 뿐이다. 어떤 기능을 하는지 실행할 수 없다. 따라서 이 작업이 필요한데 그것을 링킹(Linking)이라고 부른다.

    목적파일 --링킹(Linking)--> 실행파일

인터프리터 언어

인터프리터 언어는 인터프리터에 의해서 소스코드가 한줄한줄 실행되는 고급언어이다. 여기서 인터프리터는 소스코드를 한줄씩 실행되도록 해주는 도구이다.

한줄씩 컴퓨터와 대화하듯 진행되기 때문에 N번째 줄에 오류가 있다고 하더라도 인터프리터 언어는 N-1번째 줄까지 저급 언어로 바뀌게 된다.

언뜻 보기에는 컴파일 언어가 인터프리터 언어보다 느릴거 같다.
컴파일되는 시간을 기다려야하기 때문이다.

하지만 인터프리터 언어가 컴파일 언어보다 느리다.
이는 컴파일 언어는 컴파일만 진행된다면 그 이후로는 바로바로 실행될 수 있기 때문이다.

python은 컴파일 언어? 인터프리터 언어?

프로그래밍 언어를 컴파일 언어와 인터프리터 언어 이 둘로 쪼갤 수 없다. 왜냐하면 이것은 저급언어를 고급언어로 바뀌는 방식에 대한 설명이지 프로그래밍 언어를 나누는 방식이 아니다.

python만 하더라고 컴파일과 인터프리터 둘다 시행할 수 있다.

저급언어

저급언어는 두 가지 종류가 있다.
"기계어""어셈블리어"이다.

기계어

기계어는 0과 1의 비트로 이루어진 언어이다. 2진수로 표현되기 때문에 길이가 길어져 십육진수로 표현되기도 한다.

어셈블리어

하지만 사람이 읽었을 때 해석의 어려움이 있어 이를 보완한 어셈블리어가 등장했다.

어셈블리어는 기계어를 읽기 쉽게 편한 형태로 번역한 언어로
하드웨어와 밀접하게 맞닿아 있는 프로그램을 개발하는
임베디드, 게임, 정보 보완 개발자는 필수로 알아야 한다.

명령어의 구조

명령어는 기계어와 어셈블리어의 형태를 가지고 있다.
명령어의 각 줄은 어떤 행위를 담고 있는데 그 구조를 살펴보자

명령어는 "연산코드""오퍼랜드"로 이루어져 있다.

  • 연산코드 : 명령어가 수행할 연산
  • 오퍼랜드 : 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 주소를 담고 있다.


어셈블리어를 예시로 볼 때 초록색 형광펜으로 칠해진 곳이 연산코드이고 안칠해진 곳이 오퍼랜드이다.

연산코드 = 연산자
=> 연산코드가 담긴 영역 = 연산 코드 필드
오퍼랜드 = 피연산자 = 주소 필드
=> 오파렌드가 담긴 영역 = 오퍼랜드 필드

오퍼랜드

오퍼랜드에는 데이터가 직접 담기보다는
데이터가 지정된 위치 즉 메모리 주소나 레지스터 이름이 담긴다.
그래서 주소 필드라고도 불린다.

명령어 안에 오퍼랜드는
0~3개가 온다.
0개가 오는 명령어를 0-주소 명령어 등 오퍼랜드 개수에 따라 "N-주소 명령어"로 표현된다.

이 오퍼랜드에는 데이터를 직접 담기보다는 메모리 주소나 레지스터 주소가 담긴다고 했다.

그 이유는 데이터가 직접 오면 표현할 수 있는 데이터의 범위가 줄어들기 때문이다.

예를 들어 3-주소 명령어가 16비트로 이루어졌고 연산 코드가 4비트라고 할 때, 하나의 오퍼랜드에 올 수 있는 데이터의 범위는 2의 4승인 16개이다.

하지만 만약에 하나의 주소당 16비트의 데이터를 저장할 수 있는 메모리가 있다고 가정할 때 이 오퍼랜드에 메모리의 주소를 담는다면 표현할 수 있는 데이터의 범위는 2의 16승이 된다.
(레지스터 이름이 와도 마찬가지이다.)

오퍼랜드 담기는 연산의 대상이 되는 데이터가 저장된 위치를 "유효주소"라고 한다.

또한 오퍼랜드 필드에 데이터가 저장된 위치를 지정하는 방식을 "주소지정방식"이라고 하는데 그 종류를 살펴보자.

즉시 주소 지정 방식

이 방법은 오퍼렌드에 데이터가 바로 오는 방식이다.
표현할 수 있는 데이터의 범위가 제한적이지만 메모리나 레지스터 주소를 통해서 데이터를 찾는 과정이 없어 연산이 빠르다.

직접 주소 지정 방식

오퍼랜드에 유효주소가 직접 오는 방식이다.
즉지 주소 지정 방식보다 데이터의 범위가 크다.
데이터의 범위는 오퍼랜드의 비트 수가 아니라 메모리가 결정하기 때문이다.

하지만 여전히 유효주소의 범위는 오퍼랜드의 비트 수가 결정한다는 단점이 존재한다.

간접 주소 지정 방식

오퍼랜드에 유효주소의 주소를 담는 방식이다.
유효주소는 메모리 어딘가에 저장되어져 있기 때문에
유효주소의 범위는 한주소당 저장하는 메모리의 비트 수만큼 커졌다.

하지만 타고타고 데이터를 찾아야 하기 때문에 즉지, 직접 주소지정 방식보타 연산이 느리다.

레지스터 주소 지정 방식

직접 주소 지정 방식과 비슷하게 데이터가 담긴 레지스터를 지정하는 방식이다.

명령어의 연산은 CPU의 ALU가 처리한다고 했다.
그렇기 때문에 메모리의 있는 데이터를 찾는 것보다는
CPU 내에 있는 레지스터 저장된 데이터를 찾는 것이 더 빠르다.
따라서 직접 주소 지정 방식보다 레지스터 주소 지정 방식의 연산 속도가 더 빠르다.

그러나 앞서 말한 직접 주소 지정 방식의 문제와 비슷하게 유효주소의 범위가 제한된다.

레지스터 간접 주소 방식


연산에 사용되는 데이터는 메모리에, 그 주소는 레지스터에 , 오퍼랜드에는 레지스터의 이름이 저장된다.

메모리를 접근하는 횟수가 1번이기 때문에 메모리 접근 횟수가 2번이 간접 주소 방식보다 연산 속도가 빠르다.

연산코드

연산 코드는 명령어가 수행할 연산을 의미하며
"저장해라","더해라" 등에 해당하는 부분이다.

CPU마다 연산코드가 다르지만 공통적인 부분만 살펴본다.
크게 4가지 연산이 있다.

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

데이터 전송

MOVE : 데이터 이동
STORE : 메모리에 저장
LOAD(FETCH) : 메모리에서 CPU로 데이터 가져와라
PUSH : 스택에 저장
POP : 스택의 최상단 데이터 가져와라

산술/논리 연산

ADD/SUBTRACT/MULTIPLY/DIVIDE : 덧셈/뺄셈/곱셈/나눗셈
INCREMENT/DECREMENT: 오퍼랜드에 1을 더해라/ 1을 빼라
AND/OR/NOT
COMPARE : 두 개의 숫자 또는 true/false 값 비교

제어 흐름 변경

JUMP : 특정 주소로 실행 순서 옮겨라
CONDITION JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
HALT : 프로그램 실행 멈춰라
CALL : 되돌아올 주소를 지정한 채 특정 주소로 실행순서 옮겨라
RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라

입출력 제어

READ(INPUT)
WRITE(OUTPUT)
START IO : 입출력 장치를 시작하라
TEST IO : 입출력 장치의 상태를 확인하라

profile
꾸준하게 Ready, Set, Go!

0개의 댓글

관련 채용 정보