5 분 소요

1. 소스 코드와 명령어

1. 고급 언어와 저급 언어

  • 고급 언어(high-level programming language)

    • 프로그램을 만들 때 컴퓨터가 이해하는 언어가 아닌 사람이 이해하고 작성하기 쉽게 만들어진 언어
    • C, C++, java, Python..
  • 저급 언어(low-level programming language)

    • 컴퓨터가 직접 이해하고 실행할 수 있는 언어 ➡ 기계어, 어셈블리어

    • 고급 언어로 작성된 소스 코드가 실행되려면 반드시 저급 언어(명령어)로 변환되어야 한다.

    • 기계어(machine code) : 0과1로 이루어진 명령어 모음

      • 이진수로 나열하면 너무 길어지기 때문에 십육진수로 표현하기도 한다.
    • 어셈블리어(assembly language) :

      • 기계어를 읽기 편한 형태로 번역한 언어

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

  • 개발자들이 고급 언어로 작성한 소스 코드는 저급 언어로 변환되어 실행된다.

  • 고급언어에서 저급언어로 변환되는 방식 ➡ 컴파일 방식, 인터프리트 방식

  • 컴파일 언어(compile language) : 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어

    • 대표 언어 : C

    • 컴파일(compile) : 컴파일 언어로 작성된 소스 코드의 코드 전체가 저급 언어로 변환되는 과정

    • 컴파일러(compiler) : 컴파일을 수행해 주는 도구

      • 코드 내에 오류가 하나라도 있으면 컴파일이 불가능
    • 목적코드(object code) : 컴파일러를 통해 저급 언어로 변환된 코드

    • 소스 코드(고급 언어) ➡ 컴파일러(컴파일) ➡ 목적 코드(저급 언어)

  • 인터프리터 언어(interpreter language) : 인터프리터에 의해 소스 코드를 한 줄씩 저급 언어로 변환하여 실행하는 고급 언어

    • 대표 언어 Python
    • 인터프리터(interpreter) : 컴퓨터와 대화하듯 한 줄씩 실행
      • N번째 줄에 문법 오류가 있어도 N-1번째까지는 올바르게 수행
    • 한 줄씩 저급 언어로 해석하며 실행하기 때문에 컴파일 언어보다 느리다.

3. 목적 파일 vs 실행 파일

  • 목적 파일 : 목적 코드로 이루어진 파일

  • 실행 파일 : 실행 코드로 이루어진 파일 ➡ 윈도우의 .exe 확장자를 가진 파일

  • 링킹 : 목적코드가 실행 파일이 되기 위해 거치는 작업

4. 확인 문제

  1. 고급 언어가 아닌 것 : 컴파일 언어, 인터프리트 언어

  2. 일반적으로 컴파일 언어보다 인터프리터 언어가 더 빠릅니다.

    ➡ 일반적으로 인터프리터 언어보다 컴파일 언어가 더 빠릅니다.

2. 명령어의 구조

1. 연산 코드와 오퍼랜드

  • 명령어(instruction) : 연산 코드와 오퍼랜드로 구성

  • 오퍼랜드(피연산자) : 연산에 사용할 데이터가 저장된 위치

    • 오퍼랜드 필드(주소 필드) : 오퍼랜드가 담기는 영역

      • 연산에 사용할 데이터를 직접 명시하기 보다는, 연산에 사용할 데이터가 저장된 위치(레지스터 이름)가 담긴다.
    • 명령어 안에 하나도 없을 수도 있고, 한 개만 있을 수도 있고, 두 개 또는 세 개등 여러개 가능

      • 0-주소 명령어 : 오퍼랜드가 하나도 없는 명령어

      • 주소 명령어 : 오퍼랜드가 하나인 명령어 , 2-주소 명령어 : 두 개인 명령어, 3-주소 명령어 : 세 개인 명령어

  • 연산 코드(연산자) : 명령어가 수행할 연산,

    • 연산 코드 필드 : 연산 코드 필드

    • 가장 기본적인 연산 코드 유형

      • 데이터 전송

        ➡ MOVE : 데이터를 옮겨라

        ➡ STORE : 메모리에 저장하라

        ➡ LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라

        ➡ PUSH : 스택에 데이터를 저장하라

        ➡ POP : 스택의 최상단 데이터를 가져와라

      • 산술/논리 연산

        ➡ ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺼셈/ 곱셈/ 나눗셈을 수행하라

        ➡ INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라

        ➡ AND / OR / NOT : AND / OR / NOT 연산을 수행하라

        ➡ COMPAREA : 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라

      • 제어 흐름 변경

        ➡ JUMP : 특정 주소로 실행 순서를 옮겨라

        ➡ CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라

        ➡ HALT : 프로그램의 실행을 멈춰라

        ➡ CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라

        ➡ RETURN CALL : CALL을 호출할 때 저장했던 주소로 돌아가라

      • 입출력 제어

        ➡ READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라

        ➡ WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라

        ➡ START IO : 입출력 장치를 시작하라

        ➡ TEST IO : 입출력 장치의 상태를 확인하라

2. 주소 지정 방식

  • 오퍼랜드 필드에 메모리나 레지스터의 주소를 담는 이유 ➡ 명령어의 길이 때문이다.

    ex) 명령어 1 = n비트, 연산 코드 필드 = m비트

    • 1-주소 명령어

      image

      • 오퍼랜드 필드의 길이 = n-m비트
      • 1-주소 명령어에서 표현할 수 있는 데이터 크기 : 2^12 = 4096
    • 2-주소 명령어

      image

      • 2-주소 명령어에서 표현할 수 있는 데이터 크기 : 2^6 = 64
    • 3-주소 명령어

      image

      • 3-주소 명령어에서 표현할 수 있는 데이터 크기 : 2^4 = 16
  • 만약 오퍼랜드 필드 안에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커진다.

    Ex) 한 주소에 16비트를 저장할 수 있는 메모리가 있을 때

    ​ ➡ 메모리 안에 데이터를 저장하고, 오퍼랜드 필드 안에 해당 메모리 주소를 명시

    ​ ➡ 표현할 수 있는 정보의 가짓수 : 2^16

    image-20240110203133958 그림 1

    Ex) 오퍼랜드 필드에 메모리 주소가 아닌 레지스터의 이름을 명시할 때

    image그림 2

  • 유효주소(effective address) : 연산의 대상이 되는 데이터가 저장된 위치

    • 그림1의 유효주소 : 10번지
    • 그림2의 유효주소 : 레지스터 R1
  • 주소 지정 방식(addressing mode): 연산에 사용할 데이터의 위치를 찾는 방법(유효 주소를 찾는 방법)

2-1. 대표적인 주소 지정 방식

  • 즉시 주소 지정 방식(immediate addressing mode)

    • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식

    image

    • 장점

      • 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없어, 이하 설명할 주소 지정 방식들보다 빠르다.
    • 단점

      • 표현할 수 있는 데이터의 크기가 작아진다.
  • 직접 주소 지정 방식(direct addressing mode)

    • 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식

    image

    • 장점

      • 오퍼랜드 필드에서 표현할 수 있는 데이터의 크기는 즉시 주소 지정 방식보다 크다
    • 단점

      • 유효 주소를 표현할 수 있는 범위가 연산 코드의 비트 수만큼 줄어들었다.

        ➡ 표현할 수 있는 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져 표현할 수 있는 유효 주소에 제한이 생길 수 있다.

  • 간접 주소 지정 방식(indirect addressing mode)

    • 유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식

    image

    • 장점

      • 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 더 넓어졌다.
    • 단점

      • 두 번의 메모리 접근이 필요하기 때문에 앞선 주소 지정 방식들보다 일반적으로 느리다.
  • 레지스터 주소 지정 방식(register addressing mode)

    • 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방식

    image

    • 직접 주소 지정 방식과 비슷하다.

    • 일반적으로 CPU외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 더 빠르다.

    • 장점

      • 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있다.
    • 단점

      • 표현할 수 있는 레지스터 크기에 제한이 생길 수 있다.(직접 주소 지정 방식과 유사)
  • 레지스터 간접 주소 지정 방식(register indirect addreseing mode)

    • 연산에 사용할 데이터를 메모리에 저장하고 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방식

    image

    • 장점

      • 유효 주소를 찾는 과정이 간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 한 번으로 줄어든다.

      • 간접 주소 지정 방식보다 빠르다.

  • 정리

    • 주소 지정 방식 : 연산에 사용할 데이터를 찾는 방법

    • 유효 주소 : 연산에 사용할 데이터가 저장된 위치

    • 대표적인 주소 저장 방식

      • 즉시 주소 저장 방식 : 연산에 사용할 데이터

      • 직접 주소 지정 방식 : 유효주소(메모리 주소)

      • 간접 주소 지정 방식 : 유효 주소의 주소

      • 레지스터 주소 지정 방식 : 유효 주소(레지스터 이름)

      • 레지스터 간접 주소 지정 방식 : 유효 주소를 지정할 레지스터

3. 스택과 큐

  • 스택
    • LIFO: 후입선출 방식
    • PUSH: 스택에 새로운 데이터를 저장하는 명령어
    • POP: 스택에 저장된 데이터를 꺼내는 명령어
    • 양쪽이 뚫려 있는 저장 공간
    • FIFO: 선입선출 방식

4. 확인 문제

  1. 명령어에 대한 설명이 틀린 것

    • 연산 코드와 필드에는 메모리 주소만 담을 수 있습니다.

      ➡ 연산 코드와 필드에는 메모리 주소 이외에도 다양한 정보를 담을 수 있습니다.

  2. 메모리 5번지100이라는 값을 CPU로 가져온다.

댓글남기기