CPU가 프로그램을 실행하기 위해 반드시 이해해야 하는 것이 바로 **명령어(Instruction)**이다.
명령어는 단순한 “지시” 이상의 의미를 가지고 있으며, 내부적으로는 여러 요소로 구성된 정교한 구조를 갖는다.
이번 글에서는 명령어의 개념부터 명령어 사이클까지 한 번에 정리해본다.
1. 명령어란 무엇인가?
명령어는 CPU가 수행할 동작(operation)과 그 동작에 사용될 대상(operand) 으로 이루어진 하나의 작업 단위이다.
즉,
- CPU가 무엇을 할지(더해라, 빼라, 저장해라 등)
- 어떤 데이터로 할지 또는 그 데이터가 어디에 있는지
이 두 가지 정보를 담고 있는 것이 바로 명령어다.
1️⃣ 수행할 동작(Operation)
예를 들어,
- 더해라
- 빼라
- 저장해라
와 같은 연산 명령이 CPU에 전달된다.
2️⃣ 수행할 대상(Operand)
수행할 연산에 필요한 데이터 그 자체 또는 데이터가 저장된 메모리 주소를 의미한다.
※ 오퍼랜드의 개수는 1개 이상일 수 있다.
많은 명령어는 보통 1~2개의 오퍼랜드를 가지고 있지만, CPU 설계에 따라 더 많아질 수도 있다.
2. 명령어의 구성: 연산 코드와 오퍼랜드
┌───────────────────── 명령어(Instruction) ────────────────────
│ │
│ ┌────────────┐ ┌────────────────────────────────────┐ │
│ │ 연산 코드 │ │ 오퍼랜드 │ │
│ │ (Opcode) │ │ Operand #1, Operand #2 ... │ │
│ └────────────┘ └────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
하나의 명령어는 크게 두 부분으로 나뉜다.
- 연산 코드(opcode)
CPU가 수행해야 할 동작을 의미한다. - 오퍼랜드(operand)
연산에 필요한 데이터 또는 데이터가 저장된 위치
(피연산자라고도 부른다)
예시로 보면 다음과 같다:
| 연산 코드 | 오퍼랜드 |
| 더해라 | 100과 120 |
| 빼라 | 메모리 32번지의 값, 메모리 33번지의 값 |
| 저장해라 | 10을, 메모리 128번지에 |
3. 오퍼랜드가 메모리 주소를 포함할 때
명령어의 오퍼랜드가 메모리 주소일 경우, CPU는 해당 명령어를 실행하기 위해 추가적인 메모리 접근을 수행해야 한다.
예) 더해라, 100번지 값에, 10을
이 명령은 다음 단계를 거친다.
- CPU가 메모리에서 명령어 자체를 먼저 가져온다. (인출 사이클)
- 명령어를 해석해 보니 “100번지의 값”이 필요하다.
- 따라서 CPU는 다시 한 번 메모리에 접근해 100번지에 저장된 실제 데이터를 읽어온다.
- 읽어온 값과 10을 더하는 연산을 수행한다.
✔ 즉,
명령어 안에 메모리 주소가 포함되면, CPU는 연산 전에 반드시 메모리를 추가로 읽어야 한다.
4. 기계어와 어셈블리어
CPU는 결국 **0과 1로 구성된 기계어(machine code)**만 이해할 수 있다.
하지만 사람이 기계어를 직접 읽고 쓰기는 매우 어렵기 때문에, 이를 사람이 읽기 쉬운 형태로 바꾼 언어가 **어셈블리어(assembly language)**이다.
| 가계어(0/1코드) | 어셈블리어 |
| 0101 0101 | push rdp |
| 0101 1101 | pop rbp |
| 1100 0011 | ret |
CPU에 따라 어셈블리어도 달라진다
같은 기능을 하는 C 코드라도 CPU 구조가 다르면 기계어와 어셈블리어가 완전히 달라진다.
예시: int square(int num) { return num * num; }
- CISC 기반 CPU 어셈블리어 (x86 계열)
명령어가 다소 복잡하고 다양한 기능 포함 - RISC 기반 CPU 어셈블리어 (ARM 계열)
단순한 명령을 여러 개 조합하여 수행
즉,
CPU 아키텍처에 따라 명령어 세트가 다르기 때문에 어셈블리어나 기계어도 달라진다.
5. 간접 사이클 & 인터럽트 사이클
✔ 간접 사이클 (Indirect Cycle)
연산을 수행하기 위해 한 번 더 메모리 접근이 필요한 경우 발생한다.
예를 들어,
명령어 안에 “메모리 100번지의 값”이 포함되어 있다면
- 먼저 명령어를 메모리에서 가져오고
- 명령어 해석 후
- 100번지에 다시 접근해 실제 데이터를 읽어와야 한다
이 상황이 바로 간접 사이클이다.
정리하면
명령어는 CPU가 어떤 작업을 어떻게 수행할지 결정하는 핵심 요소다.
명령어 구조, 어셈블리어, 명령어 사이클을 이해하면 CPU 내부 동작을 훨씬 명확하게 파악할 수 있다.
'컴퓨터 과학' 카테고리의 다른 글
| [컴퓨터 구조] CPU - 인터럽트 (0) | 2025.11.23 |
|---|---|
| [컴퓨터 구조] CPU - 레지스터 (0) | 2025.11.23 |
| [컴퓨터 구조] 컴퓨터가 이해하는 정보 - 데이터 문자 (0) | 2025.11.22 |
| [컴퓨터 구조] 컴퓨터가 이해하는 정보 - 데이터 숫자 (0) | 2025.11.22 |
| 컴퓨터 과학 전체 구조 (0) | 2025.11.22 |