CS지식

[혼공학습단 10기 - 컴퓨터 구조 + 운영체제] 1주차 / Chapter 03. 명령어

Damgome 2023. 7. 9. 19:45

Chapter 03. 명령어

03-1. 소스 코드와 명령어

프로그래밍 언어는 고급 언어, 저급 언어로 나뉨

  • 고급 언어 : 대부분의 프로그래밍 언어(C, C++, Java, Python 등)
  • 저급 언어 : 컴퓨터가 직접 이해하고 실행 가능한 언어
    • 기계어(machine code) : 0/1의 명령어 비트로 이루어진 언어, only for 컴퓨터
    • 어셈블리어(assembly language) : 기계어를 사람이 읽기 편한 형태로 번역한 언어, but 여전히 사람이 읽고 쓰기 편하지는 않다! ⇒ 임베디드/게임/정보보안 분야 개발자가 많이 이용

고급 언어가 저급 언어로 변환되는 방식

  1. 컴파일 방식 → 컴파일 방식으로 작동되는 프로그래밍 언어 : 컴파일 언어
  2. 인터프리트 방식 → 인터프리트 방식으로 작동되는 프로그래밍 언어 : 인터프리터 언어

1. 컴파일 언어

컴파일러에 의해 소스 코드 전체가 저급 언어로 변환, 실행되는 고급 언어 (ex) C언어

  • 변환되는 과정 == 컴파일(compile)
  • 컴파일 해주는 도구 == 컴파일러(compiler)
  • 컴파일러는 소스코드 처음부터 끝까지 컴파일 하고, 그 와중에 오류가 발견되면 컴파일 실패! (소스코드 전체가 실행되지 않음)
  • 컴파일 완료된 저급 언어로 변환된 코드 == 목적 코드(object code)

2. 인터프리터 언어

인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어 (ex) 파이썬

  • 인터프리터(interpreter) == 소스 코드를 한 줄씩 저급 언어로 변환, 실행해 주는 도구
  • 한 줄 단위로 실행 ⇒ N번째 줄에 오류 있어도 N-1번째 줄까지 올바르게 수행됨
  • 컴파일 언어보다 느림

목적 파일과 실행 파일

목적 코드로 이루어진 파일이 목적 파일, 실행 코드로 이루어진 파일이 실행 파일

링킹 : 목적 코드(소스 코드를 컴파일 하여 저급 언어로 변환된 코드) ⇒ 실행 파일


확인문제1.

3,4

확인문제2.

2


03-2. 명령어의 구조

명령어

  • 연산 코드(operation code) : 명령어가 수행할 연산 (연산자)
  • 오퍼랜드(operand) : 연산에 사용할 데이터 or 연산에 사용할 데이터의 위치 (피연산자)

오퍼랜드

  • 숫자, 문자 등을 나타내는 데이터 or 메모리/레지스터 주소
  • 거의 데이터의 저장된 위치, 메모리 주소/레지스터 이름 등이 담김 → 오퍼랜드 필드 == 주소 필드
  • 오퍼랜드 수에 따른 명령어 구분
    • 0-주소 명령어 : 오퍼랜드가 하나도 없는 명령어
    • 1-주소 명령어 : 오퍼랜드 하나인 명령어
    • 2-주소 명령어 : 오퍼랜드 두 개인 명령어
    • 3-주소 명령어 : 오퍼랜드 세 개인 명령어

연산 코드

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

유효 주소(effective address)

연산 코드에 사용할 데이터가 저장된 위치, 연산의 대상이 되는 데이터가 저장된 위치

주소 지정 방식(addressing mode)

연산에 사용할 데이터 위치를 찾는 방법

  1. 즉시 주소 지정 방식
    • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
  2. 직접 주소 지정 방식
    • 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
  3. 간접 주소 지정 방식
    • 유효 주소의 주소를 오퍼랜드 필드에 명시
  4. 레지스터 주소 지정 방식
    • 직접 주소 지정 방식과 비슷하게 연산에 사용될 데이터를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법
  5. 레지스터 간접 주소 지정 방식
    • 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법

스택과 큐

스택 : 한쪽 끝이 막혀 있는 통과 같은 저장 공간

→ 데이터를 차곡차곡 저장하고, 데이터를 빼낼 때는 마지막으로 저장한 데이터부터 뺌(후입선출, LIFO 자료 구조)

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

큐 : 양쪽이 뚫려 있는 통과 같은 저장 공간

→ 한쪽으로는 데이터 저장하고, 다른 한쪽으로 데이터 빼냄. 즉, 가장 먼저 저장된 데이터부터 뺌(선입선출, FIFO 자료 구조)


마무리

확인문제1 / 2

확인문제2 / 6, 200