#3. 컴퓨터 구조 및 운영체제

Maengkkong·2023년 12월 5일
0

스터디

목록 보기
3/14

고급 언어와 저급 언어

프로그래밍 언어는 컴퓨터가 이해하는 언어가 아닌 사람이 이해하고 작성하기 쉽게 만들어진 언어이다.

  • 고급 언어(high-level programming language)
    : 사람이 이해하기 쉬운 언어
  • 저급 언어(low-lovel prgramming language)
    : 컴퓨터가 이해하기 쉬운 언어
    : 기계어 (0과 1의 명령어 비트로 이루어진 언어 / 가독성을 위해 16진수로도 표현)
    : 어셈블리어 (기계어를 사람이 읽을 수 있을 수 있는 형태로 변환된 저급 언어)

컴퓨터가 이해하고 실행할 수 있는 언어는 오직 저급 언어
: 고급 언어로 작성된 소스 코드를 실행시키려면 저급언어 즉, 명령어로 변환시켜야 한다.


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

고급언어를 저급언어로 변환시키는 방법
1) 컴파일 방식 2) 인터프리트 방식이 있다.
컴파일 방식으로 작동하는 프로그래밍 언어를 컴파일 언어
인터프리트 방식으로 작동하는 프로그래밍 언어를 인터프리터 언어

  • 컴파일 언어
    : 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되는 고급언어
    : 고급 언어 > 저급 언어로 변화는 과정을 컴파일(Compile)
    : 컴파일 수행 도구를 컴파일러(Compiler)
    : 컴파일러를 통해 저급 언어로 변환된 코드를 목적코드(Object Code)라고 한다.

  • 인터프리터 언어
    : 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어
    : 저급 언어로 변화하여 실행해 주는 도구를 인터프리터(interpreter)
    : 소스 코드 내 하나의 오류가 발생 > 오류 발생 전까지 코드 실행 가능

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

목적 파일 & 실행 파일

  • 목적 파일
    : 목적 코드(컴파일러를 통해 저급 언어로 변환된 코드)로 이루어진 파일
  • 실행 파일
    : 실행 코드로 이루어진 파일(예시 : .exe)

목적 코드가 실행 파일이 되기 위해서는 링킹(linking)이라는 작업이 필요

소스 코드 > 컴파일 > 어셈블리 > 목적 코드 > 링킹 > 실행파일

예시)

main.c
helper.c에 있는 HELPER 더하기
화면 출력 라이브러리

main.c 컴파일 > main.o

--

helper.c
HELPER_더하기

helper.c 컴파일 > helper.o


main.c가 컴파일 되면서 main.o에 없는 외부 기능들
즉, HELPER 더하기, 화면 출력 라이브러리를 연결하는 작업을
링킹(linking)이라고 한다.

링킹이 완료되면 하나의 실행파일이 만들어진다.


명령어의 구조

연산 코드와 오퍼랜드

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

하나의 명령어
연산코드 + 오퍼랜드

  • 연산코드(operate code)(연산자) : 명령어가 수행할 연산
  • 오퍼랜드(operand)(피연산자) : 연산에 사용할 데이터 또는 연산에 사용할 데이터가 저장된 위치

오퍼랜드

연산에 사용할 데이터, 연산에 사용할 데이터가 저장된 위치를 의미
그래서 숫자와 문자 등을 나타내는 데이터
메모리, 레지스터 주소가 올 수 있다.

다만, 오퍼랜드 필드에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하는 것보다, 연산에 사용할 데이터가 저장된 메모리 주소, 레지스터 이름이 담깁니다. 그래서 오퍼랜드 필드 = 주소 필드라고 합니다.

오퍼랜드 안에는 명령어가 0개, 1개 , 2개 이상이 있을 수 있습니다.

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

연산코드

명령어가 수행할 연산을 의미

  • CPU 공통 이해 연산 코드 종류
    1) 데이터 전송
    2) 산술/논리 연산
    3) 제어 흐름 변경
    4) 입출력 제어

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 : 특정 주소로 실행 순서를 옮겨라
  • CONDITIONALJUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
  • HALT : 프로그램의 실행을 멈추라
  • CALL : 되돌아올 주소를 저장한 채 특정 주소로 실행 순서를 옮겨라
  • RETURN : Call을 호출할 때 저장했던 주소로 돌아가라

CALL과 RETRUN 은 함수를 호출하고 리턴하는 명령어

4) 입출력 제어

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

<정리>

CPU에서 명령어를 처리 > 내부에서 산술 처리
명령어를 외부에서 가져와서 cpu에서 처리
연산에 사용할 데이터 및 연산된 데이터는 설정한 코드에 따라 메모리에 저장
기계어는 컴퓨터가 이해함
기계어 + 어셈블리어 = 명령어
어셈블리어는 기계어를 우리가 이해할 수 있도록 만든 것(실제 컴퓨터는 기계어로 읽음)
어셈블리어 = 연산 코드 + 오퍼랜드로 되어 있음

코드 작성 > (저금언어로 변환 > 컴파일) 컴파일러가 저급언어로 변환 / 인터프리터로 저급언어로 변환 (컴파일 언어 = 목적 코드 Object code = 기계어 / 어셈블리어) > 기계어로 변환 > cpu에서 처리 > 처리한 데이터 메모리에 저장

컴파일 언어 특징 : 인터프리터보다 빠르다 / 오류가 하나라도 있으면, 컴파일 자체가 안됨

인터프리터 언어는 : 하나씩 해서 오류가 나타나기 전까지는 한줄씩 코드 실행


주소 지정 방식

오퍼랜드 필드에 메모리나 레지스터 주소를 담는 이유는 오퍼랜드 필드가 할당할 수 있는 공간이 더 커지기 때문이다.
오퍼랜드 필드의 길이는 연산 코드만큼 길이를 뺀 길이가 된다. 이 경우, 오퍼랜드 필드의 크기는 더욱 작아진다. 그러면 하나의 오퍼랜드 필드로 표현할 수 있는 정보의 가짓수는 더욱 늘어난다.
오퍼랜드 필드 안에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커진다.

오퍼랜드 필드에 메모리 주소가 인니 레지스터 이름을 명시할 때 또한 같다.
정보의 가짓수는 해당 레지스터가 저장할 수 있는 공간만큼 커진다.

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


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


즉시 주소 지정 방식

연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
데이터의 크기가 작아지는 단점
연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없어 다른 주소 지정 방식보다 빠르다.


직접 주소 지정 방식

오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
즉시 주소 지정 방식보다 오퍼랜드 필드에서 표현할 수 있는 데이터의 크기는 더 커졌다. 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧앚여 표현할 수 잇는 유효 주소에 제한이 생길 수 있다.


간접 주소 지정 방식

유효 주소의 주소를 오퍼랜드 필드에 명시한다.
직접 주소 지정 방식보다 유효 주소의 범위가 더 넓어졌다.
두 번의 메모리 접근이 필요하기 때문에 즉시 주소 지정방식, 직접 주소 지정 방식보다 느리다.


연산에 사용할 데이터가 레지스터에 저장된 경우, 레지스터 주소 지어 방식 또는 레지스터 간접 주소 지정 방식을 사용


레지스터 주소 지정 방식

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

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

레지스터 주소 지정 방식은 직접 주소 지정보다 빠르게 데이터에 접근할 수 있다.
레지스터 주소는 지정 방식은 직접 주소 지정 방식과 비슷한 레지스터 크기에 제한이 생길 수 있다.


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

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

간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 한번으로 줄어든다는 차이점이자 장점이이 있다.
레지스터 간접 주소 지정 방식은 간접 주소 지정 방식보다 빠르다.


정리

주소 지정 방식 = 연산에 사용할 데이터를 찾는 방법
유효 주소 = 연산에 사용할 데이터가 저장된 위치

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

Stack & Queue

stack이란 한쪽 끝이 막혀 있는 통과 같은 저장 공간이다.
: 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식(후입선출)
: LIFO (Lsat In First Out) 자료구조라고 부른다.

  • Push : 스택에 새로운 데이터를 저장하는 명령어
  • PoP : 스택에 저장된 데이터를 꺼내는 명령어

    POP 명령어 수행하면 스택 최상단 (Lsat In)
    마지막 저장한 데이터 (First Out)

queue란 양쪽이 뚫려 있는 통과 같은 저장 공간
: 한쪽으로 데이터를 저장, 다른 한쪽으로 먼저 저장한 순서대로 데이터를 뺀다.
: 가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식(선입선출)
: FIFO (First In First Out) 자료구조라고 부른다.


혼자 공부하는 컴퓨터구조 + 운영체제
03. 데이터 (78p - 100p)

0개의 댓글