본문 바로가기
cs

[혼공운영체제] 1. 데이터와 명령어

by 이쟝 2023. 4. 6.
인프런의 개발자를 위한 컴퓨터 공학1 : 혼자 공부하는 컴퓨터 구조 + 운영체제 강의를 듣고, 학습 및 요약

1. 데이터

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

비트(bit) : 0과 1을 표현할 수 있는 가장 작은 단위
프로그램은 수많은 비트로 이루어져 있음

워드(word)

CPU가 한 번에 처리할 수 있는 정보의 크기 단위 

 

  • 하프 워드(half word) : 워드의 절반 크기
  • 풀 워드(full word) : 워드 크기
  • 더블 워드(double word) : 워드의 두 배 크기

이진법

0과 1로 숫자 표현하기

 

  • 숫자가 1을 넘어가는 시점에 자리올림
  • 우리가 일상적으로 사용하는 진법은 숫자가 9를 넘어갈 때 자리올림하는 십진법 (decimal)
  • 0과 1로 음수 표현하기
    • 모든 0과 1을 뒤집고 1 더한 값

이진법으로 음수 표현하기
플래그 레지스터(CPU안에 있음)로 양수인지 음수인지 구분 가능!

16진법

수가 15를 넘어가는 시점에 자리올림

 

  • 2진수 => 16진수 변환, 16진수 => 2진수 변환 쉽고 간편!

16진수 표현된 숫자를 각각을 2진수로 표현해서 붙이면 손쉽게 가능
2진수 4개를 16진수 하나로 표현


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

문자 집합과 인코딩

  • 문자 집합(character set) 
    • 컴퓨터가 이해할 수 있는 문자의 모음
  • 인코딩(encoding)
    • 코드화하는 과정
    • 문자(문자 집합에 속한 문자)를 0과 1로 이루어진 문자 코드로 변환하는 과정
    • 사람이 이해하는 문자 -> 컴퓨터가 이해하는 문자
  • 디코딩(decoding)
    • 코드를 해석하는 과정
    • 0과 1로 표현된 문자 코드로 변환하는 과정
    • 컴퓨터가 이해하는 문자 => 사람이 이해하는 문자

아스키코드

  • 초창기 문자 집합 중 하나
  • 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자
  • 7비트로 하나의 문자 표현(128개의 문자표현 가능(2의 7승))
    • 8비트 중 1비트는 오류 검출을 위해 사용되는 패리티 비트(parity bit)
  • A는 65로 인코딩 / a는 97로 인코딩

  • 인코딩이 간단하지만 한글을 포함한 다른 언어 문자, 다양한 특수 문자 표현 불가
    • 128개보다 많은 문자를 표현할 수 없음
    • 8비트 확장 아스키 (extended ASC2)이 등장했지만, 부족

한글 인코딩

  • 완성형 인코딩 방식과 조합형 인코딩 방식이 존재함
    • 완성형 인코딩 방식 : 단어 하나 자체에 고유한 코드를 부여함
    • 조합형 인코딩 방식 : 자음 모음에 각각에다가 고유한 코드를 부여함(like 레고블럭)

EUC-KR (인코딩할 수 있는 홈페이지 : https://dencode.com/)

  • 완성형 인코딩 방식
  • 글자 하나 하나에 2바이트 크기의 코드 부여
    • 2바이트(1바이트) == 16비트(8비트) == 4자리 16진수로 표현
    • 즉, 한글 하나를 표현하기 위해 16진수 필요
  • 2300여 개의 한글 표현 가능
    • 쀏, 뙠, 휔 같은 한글은 표현 불가능(모든 한글을 표현하기에는 역부족!

유니코드 문자 집합과 UTF-8

유니코드 

  • 통일된 문자 집합
  • 한글, 영어, 화살표와 같은 특수 문자, 이모티콘까지
  • 현대 문자 표현에 있어 매우 중요함
  • 인코딩 방식 : UTF-8, UTF-16, UTF-32 등
  • U+는 16진수임을 표현! 뒤에 4자리가 실제 코드

UTF-8 인코딩

  • UTF(Unicode Transformation Format) == 유니코드 인코딩 방법
  • 가변 길이 인코딩 : 인코딩 결과가 1바이트 ~ 4바이트
  • 인코딩 결과가 몇 바이트가 될지는 유니코드에 부여된 값에 따라 다름

글자가 깨질 때?

  • 인코딩에 포함되는 것은 아닌 지 확인
  • 문자집합에 속하지 않는 문자가 사용된 것은 아닌지 확인!

2. 명령어

1. 소스코드와 명령어

고급언어 저급언어
개발자가 이해하기 쉽게 만든 언어 컴퓨터가 이해하고 실행하는 언어, 전부 다 명령어로 이루어져 있음
컴파일 언어, 인터프리터 언어 기계어, 어셈블리어

저급 언어

  • 기계어 : 0과 1로 이루어진 명령어로 구성
  • 어셈블리어 : 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역

고급 언어

  • 컴파일 : 컴파일 언어로 작성된 소스 코드가 컴파일러에 의해 저급 언어로 변환되는 과정
  • 인터프리터 언어 : 인터프리터에 의해 한 줄씩 실행된다.
    • 소스 코드 전체가 저급 언어로 변환되기까지 기다릴 필요 없음

2. 명령어의 구조

  • 명령어는 연산 코드와 오퍼랜드로 구성된다.
    • 수행할 연산 + 오퍼랜드(연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치(주소필드))
    • 오퍼랜드에는 연산에 사용될 데이터가 저장된 위치(주소 필드)가 훨씬 더 자주 저장된다.

연산 코드

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

 

  • 연산 코드의 종류 & 생김새는 CPU 마다 다르다.

대표적인 연산 코드의 종류

  1. 데이터 전송
    • MOVE : 데이터를 옮겨라 (레지스터에서 다른 레지스터로 옮길 때)
    • STORE : 메모리에 저장하라
    • LOAD(FETCH) : 메모리에서 CPU로 데이터를 가져와라
    • PUSH : 스택에 데이터를 저장하라
    • POP : 스택의 최상단 데이터를 가져와라
  2. 산술/논리 연산
    • ADD / SUBTRACT / MULTIPLY / DIVIDE : 덧셈 / 뺄셈 / 곱셈/ 나눗셈을 수행하라
    • INCREMENT / DECREMENT : 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빼라 
    • AND / OR / NOT : AND / OR / NOT 연산을 수행하라
    • COMPARE : 두 개의 숫자 또는 TRUE / FALSE 값을 비교하라
  3. 제어 흐름 변경
    • JUMP : 특정 주소로 실행 순서를 옮겨라
    • CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
    • HALT : 프로그램의 실행을 멈춰라
    • CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
      • 함수 호출하고 나서 다시 호출했던 부분으로 되돌아오기
    • RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
  4. 입출력 제어
    • READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
    • WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라
    • START IO : 입출력 장치를 시작하라
    • TEST IO : 입출력 장치의 상태를 확인하라

명령어 주소 지정 방식(addressing modes) 

  • 데이터 대신 메모리 주소 필드를 입력하는 이유: 데이터 크기의 한계 때문
  • 연산에 사용할 데이터가 저장된 위치를 찾는 방법
  • 유효 주소[(effective address) : 연산에 사용할 데이터가 저장된 위치]를 찾는 방법
  • 다양한 명령어 주소 지정 방식들
  1. 즉시 주소 지정 방식 (immediate addressing mode)
    • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
    • 가장 간단한 형태의 주소 지정 방식
    • 연산에 사용할 데이터의 크기가 작아질 수 있지만, 빠름
  2. 직접 주소 지정 방식 (diresct addressing mode)
    • 오퍼랜드 필드에 유효 주소 직접적으로 명시
    • 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦
  3. 간접 주소 지정 방식 (indirect addressing mode)
    • 오퍼랜드 필드에 유효 주소의 주소를 명시
    • 앞선 주소 지정 방식들에 비해 속도가 느림(CPU가 메모리를 뒤적뒤적 거리기 때문에)=> CPU가 메모리 접근을 최소화 해야 속도가 빨라짐
  4. 레지스터 주소 지정 방식 (register addressing mode)
    • 연산에 사용할 데이터가 저장된 레지스터 명시
    • CPU가 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름(메모리는 CPU 밖에 있고, 레지스터는 CPU 안에 있기 때문)
    • 직접 주소 지정 방식보다 조금 더 빠를 수 있음
  5. 레지스터 간접 주소 지정 방식 (register indirect addressing mode)
    • 연산에 사용할 데이터를 메모리에 저장
    • 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시 

직접 주소 지정 방식
간접 주소 지정 방식
레지스터 주소 지정 방식
레지스터 간접 주소 지정 방식