[혼공컴운]1주차_Chap01~Chap03

곽나현·2024년 1월 7일
0

혼공컴운

목록 보기
1/16
post-thumbnail
post-custom-banner

Chap01_컴퓨터 구조 시작하기

✔ 컴퓨터 구조를 알아야 하는 이유

◼ 컴퓨터 구조를 이해하고 있다면 문제상황을 빠르게 이해할 수 있고, 문제 해결의 실마리를 다양하게 찾을 수 있다.

성능, 용량, 비용 문제는 프로그래밍 언어의 문법만 알아서 해결하기 어렵기 때문에, 컴퓨터 구조를 알아야 한다.

✔ 컴퓨터 구조의 큰 그림

알아야 하는 컴퓨터 구조 지식

📌컴퓨터가 이해하는 정보

  • 컴퓨터는 0과 1로 표현된 정보만을 이해한다.
  • 0과 1로 표현된 정보에는 데이터명령어가 있다.
  • 명령어는 컴퓨터를 작동시키는 정보이고, 데이터는 명령어를 위해 존재하는 일종의 재료이다.
    ➡ 컴퓨터 프로그램은 명령어들의 모음이라고 정의하기도 한다.

📌컴퓨터의 네가지 핵심 부품

- 중앙처리장치(CPU)

  • 컴퓨터의 두뇌이다.
  • 메모리에 저장된 명령어를 읽고, 해석하고, 실행한다.
  • CPU의 구성요소로는 산술논리연산장치(ALU), 레지스터, 제어장치가 있다.
    • ALU는 컴퓨터 내부에서 수행되는 대부분의 계산을 수행한다.
    • 레지스터는 CPU 내부의 작은 임시 저장 장치이다.
    • 제어장치는 제어 신호를 내보내고 명령어를 해석하는 장치이다.

- 주기억장치(메모리)

  • 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
  • 프로그램이 실행되려면 반드시 프로그램이 메모리에 저장되어 있어야 한다.
  • 컴퓨터가 빠르게 작동하기 위해서 주소라는 개념이 사용된다.

- 보조기억장치

  • 보조기억장치는 메모리의 단점(가격이 비싸고, 휘발성)을 해결한다.
  • 비휘발성 메모리이다.

- 입출력장치

  • 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치이다.

메인보드와 시스템 버스

◼ 앞서 설명한 컴퓨터의 핵심 부품들은 모두 메인보드(마더보드)에 연결된다.
◼ 메인보드에 연결된 부품들은 버스라는 내부 통로를 통해 서로 정보를 주고받을 수 있다.
◼ 컴퓨터 내부에는 다양한 버스가 있는데 그 중 가장 중요한 버스는 시스템 버스이다.
시스템 버스제어 버스, 데이터 버스, 주소버스로 구성된다.

  • 제어 버스: 제어 신호를 주고 받는 통로
  • 데이터 버스: 명령어와 데이터를 주고 받는 통로
  • 주소 버스: 주소를 주고 받는 통로

Chap02_데이터

✔ 0과 1로 숫자를 표현하는 방법

◼ 컴퓨터가 이해하는 가장 작은 정보 단위는 비트(bit)이다.

  • 비트는 0과 1을 표현할 수 있다.
  • n개의 비트는 2n개의 정보를 표현할 수 있다.

◼ 비트보다 한 단계 큰 단위로 바이트(byte)가 있다.

  • 바이트는 8개의 비트를 묶은 단위이다. (1Byte=8Bit)
  • 1GB=103MB=106KB=109B

워드(word)란 CPU가 한 번에 처리할 수 있는 데이터 크기를 의미한다.

  • 만약 CPU가 한 번에 16비트를 처리할 수 있으면 1워드는 16비트가 되고, 한 번에 32비트를 처리할 수 있으면 1워드는 32비트가 된다.
  • 정의된 워드의 절반 크기를 하프 워드, 1배 크기를 풀 워드, 2배 크기를 더블 워드라고 한다.

📌 이진법

  • 수학에서 0과 1만으로 모든 수를 표현하는 방법
  • 이진수임을 표현하기 위해 아래첨자 (2)를 붙이거나 이진수 앞에 0b를 붙인다.

📌 이진수의 음수 표현

  • 2의 보수를 이용한다.
    • 2의 보수: 모든 0과 1을 뒤집은 후 1을 더한다.
  • 이진수가 음수인지 양수인지 구분하기 위해 컴퓨터 내부에는 플래그(flag)라는 부가 정보가 있다.

◼ 2의 보수의 한계

  • 0의 음수 표현
    • 올림수를 버리면 해결가능하다
  • n비트로는 -2n과 2n을 동시에 표현할 수 없다.

📌 십육진법

  • 십육진법임을 표현하기 위해 아래 첨자 (16)을 붙이거나 십육진수 앞에 0x를 붙인다.

  • 십육진법을 사용하는 주된 이유 중 하나는 이진수와의 상호 변환이 쉽기 때문이다.

    • 십육진수를 이진수로 변환하기
      : 십육진수 한 글자를 4비트의 이진수로 간주

    • 이진수를 십육진수로 변환하기
      : 4비트의 이진수를 한 글자의 십육진수로 변환

✔ 0과 1로 문자를 표현하는 방법

문자집합 : 컴퓨터가 인식하고 표현할 수 있는 문자의 모음

인코딩 : 문자 집합에 있는 문자들을 컴퓨터가 이해할 수 있는 0과 1로 변환하는 과정

디코딩 : 0과 1로 표현된 문자 코드를 사람이 읽을 수 있는 문자로 변환하는 과정

📌아스키 코드

  • 127개의 문자 표현 가능
  • 장점 : 아스키 코드는 매우 간단하게 인코딩 된다.
  • 단점 : 한글, 아스키 문자 집합 외의 문자, 특수 문자 표현 불가능

📌EUC-KR

  • 한글 인코딩 방식
    • 완성형 인코딩 방식과 조합형 인코딩 방식이 있다.
      • 완성형 인코딩 방식
        초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드 부여
      • 조합형 인코딩 방식
        초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그들의 조합으로 글자 코드를 완성
  • EUC-KR은 한글을 2바이트 크기로 인코딩 할 수 있는 대표적인 완성형 인코딩 방식이다.

📌유니코드와 UTF-8

  • 유니코드는 여러 나라의 문자를 광범위하게 표현할 수 있는 통일된 문자 집합이다.
  • 유니코드를 인코딩 하는 방법에는 UTF-8, UTF-16, UTF-32 등이 있다.
    • UTF: Unicode Transformation Format 으로 유니코드를 인코딩 하는 방식

Chap03_명령어

✔ 소스 코드와 명령어

📌 고급 언어
: 사람을 위한 언어

📌 저급 언어
: 컴퓨터를 위한 언어 (컴퓨터가 직접 이해하고 실행할 수 있는 언어)
: 저급 언어는 명령어로 이루어져 있다.
➡고급 언어로 작성된 소스 코드는 반드시 저급 언어(명령어)로 변환되어야 한다.
: 저급 언어의 종류에는 기계어어셈블리어로 두 종류가 있다.

◼ 기계어
: 0과 1의 명령어 비트로 이루어진 언어

◼ 어셈블리어
: 기계어를 읽기 편한 형태로 번역한 저급 언어
: 어셈블리어를 읽으면 컴퓨터 프로그램을 어떤 과정으로 실행하는 지, 어떤 절차로 작동하는지를 가장 근본적인 단계에서부터 하나하나 추적하고 관찰할 수 있다.


◼ 고급언어가 저급 언어로 변환하는 방식에는 컴파일 방식인터프리터 방식이 있다.

- 컴파일 언어

: 컴파일 방식으로 작동하는 프로그래밍 언어
: 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환된다.

  • 컴파일 : 소스 코드 전체가 저급 언어로 변환 되는 과정
  • 컴파일러 : 컴파일을 수행해주는 도구, 소스 코드의 처음부터 끝까지 저급 언어로 컴파일 한다.

: 컴파일 도중 오류가 발생하면 전체가 컴파일 되지 않는다.
: 컴파일러를 통해 저급 언어로 변환된 코드를 목적 코드라고 한다.

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

- 인터프리터 언어

: 인터프리터 방식으로 작동하는 프로그래밍 언어
: 인터프리터에 의해 소스 코드가 한 줄씩 실행된다.
: 소스 코드 전체를 저급 언어로 변환하지 않기 때문에 변환에 있어서 시간을 기다릴 필요가 없다.
: N번째 줄에 문제가 있더라도 N-1번째 줄까지는 올바르게 수행된다.

➡ 인터프리터 언어는 컴파일 언어보다 느리다.

: 목적코드는 컴퓨터가 이해하고 실행할 수 있는 저급 언어인 반면, 인터프리터 언어는 소스 코드 마지막에 이를 때까지 한 줄씩 저급 언어로 해석하며 실행해야 하기 때문이다.

✔ 명령어의 구조

◼ 명령어는 연산 코드와 오퍼랜드로 구성된다.

📌연산 코드 (연산자)
: 명령어가 수행할 연산
: 가장 기본적인 연산 코드 유형 네 가지

  • 데이터 전송

    MOVE: 데이터를 옮겨라
    STORE: 메모리에 저장하라
    LOAD: 메모리에서 CPU로 데이터를 가져와라
    PUSH: 스택에 제이터를 저장하라
    POP: 스택의 최상단 데잍를 가져와라

  • 산술/논리 연산

    ADD/SUBTRACT/MULTIPLY/DIVIDE: 덧셈/뺄셈/곱셈/나눗셈을 수행하라
    INCREMENT/DECREMENT: 오퍼랜드에 1을 더하라/ 오퍼랜드에 1을 빼라
    AND/OR/NOT: AND/OR/NOT 연산을 수행하라
    COMPARE: 두 개의 숫자 또는 TRUE/FALSE 값을 비교하라

  • 제어 흐름 변경

    JUMP: 특정 주소로 실행 순서를 옮겨라
    CONDITIONAL JUMP: 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
    CALL: 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
    RETURN: CALL을 호출할 떄 저장했던 주소로 돌아가라

  • 입출력 제어

    READ: 특정 입출력 장치로부터 데이터를 읽어라
    WRITE: 특정 입출력 장치로부터 데이터를 써라
    START IO: 입출력 장치를 시작하라
    TEST IO: 입출력 장치의 상태를 확인하라

📌오퍼랜드 (피연산자)
: 연산에 사용할 데이터, 연산에 사용할 데이터가 저장된 위치
: 오펀랜드 필드에는 숫자와 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소가 올 수 있다.

  • 다만, 오퍼랜드 필드에 데이터를 직접 명시하기 보다는 데이터가 저장된 위치(메모리 주소나 레지스터 이름)이 주로 저장된다.
    ➡ 오퍼랜드 필드는 주소 필드라고도 하는 이유

: 오퍼랜드는 명령어 안에 0~여러개 있을 수 있다.

  • 0-주소 명령어: 오퍼랜드가 하나도 없는 명령어
  • 1-주소 명령어: 오퍼랜드가 1개인 명령어
  • 2-주소 명령어: 오퍼랜드가 2개인 명령어
  • 3-주소 명령어: 오퍼랜드가 3개인 명령어

오퍼랜드에 메모리나 레지스터의 주소를 담는 이유

명령어 길이 때문이다.

: n비트로 구성된 명령어의 연산 코드 필드가 m비트라면 1-주소 명령어인 경우에 오퍼랜드 필드 길이는 (n-m)비트가 된다.
즉, 하나의 오퍼랜드 필드로 표현할 수 있는 정보의 가짓수가 2(n-m)개이다.

: 만약 오퍼랜드 필드에 메모리나 레지스터 주소가 담긴다면 표현할 수 있는 정보의 가짓수(데이터의 크기)는 하나의 메모리나 레지스터 주소에 저장할 수 있는 공간만큼 커진다.

◼ 유효 주소

  • 연산 코드에 사용할 데이터가 저장된 위치

📌주소 지정 방식

  • 유효 주소를 찾는 방법
  • 대표적인 주소 지정 방식 5가지

1️⃣ 즉시 주소 지정 방식(immediate addressing mode)

연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시

장점: 이하 주소 지정 방식들보다 빠름
단점: 표현할 수 있는 데이터의 크기가 작음

2️⃣ 직접 주소 지정 방식(direct addressing mode)

오퍼랜드 필드에 유효 주소를 직접적으로 명시

장점: 표현할 수 있는 데이터의 크기는 즉시 주소 지정 방식보다는 커짐
단점: 유효 주소를 표현할 수 있는 범위가 연산 코드의 비트 수만큼 줄어듦

3️⃣ 간접 주소 지정 방식(indirect addressing mode)

유효 주소의 주소를 오퍼랜드 필드에 명시

장점: 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 넓어짐
단점: 두 번의 메모리 접근이 필요하기 때문에 느림

4️⃣ 레지스터 주소 지정 방식(register addressing mode)

연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 명시

장점: 직접 주소 지정 방식보다 빠르게 데이터 접근 가능(CPU 외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 빠르기 때문)
단점: 표현할 수 있는 레지스터 크기에 제한이 생길 수 있음

5️⃣ 레지스터 간접 주소 지정 방식(register indirect addressing mode)

연산에 사용할 데이터를 메모리에 저장하고, 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시

장점: 간접 주소 지정 방식보다 빠름(메모리 접근이 한 번이기 때문)

post-custom-banner

0개의 댓글