no image
[컴퓨터 구조] 명령어의 구조와 주소 지정 방식
이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 연산 코드와 오퍼랜드 명령어는 연산 코드와 오퍼랜드로 구성되어 있다. 연산 코드 오퍼랜드 위 그림의 색으로 칠해져 있는 필드 값, 즉 '명령어가 수행할 연산'을 연산 코드라 하고, 흰색 배경 필드 값, 즉 '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 오퍼랜드라고 한다. 후자가 훨씬 더 많이 사용하므로 이를 주소 필드라고 부르기도 한다. 연산 코드는 연산자, 오퍼랜드는 피연산자라고도 부른다. 이를 간단한 그림으로 나타내면 아래와 같다. 명령어는 연산 코드와 오퍼랜드로 구성되어 있다. 연산 코드는 명령어가 수행할 연산이다. 오퍼랜드는 '연산에 사용..
2023.03.11
no image
[컴퓨터 구조] 고급 언어와 저급언어, 컴파일과 인터프리터
이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 고급 언어와 저급 언어 우리 프로그램을 만들기 위해서 사용하는 언어는 컴퓨터가 이해하는 언어가 아닌 사람이 이해하기 쉽게 만들어진 언어이다. 사람이 이해하기 쉽게 만들어진 언어를 고급 언어라고 한다. 반대로 컴퓨터가 직접 이해하고 실행할 수 있는 언어를 저급 언어라고 한다. 컴퓨터가 이해하고 실행할 수 있는 언어는 오직 저급 언어뿐이다. 그래서 고급 언어로 작성된 소스 코드는 반드시 저급 언어, 즉 명령어로 변환되어야 한다. 저급 언어는 아래와 같이 두 가지 종류가 있다. 기계어 어셈블리어 기계어 0과 1의 명령어 비트로 이루어진 언어이다. 2진수 또는 16진수로 표현된..
2023.03.09
no image
[컴퓨터 구조] 컴퓨터가 문자를 표현하는 방법
이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 문자 집합과 인코딩 문자 집합(character set) 컴퓨터가 이해할 수 있는 문자의 모음 인코딩 (encoding) 코드화하는 과정 문자를 0과 1로 이루어진 문자 코드로 변환하는 과정 디코딩(decoding) 코드를 해석하는 과정 0과 1로 표현된 문자 코드를 문자로 변환하는 과정 아스키 코드 아스키 코드란? 초창기 문자 집합 중 하나 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자 7비트로 하나의 문자 표현(8비트 중 1비트는 오류 검출을 위해 사용되는 패리티 비트) 아스키 코드는 7bit를 표현할 수 있으므로 2⁷인 128개의 문자를 표현할 수 있다. ..
2023.03.07
no image
[컴퓨터 구조] 0과 1로 숫자를 표현하는 방법
이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다. 정보 단위 컴퓨터는 0 또는 1밖에 이해하지 못한다. 0과 1을 나타내는 가장 작은 정보 단위를 비트(bit)라고 한다. 1비트는 0 또는 1을 표현할 수 있고(2가지), 2비트는 00, 01, 10, 11 이렇게 4가지를 표현할 수 있다. 3비트는 000, 001, 010, 011, 100, 101, 110, 111 이렇게 8가지를 표현할 수 있다. 따라서 n비트는 2ⁿ가지를 나타낼 수 있다. 비트 다음으로 큰 정보 단위는 바이트이다. 바이트는 8개의 비트를 묶은 것이다. 즉, 1바이트는 8비트와 같다. 그다음으로 큰 정보단위는 킬로바이트(KB)이다. 1킬로바이트는 1..
2023.03.04
no image
[컴퓨터 구조] 대략적인 컴퓨터 구조
이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 작성하였습니다. 이 글은 대략적인 컴퓨터 구조를 정리하는 글입니다. 세세한 구조는 다루지 않습니다. 컴퓨터 구조는 아래와 같이 두 가지로 나뉜다. 컴퓨터가 이해하는 정보 컴퓨터의 4가지 핵심 부품 컴퓨터가 이해하는 정보 컴퓨터가 이해하는 정보는 아래와 같이 두 가지로 나뉜다. 데이터 명령어 데이터 컴퓨터 구조에서 데이터란 숫자, 문자, 이미지, 동영상과 같은 정적인 정보를 뜻한다. 컴퓨터와 주고받는 정보 또는 내부에 저장된 정보를 데이터라고 통칭하기도 한다. 컴퓨터는 모든 데이터를 0과 1로 저장한다. 명령어 컴퓨터를 한 마디로 정의한다면, 명령어를 처리하는 기계라고 할 수 있다. 명령어는 컴퓨터를 실질적으..
2023.03.01

이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


연산 코드와 오퍼랜드

 

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

  • 연산 코드
  • 오퍼랜드

위 그림의 색으로 칠해져 있는 필드 값, 즉 '명령어가 수행할 연산'을 연산 코드라 하고, 흰색 배경 필드 값, 즉 '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 오퍼랜드라고 한다. 후자가 훨씬 더 많이 사용하므로 이를 주소 필드라고 부르기도 한다.

연산 코드는 연산자, 오퍼랜드는 피연산자라고도 부른다.

 

이를 간단한 그림으로 나타내면 아래와 같다.

  • 명령어는 연산 코드와 오퍼랜드로 구성되어 있다.
  • 연산 코드는 명령어가 수행할 연산이다.
  • 오퍼랜드는 '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'이다.
  • '연산에 사용할 데이터가 저장된 위치'가 훨씬 많이 쓰이므로 주소 필드라고 하기도 한다.

 

오퍼랜드

오퍼랜드 필드에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기보다는, 많은 경우 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담긴다. 그래서 오퍼랜드 필드를 주소 필드라고 부르기도 한다.

오퍼랜드는 명령어 안에 하나도 없을 수도 있고, 한 개만 있을 수도 있고, 한 개 이상일 수도 있다.

오퍼랜드가 하나도 없는 명령어를 0-주소 명령어,  오퍼랜드가 하나인 명령어를 1-주소 명령어, 두 개인 명령어를 2-주소 명령어, 세 개인 명령어를 3-주소 명령어라고 부른다.

 

연산 코드

연산 코드 종류는 매우 많지만, 가장 기본적인 연산 코드 유형은 아래의 4가지로 나눌 수 있다.

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

 

데이터 전송

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

 

산술/논리 연산

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

 

제어 흐름 변경

  • JUMP : 특정 주소로 실행 순서를 옮겨라
  • CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
  • HALT : 프로그램의 실행을 멈춰라
  • CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
  • RETRUN : CALL을 호출할 때 저장했던 주소로 돌아가라
CALL 과 RETURN은 함수를 호출하고 리턴하는 명령어이다.

 

입출력 제어

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

 


 

주소 지정 방식

오퍼랜드 필드에 숫자나 문자와 같이 연산에 필요한 데이터보다는 메모리나 레지스터의 주소를 담는 경우가 많다고 위에서 언급했었다.

그 이유는 가령 명령어의 크기가 16비트, 연산 코드 필드가 4비트인 2-주소 명령어에서는 오퍼랜드 필드당 6비트 정도밖에 남지 않는다.

즉, 하나의 오퍼랜드 필드로 표현할 수 있는 정보의 가짓수는 2⁶가지로 64개 밖에 되지 않는다.

하지만 여기서 오퍼랜드 필드 안에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커진다.

예를 들어 한 주소에 16비트를 저장할 수 있는 메모리가 있다고 가정하면, 이 메모리 안에 데이터를 저장하고, 오퍼랜드 필드 안에 해당 메모리 주소를 명시한다면 표현할 수 있는 정보의 가짓수가 2¹⁶가지로 확 커진다.

오퍼랜드 필드에 메모리 주소가 아닌 레지스터 이름을 명시할 때도 마찬가지이다. 이 경우 표현할 수 있는 정보의 가짓수는 해당 레지스터가 저장할 수 있는 공간만큼 커진다.

 

연산 코드에 사용할 데이터가 저장된 위치, 즉 연산의 대상이 되는 데이터가 저장된 위치를 유효 주소(effective address)라고 한다. 

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

주소 지정 방식은 아래와 같이 5가지가 있다.

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

 

즉시 주소 지정 방식

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

 

직접 주소 지정 방식

  • 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
  • 데이터의 크기는 즉시 주소 지정 방식보다 더 커졌지만, 여전히 유효 주소를 표현할 수 있는 범위가 연산 코드의 비트 수만큼 줄어들음

 

간접 주소 지정 방식

  • 직접 주소 지정 방식의 단점을 보안하기 위함
  • 유효 주소의 주소를 오퍼랜드 필드에 명시한다.
  • 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 넓다.
  • 두 번의 메모리 접근이 필요하기에 느리다.

참고
CPU가 메모리에서 데이터를 찾는 속도는 매우 느리다.

 

레지스터 주소 지정 방식

  • 직접 주소 지정 방식과 비슷하게 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법
  • 특징이 모두 직접 주소 지정 방식과 비슷함
  • 메모리보다 레지스터에서 데이터를 찾는 것이 훨씬 빠르므로 직접 주소 지정 방식보다 빠름

메모리와 레지스터
메모리는 CPU 밖에 있고, 레지스터는 CPU 내부에 있다.
따라서 CPU는 레지스터에 접근하는 속도가 훨씬 빠르다.

 

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

  • 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법
  • 유효 주소를 찾는 과정이 간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 한 번으로 줄어든다는 차이가 있다.
  • 레지스터 간접 주소 지정 방식은 간접 주소 지정 방식보다 빠르다.

 

정리하자면 아래와 같다.

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

  • 즉시 주소 지정 방식 : 연산에 사용할 데이터
  • 직접 주소 지정 방식 : 유효 주소(메모리 주소)
  • 간접 주소 지정 방식 : 유효 주소의 주소
  • 레지스터 주소 지정 방식 : 유효 주소(레지스터 이름)
  • 레지스터 간접 주소 지정 방식 : 유효 주소를 저장한 레지스터

이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


고급 언어와 저급 언어

우리 프로그램을 만들기 위해서 사용하는 언어는 컴퓨터가 이해하는 언어가 아닌 사람이 이해하기 쉽게 만들어진 언어이다. 사람이 이해하기 쉽게 만들어진 언어를 고급 언어라고 한다.

반대로 컴퓨터가 직접 이해하고 실행할 수 있는 언어를 저급 언어라고 한다.

컴퓨터가 이해하고 실행할 수 있는 언어는 오직 저급 언어뿐이다.

그래서 고급 언어로 작성된 소스 코드는 반드시 저급 언어, 즉 명령어로 변환되어야 한다.

 

저급 언어는 아래와 같이 두 가지 종류가 있다.

  • 기계어
  • 어셈블리어

 

기계어

  • 0과 1의 명령어 비트로 이루어진 언어이다.
  • 2진수 또는 16진수로 표현된다.
  • 기계어는 오로지 기계를 위해 만들어진 언어이기 때문이 사람이 이해하기 어렵다.

 

어셈블리어

  • 기계어를 사람이 조금 더 이해하기 쉬운 형태로 번역한 것이 어셈블리어이다.
  • 어셈블리어는 0과 1로 이루어진 기계어를 읽기 편하게 만든 저급 언어일 뿐 개발자가 어셈블리어를 이용해 복잡한 프로그램을 만들기란 쉽지 않다.
  • 하드웨어와 밀접하게 맞닿아 있는 프로그램을 개발하는 임베디드 개발자, 게임 개발자, 정보 보안 분야등의 개발자는 어셈블리어를 많이 사용한다.

 


 

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

고급 언어로 작성된 소스 코드는 결국 저급 언어로 변환되어 실행해야 하는데, 고급 언어에서 저급 언어로 변환되는 방법은 크게 2가지가 있다. 그 방법은 아래와 같다.

  • 컴파일 방식
  • 인터프리터 방식

 

컴파일 언어

  • 컴파일 방식을 사용하는 언어를 컴파일 언어라고 한다.
  • 컴파일 언어는 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어이다.
  • 컴파일 언어로 작성된 소스 코드는 코드 전체가 저급 언어로 변환되는 과정을 거친다. 이 과정을 컴파일이라고 한다.
  • 컴파일을 수행해 주는 도구를 컴파일러라고 한다.
  • 컴파일러가 소스 코드 내에서 오류를 하나라도 발견하면 해당 소스 코드는 컴파일에 실패한다.
  • 컴파일이 성공적으로 수행되면 개발자가 작성한 소스 코드는 컴퓨터가 이해할 수 있는 저급 언어로 변환된다. 이렇게 컴파일러를 통해 저급 언어로 변환된 코드를 목적 코드라고 한다.
  • 대표적인 컴파일 언어로는 C, C++, JAVA 등이 있다.

 

목적 파일 VS 실행 파일
목적 코드로 이루어진 파일을 목적 파일이라고 부른다. 마찬가지로 실행 코드로 이루어진 파일을 실행 파일이라고 부른다.
윈도우의 .exe 확장자를 가진 파일이 대표적인 실행 파일이다.
목적 파일과 실행 파일은 같은 의미가 아니다.
목적 코드가 실행 파일이 되기 위해서는 링킹이라는 작업을 거쳐야 한다.
즉, 고급 언어가 컴파일을 거쳐 목적 코드가 되고, 목적 코드가 링킹을 거쳐 실행 파일이 되는 것이다.
링킹(Linking)
링킹은 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드될 수 있고 실행될 수 있는 한 개의 파일로 만드는 작업이다. 이 파일이 메모리에 로딩되어 실행된다. 링크는 컴파일 시에 수행되는 경우도 있고, 로딩시에 수행되는 경우도 있고, 실행시에 수행되는 경우도 있다.

 

인터프리터 언어

  • 인터프리터 방식을 사용하는 언어를 인터프리터 언어라고 한다.
  • 인터프리터 언어는 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어이다.
  • 소스 코드가 전체가 저급 언어로 변환되는 컴파일 언어와는 달리, 인터프리터 언어는 소스 코드를 한 줄씩 차례로 실행한다.
  • 소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구를 인터프리터라고 한다.
  • 인터프리터는 소스 코드를 한 줄씩 실행하기에 소스 코드 전체를 저급 언어로 변환하는 시간을 기다릴 필요가 없다.
  • 또한 소스코드 N번째 줄에 문법 오류가 있더라도, N-1번째 줄까지는 정상적으로 수행된다.
  • 대표적인 인터프리터 언어로는 파이썬이 있다.

 

인터프리터 언어가 컴파일 언어보다 빠르다고 생각할 수도 있지만, 일반적으로 인터프리터 언어는 컴파일 언어보다 느리다. 컴파일을 통해 나온 결과물, 즉 목적 코드는 컴퓨터가 이해하고 실행할 수 있는 저급 언어인 반면, 인터프리터 언어는 소스 코드 마지막에 이를 때까지 한 줄 한 줄씩 저급언어로 해석하며 실행해야 하기 때문이다.

 

컴파일 언어와 인터프리터 언어의 경계는 모호하다.
C, C++는 명확하게 컴파일 언어로 구분되지만, 많은 프로그래밍 언어는 컴파일 언어와 인터프리터 언어 간의 경계가 모호한 경우가 많다.
파이썬도 컴파일을 하지 않는 것은 아니며, 자바도 저급 언어가 되는 과정에서 컴파일과 인터프리트를 동시에 수행한다.
"고급 언어가 저급 언어로 변환되는 대표적인 방법에는 컴파일 방식과 인터프리트 방식이 있다." 정도로만 이해하는 것이 좋다.

이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


문자 집합과 인코딩

 

문자 집합(character set)

  • 컴퓨터가 이해할 수 있는 문자의 모음

인코딩 (encoding)

  • 코드화하는 과정
  • 문자를 0과 1로 이루어진 문자 코드로 변환하는 과정

디코딩(decoding)

  • 코드를 해석하는 과정
  • 0과 1로 표현된 문자 코드를 문자로 변환하는 과정

 


 

아스키 코드

아스키 코드란?

  • 초창기 문자 집합 중 하나
  • 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자
  • 7비트로 하나의 문자 표현(8비트 중 1비트는 오류 검출을 위해 사용되는 패리티 비트)
  • 아스키 코드는 7bit를 표현할 수 있으므로 2⁷인 128개의 문자를 표현할 수 있다.
  • 인코딩이 간단
  • 한글을 포함한 다른 언어 문자, 다양한 특수 문자를 표현 불가
패리티 비트(parity bit)
8비트 구조에서 패리티 비트는 7비트 크기의 아스키 코드를 제외한 나머지 1비트다.
패리티 비트는 전송 과정에서 1비트 오류를 검출하기 위해, 패리티 비트를 포함해 1의 개수가 짝수나 홀수개가 되도록 한다.
짝수 패리티 방식은 1의 개수를 짝수로 만드는 것이다. 만약 1의 개수가 짝수가 아니면 오류가 발생한 것이다.
홀수 패리티 방식은 1의 개수를 홀수로 만드는 것이다. 만약 1의 개수가 홀수가 아니면 오류가 발생한 것이다.

 

아스키 코드는 0 ~ 127까지 총 128개의 숫자 중 하나의 문자를 일대일로 대응시킨 것이다.

예를 들어, 알파벳 A는 십진수 65로 변환되고 65를 이진수로 변환하여 1000001로 인코딩 된다.

코드 포인트
문자 인코딩에서 글자에 부여된 고유한 값을 코드 포인트라고 한다.
문자 A의 코드 포인트는 65이다.

 

아래는 아스키 코드표이다.

https://velog.io/@exploit017

 


 

한글 인코딩(완성형과 조합형)

한글 인코딩에는 두 가지 방식이 있다.

  • 완성형 인코딩 : 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 방식
  • 조합형 인코딩 : 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식

 


 

EUC- KR

  • 완성형 인코딩 방식
  • 초성, 중성, 종성이 모두 결합된 한글 단어에 2바이트 크기의 코드를 부여
  • 2바이트 == 16비트 == 4자리 16진수로 표현
  • 2,350개 정도의 한글 단어를 표현 가능
  • 쀍, 쀓, 믜 등 모든 한글을 표현할 수 없음
  • 언어별 인코딩 방식을 따로 제공

 

출처 : https://ithub.tistory.com/277

'가'는 위 표에 의하여 16진수인 b0a1로 변환되고 다시 2진수인 1011000010100001로 변환된다.

 


 

유니코드와 UTF-8

유니코드

  • 통일된 문자 집합
  • 한글, 영어, 화살표와 같은 특수 문자, 이모티콘 등등 다양한 문자 지원
  • UTF-8, UTF-16, UTF-32 등 여러 인코딩 방식이 있다.
  • UTF-8 방식이 가장 대중적이다.

 

UTF-8

  • 가변 길이 인코딩 : 인코딩 결과가 1바이트 ~ 4바이트
  • 인코딩 결과가 몇 바이트가 될지는 유니코드에 부여된 값에 따라 다름

  • 유니코드 문자에 부여된 값의 범위가 0부터 007F(16진수)까지는 1바이트로 표현
  • 유니코드 문자에 부여된 값의 범위가 0080(16진수)부터 00FF(16진수)까지는 2바이트로 표현
  • 유니코드 문자에 부여된 값의 범위가 0800(16진수)부터 FFFF(16진수)까지는 3바이트로 표현
  • 유니코드 문자에 부여된 값의 범위가 10000(16진수)부터 10FFFF(16진수)까지는 4바이트로 표현

 

한글에서 '한'은 D55C, '글'은 AE00 이므로 모두 0800과 FFFF사이에 있으므로 '한'과 '글'은 UTF-8로 인코딩하면 3바이트로 표현된다.

D55C는 2진수로 1101 0101 0101 1100, AE00은 1010 1110 0000 0000 이다.

위의 이진수를 이 표에 대입하면

한 : 11101101 10010101 10011100

글 : 11101010 10111000 10000000

이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


정보 단위

컴퓨터는 0 또는 1밖에 이해하지 못한다.

0과 1을 나타내는 가장 작은 정보 단위를 비트(bit)라고 한다.

1비트는 0 또는 1을 표현할 수 있고(2가지), 2비트는 00, 01, 10, 11 이렇게 4가지를 표현할 수 있다.

3비트는 000, 001, 010, 011, 100, 101, 110, 111 이렇게 8가지를 표현할 수 있다.

따라서 n비트는 2ⁿ가지를 나타낼 수 있다.

비트 다음으로 큰 정보 단위는 바이트이다.

바이트는 8개의 비트를 묶은 것이다. 즉, 1바이트는 8비트와 같다.

그다음으로 큰 정보단위는 킬로바이트(KB)이다. 1킬로바이트는 1000바이트와 같다.

이후에 나오는 더 큰 정보단위는 이전 단위를 1000개씩 묶은 것과 같다.

 

1KB = 1024byte 아닌가?
마찬가지로 1MB = 1024KB, 1GB = 1024MB... 등으로 표현하는 것은 잘못된 관습이다.
이전 단위를 1024개 묶어 표현한 단위는 Kib, Mib, Gib, Tib이다.

 

워드(word)
워드란 CPU가 한 번에 처리할 수 있는 데이터 크기를 뜻한다.
만약 CPU가 16비트를 처리할 수 있다면, 1워드는 16비트가 된다.
이렇게 정의된 워드의 절반 크기를 하프 워드, 1배 크기를 풀위드, 2배 크기를 더블 워드라고 부른다.
워드 크기가 큰 CPU는 한 번에 처리할 수 있는 데이터가 많다.
워드 크기는 CPU마다 다르지만, 현대 컴퓨터의 워드 크기는 대부분 32비트 또는 64비트이다.
인텔의 x86 CPU는 32비트 워드 CPU, x64 CPU는 64비트 워드 CPU이다.

 


 

이진법

  • 0과 1로 수를 표현하는 방법
  • 숫자가 1을 넘어가는 시점에 자리올림
  • 우리가 일상적으로 사용하는 진법은 숫자가 9를 넘어갈 때 자리올림하는 십진법

 

이진수의 음수 표현방법 (2의 보수)

  • 먼저 1의 보수를 취한다(1과 0 반전하기)
  • 1을 더한다.
  • 이진수 1011을 음수로 만들면, 1011 -> 0100 -> 0101

제대로 구했는지 확인해 보려면 구한 값에 다시 2의 보수를 취하면 된다.

그냥 2진수만 보고 양수인지 음수인지 어떻게 알 수 있나?
컴퓨터 내부에서 어떤 수를 다룰 때, 이 수가 양수인지 음수인지를 구분하기 위해 플래그(flag)를 사용한다.
플래그를 통해서 어떤 이진수가 양수인지 음수인지 알 수 있다.
쉽게 말하자면 컴퓨터 내부의 숫자들은 양수, 또는 음수를 표시하는 방법이 있다는 뜻이다.
프로그래밍 코드에서 2진수 여부를 나타내는 방법
십진수 8을 코드상에 이진수로 나타내면 0b1010으로 나타낸다.

 


 

십육진법

  • 이진법으로 모든 정보를 표현하기엔 숫자가 너무 길어져서 사용
  • 수가 15를 넘어가는 시점에서 자리올림을 함

 

16진수를 2진수로 변환하기

위의 표를 이용하여 16진수 한 글자를 4비트의 이진수로 간주한다.

EX) 16진수 1A2B를 2진수로 변환하면 0001 1010 0010 1011이 된다.


0001 1010 0010 1011은 설명을 위해 4자리씩 끊은 것이다.
실제론 0001101000101011 이렇게 끊지 않고 표현한다.

 

2진수를 16진수로 변환하기

4자리씩 끊고 16진수에 해당하는 수로 바꿔주면 된다.

EX) 이진수 0001101000101011 -> 0001 1010 0010 1011 -> 1A2B

 

프로그래밍 코드에서 16진수 여부를 나타내는 방법
십진수 10을 코드상에 십육진수로 나타내면 0xA로 나타낸다.

 

이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 작성하였습니다.


이 글은 대략적인 컴퓨터 구조를 정리하는 글입니다. 세세한 구조는 다루지 않습니다.

컴퓨터 구조는 아래와 같이 두 가지로 나뉜다.

  • 컴퓨터가 이해하는 정보
  • 컴퓨터의 4가지 핵심 부품

 


 

컴퓨터가 이해하는 정보

컴퓨터가 이해하는 정보는 아래와 같이 두 가지로 나뉜다.

  • 데이터
  • 명령어

 

데이터

컴퓨터 구조에서 데이터란 숫자, 문자, 이미지, 동영상과 같은 정적인 정보를 뜻한다.

컴퓨터와 주고받는 정보 또는 내부에 저장된 정보를 데이터라고 통칭하기도 한다.

컴퓨터는 모든 데이터를 0과 1로 저장한다.

 

명령어

컴퓨터를 한 마디로 정의한다면, 명령어를 처리하는 기계라고 할 수 있다.

명령어는 컴퓨터를 실질적으로 움직이는 정보이다.

데이터는 명령어 처리를 위한 재료이다.

인간이 컴퓨터에게 명령어를 전달하기 위해서 프로그래밍 언어를 배운다.

명령어를 예로 들면 아래와 같다.

  • 1과 2를 더하라
  • "컴퓨터 구조"를 출력하라

 


 

컴퓨터의 4가지 핵심 부품

컴퓨터의 4가지 핵심 부품은 아래의 4개와 같다.

  • CPU
  • 메모리(RAM, ROM)
  • 보조기억장치(SSD, HDD 등등)
  • 입출력 장치(키보드, 마우스, 마이크, 스피커 등등)
메인보드(마더보드)
이러한 4가지 핵심 부품이 상호작용을 하려면 한 곳으로 모이는 장소가 필요하다.
그런 장소를 메인보드라고 한다.
버스
우리가 가까운 장소에 있더라도 벽에 가려져 있으면 만날 수 없듯이, 부품끼리도 통로가 필요하다.
부품끼리 정보를 주고, 받을 수 있도록 해주는 일종의 통로를 버스라고 한다.
버스는 여러 종류가 있으나, 핵심 부품을 연결하는 버스는 시스템 버스이다.

 

CPU(산술연산논리장치)

CPU는 메모리에 저장된 명령어를 읽고, 읽은 명령어를 해석하고, 실행하는 역할을 한다.

CPU 내부에는 ALU, 레지스터, 제어장치라는 부품들이 있다.

  • ALU : CPU 내부에서 계산기와 같은 역할을 수행
  • 레지스터 : CPU 내부에 있는 작은 저장장치 (보통 여러 개가 있다)
  • 제어장치 : 제어 신호를 내보내고, 명령어를 해석하는 장치
제어 신호
컴퓨터 부품들을 관리하고 작동시키기 위한 전기신호
이러한 신호에는 대표적으로 메모리 읽기, 쓰기 신호가 있다.

메모리 읽기 신호 : CPU가 메모리의 특정 값을 읽기 위해 보내는 신호
메모리 쓰기 신호 : CPU가 메모리에 특장 값을 저장하기 위해 보내는 신호

 

그림으로 보는 3가지 CPU의 핵심 부품의 역할
그림 출처 : https://hongong.hanbit.co.kr/

 

메모리(RAM)(주기억장치)

  • 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품이다.
  • 휘발성 저장장치라는 점에서 보조기억장치와 대비된다.
  • 보조기억장치보다 속도는 더 빠르며, 가격은 더 비싸다.
  • 보조기억장치에서 CPU로 바로 데이터를 상호작용하는 것은 속도가 매우 느리고, 비효율적이어서, 중간 연결다리 역할을 메모리가 한다. 그리하여 주기억장치를 메모리라고 한다.
  • 메모리는 보조기억장치에서 필요한 정보를 가져오고 빠르게 CPU와 상호작용한다.
  • 우리가 주소를 알아야 건물을 찾아갈 수 있듯이, 메모리에도 주소라는 개념이 사용된다. 메모리 주소에 위치한 공간에는 명령어와 데이터가 저장되어 있다.

 

 휘발성 저장장치
휘발성 저장장치는 전원 공급이 중단되면 저장되어 있던 데이터가 모두 소멸되는 것을 말한다.
반대로 비휘발성 저장장치는 전원 공급이 중단되어도 데이터가 소멸되지 않는다.

 

보조기억장치(SSD, HDD 등등)

주기억장치에 모든 정보를 저장한다면 그 컴퓨터의 가격은 우리가 시중에서 구매할 수 있는 컴퓨터의 가격보다 몇 배나 더 비쌀 것이다.

또한, 주기억장치는 휘발성 기억장치이므로 데이터를 읽지 않기 위해서는 평생 동안 컴퓨터를 끌 수 없을 것이다.

이러한 주기억장치의 단점 때문에 보조기억장치가 개발되었고, 사용되고 있다.

보조기억장치는 비휘발성 기억장치이다.

 

입출력 장치(키보드, 마우스, 마이크, 스피커 등등)

입출력장치는 마이크, 스피커, 프린터, 마우스, 키보드처럼 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치를 뜻한다.

 

메인보드와 시스템 버스

메인보드(마더보드)
CPU, 주기억장치, 보조기억장치, 입출력장치와 같은 핵심 부품이 상호작용을 하려면 한 곳으로 모이는 장소가 필요하다. 핵심 부품이 모여있는 장소를 메인보드라고 한다.

메인보드는 핵심 부품 외에 여러 컴퓨터 부품을 부착할 수 있는 슬롯과 연결 단자가 있다.

 

버스
우리가 가까운 장소에 있더라도 벽에 가려져 있으면 만날 수 없듯이, 부품끼리도 통로가 필요하다.
부품끼리 정보를 주고, 받을 수 있도록 해주는 일종의 통로를 버스라고 한다.
버스는 여러 종류가 있으나, 핵심 부품을 연결하는 가장 중요한 버스는 시스템 버스이다.

 

시스템 버스는 아래와 같이 3가지로 구성된다.

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

 

그림으로 보는 CPU와 메모리의 제어 신호 상호작용
-메모리 읽기 신호를 보냈을 때


-메모리 쓰기 신호를 보냈을 때
그림 출처 : https://hongong.hanbit.co.kr/