본문 바로가기

Computer Structure & Operating System/2025 version

Computer Structure & OS(3) - 소스 코드와 명령어, 명령어의 구조

728x90
반응형

1) 소스 코드와 명령어

    1-1) 고급 언어와 저급 언어

    1-2) 컴파일 언어와 인터프리터 언어

    1-3) 목적 파일 VS 실행 파일

2) 명령어의 구조

    2-1) 연산 코드와 오퍼랜드
    2-2) 주소 지정 방식

    2-3) 스택과 큐(중요!!)

 

 

 

 

 

1) 소스 코드와 명령어

1-1) 고급 언어와 저급 언어

  • 고급 언어(high-level programming language) : 사람이 이해하고 작성하기 쉽게 만들어진 언어
  • 저급 언어(low-level programming language) : 컴퓨터가 직접 이해하고 실행할 수 있는 언어

※ 컴퓨터가 이해하고 실행할 수 있는 언어는 오직 저급 언어뿐이기에 고급 언어로 작성된 소스 코드가 실행되려면 반드시 저급 언어, 즉 명령어로 변환되어야 함!

 

* 저급 언어의 종류

  • 기계어(machine code) : 0과 1로 이루어진 명령어로 구성된 저급 언어
  • 어셈블리어(assembly language) : 0과 1로 이루어진 기계어를 사람이 읽기 편한 형태로 번역한 저급 언어

 

 

1-2) 컴파일 언어와 인터프리터 언어

※ 고급 언어가 저급 언어로 변환되는 방식에는 크게 두 가지, 컴파일 방식인터프리터 방식이 있음

(컴파일 방식으로 작동하는 프로그래밍 언어를 컴파일 언어, 인터프리트 방식으로 작동하는 프로그래밍 언어를 인터프리터 언어라고 함)

  • 컴파일 언어 : 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어
  • 인터프리터 언어 : 인터프리터에 의해 소스 코드가 한 줄씩 저급 언어로 변환되어 실행되는 고급 언어

+) 컴파일(compile) : 컴파일 언어로 작성된 소스 코드의 코드 전체가 저급 언어로 변환되는 과정

+) 컴파일러(compiler) : 컴파일을 수행해주는 도구

+) 목적 코드(object code) : 컴파일러를 통해 저급 언어로 변환된 코드

+) 인터프리터(interpreter) : 소스 코드를 한 줄씩 저급 언어로 변환하여 실행해 주는 도구

 

※ 목적 코드는 컴퓨터가 이해하고 실행할 수 있는 저급 언어인 반면, 인터프리터 언어는 소스 코드 마지막에 이를 때까지 한 줄 한 줄씩 저급 언어로 해석하며 실행해야 하기 때문에 일반적으로 인터프리터 언어는 컴파일 언어보다 느림

 

 

1-3) 목적 파일 VS 실행 파일

  • 목적 파일 : 목적 코드로 이루어진 파일
  • 실행 파일 : 실행 코드로 이루어진 파일(윈도우의 .exe 확장자를 가진 파일이 대표적인 실행 파일임)
  • 링킹 : 목적 코드가 실행 파일이 되기 위해 외부 기능들을 연결짓는 작업

 

 

 

2) 명령어의 구조

2-1) 연산 코드와 오퍼랜드

명령어연산 코드오퍼랜드로 구성되어 있음

  • 연산 코드(operation code) : 명령어가 수행할 연산을 의미하며, 연산자라고도 부름
  • 오퍼랜드(operand) : '연산에 사용할 데이터' 또는 '연산에 사용할 데이터가 저장된 위치'를 의미하며, 피연산자라고도 부름

* 오퍼랜드 필드 : 숫자나 문자 등을 나타내는 데이터 또는 메모리나 레지스터 주소가 올 수 있음(단, 오퍼랜드 필드에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하기보다는 많은 경우 연산에 사용할 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 담김)

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

 

* 연산 코드 기본 유형

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

 


2-2) 주소 지정 방식

* 주소 지정 방식(addressing mode) : 오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법

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

 

* 대표적인 주소 지정 방식

  • 즉시 주소 지정 방식(immediate addressing mode) : 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
  • 직접 주소 지정 방식(direct addressing mode) : 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
  • 간접 주소 지정 방식(indirect addressing mode) : 유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식(두 번의 메모리 접근이 필요하므로 앞서 설명한 주소 지정 방식들보다 일반적으로 느림)
  • 레지스터 주소 지정 방식(register addressing mode) : 직접 주소 지정 방식과 비슷하게 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법(일반적으로 CPU 외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 더 빠르기 때문에 레지스터 주소 지정 방식은 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있음)
  • 레지스터 간접 주소 지정 방식(register indirect addressing mode) : 연산에 사용할 데이터를 메모리에 저장하고, 그 주소(유효 주소)를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법

 

 

2-3) 스택과 큐(중요!!)

  • 스택(stack) : 한쪽 끝이 막혀 있는 통과 같은 저장 공간으로 '나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식(후입선출)'이라는 점에서 LIFO(Last In First Out) 자료구조라고도 부름(스택에 새로운 데이터를 저장하는 명령어는 'PUSH', 스택에 저장된 데이터를 꺼내는 명령어는 'POP')
  • (queue) : 스택과는 달리 양쪽이 뚫려 있는 통과 같은 저장 공간으로 '가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식(선입선출)'이라는 점에서 FIFO(First In First Out) 자료구조라고도 부름