//구글콘솔 광고 추가가

명령어의 구조

저급언어에는 기계어와 어셈블리어로 이루어져 있는데 이런 저급언어는 명령어들로 이루어져 있음.

명령어의 구조 ( == 연산 코드 + 오퍼랜드)

연산 코드(수행할 연산) + 오퍼랜드(연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치(==주소필드))

**오퍼랜드의 개수는 여러개가 될수도 있고 하나도 없을 수도 있다.(하나도 없는경우 0주소, 한개인 경우 1주소, 두개인 경우 2주소 등 오퍼팬드의 갯수에 따라 "갯수+ 주소"로 불릴수 있음.)

연산코드란 수행할 연산을 뜻함

  • 연산 코드의 종류와 생김새는 CPU에 따라 다르지만 공통적으로 들어가는 요소들 4가지가 있음(1. 데이터 전송. 2.산술/논리 연산. 3. 제어 흐름 변경. 4. 입출력 제어)

대표적인 연산 코드의 종류

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

오퍼랜드에 저장된 위치인 주소값으로 저장하는 이유

  • 하나의 오퍼랜드에 표현될 수 있는 데이터의 크기가 훨씬 커짐

명령어 주소 지정 방식

  • 유효주소(effective adress): 연산에 사용할 데이터가 저장된 위치
  • 명령어 주소 지정방식(addressing modes): 연산에 사용할 데이터가 저장된 위치를 찾는 방법 == 유효 주소를 찾는 방법, 다양한 명령어 주소 지정 방식들이 있음.

명령어 주소 지정 방식

  • 즉시 주소 지정 방식(immediate addressing mode): 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시, 가장 간단한 형태의 주소 지정 방식, 단점으론 연산에 사용할 데이터의 크기가 작아질수 있지만 빠름.
  • 직접 주소 지정 방식(direct addressing mode) : 오퍼랜드 필드에 유효 주소 직접적으로 명시, 단점으론 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦.
  • 간접 주소 지정 방식(indirect addressing mode): 오퍼랜드 필드에 유효 주소의 주소를 명시, 단점으론 앞선 주소지정 방식들에 비해 속도가 느림. >>메모리를 뒤적뒤적해서 느림
  • 레지스터 주소 지정 방식(register addressing mode): 연산에 사용할 데이터가 저장된 레지스터 명시, 메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠름.
  • 레지스터 간접 주소 지정 방식(register indirect addressing mode) : 연산에 사용할 데이터를 메모리에 저장, 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
728x90
고급 언어와 저급 언어란?

 

고급언어 : 개발자가 이해하기 쉽게 만든 언어

 

저급언어: 컴퓨터가 이해하고 실행하는 언어

  • 기계어 : 이진수(0과1)로 이루어진 명령어
  • 어셈블리어 : 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어

 

고급언어를 저급언어로 변환 하는 과정에는 컴파일방식과 인터프리터방식이 있음.
  • 컴파일 언어: 고급언어에서 쓴 소스 코드를 컴파일러에 의해 컴파일이 되어 저급언어인 목적코드로 변환이 됨. 컴파일러에 의해 소스코드를 전부 훑어보고 전체를 목적코드로 컴파일함. 이로 인해 소스코드 컴파일 중간에 오류가 발생하면 소스전체가 실행되지 않음.
  • 인터프리트 언어: 인터프리터에 의해 한 줄씩 실행. 소스코드 전체가 저급언어로 변환되기까지 기다릴 필요 X. 한줄씩 실행하기 때문에 소스코드 인터프리트 중 오류가 발생하면 오류 발생 전까지 코드는 실행됨.

** 컴파일과 인터프리트 과정을 살펴보려면

: https://godbolt.org/ 여기서 고급언어를 선택한 후 소스코드를 적어보면 저급언어로 어떻게 변환되는지 확인 가능.

 

728x90
문자 집합과 인코딩

  • 문자 집합(Character set) : 컴퓨터가 이해(표현)할 수 있는 문자의 모음
  • 인코딩(encoding) : 코드화하는 과정, 문자를 0과 1로 이루어진 문자 코드로 변환하는 과정.
  • 디코딩(decoding) : 코드를 해석하는 과정, 0과 1로 표현된 문자 코드로 문자로 변환하는 과정, 인코딩의 반대

 

대표적이고, 대중적인 문자 집합, 인코딩 방법인
" 아스키 코드 "
  • 초창기 문자 집합 중 하나.
  • 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자.
  • 7비트로 하나의 문자 표현(실제로는 8비트를 쓰지만 1비트는 오류 검출을 위해 사용되는 패리티 비트(parity bit)) == 0부터 127개의 아스키코드가 있으며 총개수는 2의 7승인 128개.
  • A는 65로 인코딩, a는 97로 인코딩.
  • 장점 : 간단한 인코딩.
  • 단점 : 한글을 포함한 다른 언어 문자, 다양한 특수 문자 표현 불가 - 아스키 코드는 7비트로 하나의 문자를 표현하기에 128개보다 많은 문자를 표현할 수 없음. 8비트 확장 아스키가 등장했지만, 여전히 부족함.

한글 인코딩: 완성형 인코딩(ex: 남) vs 조합형(ex: ㄴ + ㅏ + ㅁ) 인코딩

  • 초성, 중성, 종성의 조합으로 이루어진 한글은 전체를 하나로 묶어 글자 하나를 인코딩할지(완성형 인코딩), 다 나눠서 각각 인코딩할지(조합형 인코딩)로 나뉨.
  • EUC-KR : KS X 1001 KS X 1003 문자집합 기반의 한글 인코딩 방식, 완성형 인코딩이며 글자 하나하나에 2바이트 크기의 코드 부여(dencode.com에서 테스트확인 가능). 하지만 모든 한글을 표현할 순 없음.
하지만 모든 한글을 표현할순 없다. >> 그래서 만들어진 유니코드 문자집합
  • 이걸 해결 하기 위해 통일된 문자 집합인 유니코드 문자 집합이 만들어짐. - 한글, 영어, 화살표와 같은 특수 문자들이 포함되어 있으며 현대 문자 표현에 있어 매우 중요한 위치에 있다.
  • 유니코드의 인코딩 방식은 utf-8, utf-16, utf-32 ...이 있음. 여기서 utf의 뜻은 Unicode Transformation Format의 줄임말로 유니코드 인코딩 방법이란 뜻임. - 가장 대중적인 방식인 utf-8 인코딩 : 가변 길이 인코딩으로 인코딩 결과가 1바이트 ~ 4바이트가 될 수 있음(인코딩 결과가 몇 바이트가 될지는 유니코드에 부여된 값에 따라 다름.).
  •  https://onlineutf8tools.com/convert-utf8-to-binary직접 눈으로 확인 가능.

예전에 회사에서 프로젝트 안에서 가상 키보드를 띄워서 아이디나 닉네임을 저장하는 부분을 구현한 적이 있었는데 그때도 한글 키보드를 구현하기 어려워서 시간을 많이 쏟았던 기억이 있다. 지금의 공부를 하고나서 구글링 했을때 나왔던 방법 이해했으면 이해하기 더 쉬웠을 거란 생각이 든다. 

 

++ 추가로 한글 인코딩에 대해 더 자세하게 나온 블로그

https://www.vbflash.net/192

 

참고 : 인프런 < 개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제 >

728x90

컴퓨터 구조

컴퓨터가 이해하는 정보
  • 데이터 : 숫자, 문자, 이미지, 동영상과 같은 정적인 정보, 컴퓨터와 주고받는/ 내부에 저장된 정보를 데이터라 통칭, 0과 1로 숫자, 문자를 표현하는 방법
  • 명령어 : 컴퓨터는 결국 명령어를 처리하는 기계, 명령어란 컴퓨터를 실질적으로 움직이는 정보이며, 데이터는 명령어를 위한 일종의 재료
컴퓨터의 네 가지 핵심 부품
  • CPU
  • 메모리
  • 보조기억장치
  • 입출력 장치
CPU(== 컴퓨터의 두뇌) : 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 부품.
1. CPU는 메모리에 저장된 값을 읽어 들이고, 해석하고, 실행하는 장치.
2. CPU 내부에는 ALU(계산하는 장치),레지스터(임시저장 장치), 제어장치(제어신호를 발생시키고 명령어를 해석하는 장치)가 있다.
- CPU의 핵심부품 3가지
1. ALU : 계산기(계산을 위한 회로들의 모임)
2. 제어장치 : CPU 내부의 작은 저장장치
3. 레지스터 : 제어 신호(컴퓨터 부품들을 관리하고 작동시키기 위한 전기신호)를 내보내고, 명령어를 해석하는 장치.( ++ CPU가 메모리에 저장된 값을 읽고 싶을 떈 메모리를 향해 메모리 읽기 라는 제어 신호를 보내고. CPU가 메모리에 어떤 값을 저장하고 싶을 땐 메모리를 향해 메모리 쓰기라는 제어 신호를 보냄)
메모리(== 주기억장치(RAM, ROM), 메인메모리) : 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품. 
1. 프로그램이 실행되기 위해서는 메모리에 저장되어 있어야 한다. 2. 메모리는 실행되는 프로그램의 명령어와 데이터를 저장한다. 3. 메모리에 저장된 값의 위치는 주소로 알 수 있다. * 메모리는 전원이 꺼지면 저장된 내용을 잃는다. 
보조기억장치(usb, sd카드, ssd, cd롬 등 백업용 저장장치) : 전원이 꺼져도 보관될 프로그램을 저장하는 부품. 실행되지 않는 부분 저장
입출력장치(컴퓨터 외부에서 컴퓨터로 정보를 주고받을 수 있는 장치 >> 키보드, 마이크, 마우스, 모니터, 프린터, 와콤 등등) :
컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품.

 

메모리는 실행할 정보(실행할 프로그램)를 저장하고, 보조 기억장치는 보관할 정보(보관할 프로그램)를 저장한다.

 

이 모든게 부착되는 곳이 메인보드 혹은 마더보드(mainboard 또는 motherboard)라 함. 이 메인보드 안에서 CPU, 메모리, 보조기억장치, 입출력 장치들이 버스란 걸 통해 서로 정보를 주고받을 수 있음. 그중 가장 중요한 시스템 버스(== 인간의 척추정도)라는 통로를 통해서 정보를 주고받을 수 있다.
메인보드 :
1. 메인보드에 연결된 부품은 버스를 통해 정보를 주고 받음.
2. 버스는 컴퓨터의 부품끼리 정보를 주고 받는 일종의 통로.
3. 타양한 종류의 버스가 있음.
4. 컴퓨터의 핵심 부품을 연결하는 버스는 시스템 버스.(*시스템 버스의 내부 구성 : 주소버스(주소를 주고받는 통로), 데이터버스(명령어와 데이터를 주고받는 통로), 제어버스(제어신호를 주고받는 통로))
728x90

+ Recent posts