CS 03 - 명령어

01. 소스코드와 명령어

<고급 언어와 저급 언어>

1. 고급 언어와 저급언어

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

2. 저급 언어

저급 언어는 명령어로 이루어져 있다. 고급 언어로 작성된 소스 코드가 실행되려면 저급 언어, 즉 명령어로 변환되어야 한다. 저급 언어에는 두 가지 종류가 있다.

  • 기계어
    • 0과 1의 명령어 비트로 이루어진 언어
    • 오로지 컴퓨터만을 위해 만들어진 언어이기 때문에 사람이 읽으면 그 의미를 이해하가가 어려움
  • 어셈블리어
    • 0과 1로 표현된 명령를 읽기 편한 형태로 변역한 언어
    • ex) push rbp / pop rbp / ret

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

1. 컴파일 언어

  • 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어
  • 컴파일 : 컴파일 언어로 작성된 소스 코드 전체가 저급 언어로 변환되는 과정
  • 컴파일러 : 컴파일을 수행해 주는 도구
    • 컴파일러가 오류를 하나라도 발견하면 해당 소스 코드는 컴파일에 실패
  • 목적 코드 : 컴파일러를 통해 저급 언어로 변환된 코드

2. 인터프리터 언어

  • 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어
  • 인터프리터 : 소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구
  • 소스 코드 전체를 저급 언어로 변환하는 시간을 기다릴 필요가 없다.
  • 문법 오류가 있더라도, 오류가 있는 줄 전까지는 실행이 된다.
  • 소스 코드 마지막에 이를 때까지 한 줄 한 줄씩 저급 언어로 해석하며 실행해야 하기 때문에 컴파일 언어보다 느리다.

<링킹>

목적 코드가 실행 파일이 되기 위해서는 링킹 이라는 작업을 거쳐야 한다.

컴파일을 통해 목적 코드가 생성되고 이해당 목적 코드의 목적 파일이 생성된다. 목적 파일 안에 다른 목적 코드의 기능(외부 기능)을 사용해야할 때, 해당 외부 기능을 목적 파일과 연결 짓는 작업을 링킹이라고 한다.

링킹 작업까지 거쳐야 비로소 하나의 실행 파일이 만들어진다.

02. 명령어의 구조

<연산 코드와 오퍼랜드>

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

  • 연산 코드
    • 명령어가 수행할 연산
  • 오퍼랜드
    • 연산에 사용할 데이터 혹은 연산에 사용할 데이터가 저장된 위치
    • 주소 필드 라고도 부른다.

<주소 지정 방식>

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

1. 즉시 주소 지정 방식

  • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
  • 데이터의 크기가 작아진다는 단점
  • 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문에 빠르다는 장점

2. 직접 주소 지정 방식

  • 오퍼랜드 필드에 유효 주소를 직접 명시

3. 간접 주소 지정 방식

  • 오퍼랜드 필드에 유효 주소의 주소를 명시
  • 직접 주소 방식보다 표현할 수 있는 유효 주소의 범위가 더 넒어짐
  • 두 번의 메모리 접근이 필요하기 때문에 느린 방식

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

  • CPU 외부에 있는 메모리보다 CPU 내부에 있는 레지스터에 접근하기 때문에 속도가 더 빠름
  • 직접 주소 지정 방식처럼 표현할 수 있는 레지스터 크기에 제한이 생길 수 있음

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

  • 연산에 사용할 데이터를 메모리에 저장하고, 해당 유효 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
  • 메모리에 접근하는 횟수가 한 번으로 간접 주소 지정 방식보다 빠름

<스택과 큐>

스택

  • LIFO(Last In First Out)
  • PUSH : 새로운 데이터 저장
  • POP : 저장된 데이터 꺼내기

  • FIFO(First In First Out)