혼자공부하는 컴퓨터구조 + 운영체제제책으로 공부한 내용을 정리한 글입니다.
명령어는 어떻게 생겼는가?
컴퓨터에서 사용되는 명령어는 사실 일종의 문장입니다.
- 마치 사람이 쓰는 문장에서 동사(연산)와 목적어(데이터 또는 위치)가 있는 것처럼,
- 컴퓨터의 명령어도 두 가지로 구성됩니다:
연산 코드 (Opcode) | 무엇을 하라는 건지 지정하는 부분 | 더해라, 곱해라, 저장해라, 점프로 이동해라 등 |
오퍼랜드 (Operand) | 그 연산에 필요한 대상(데이터 또는 주소) | 5를 더해라, A번 메모리 값을 빼라 등 |
예를 들어:
ADD A, B
는 "A와 B를 더해라"라는 뜻이고,
- 여기서 ADD는 연산 코드
- A, B는 오퍼랜드입니다.
오퍼랜드는 어떤 형식으로 주어질까?
오퍼랜드(피연산자)는 그냥 숫자일 수도 있고, 메모리 주소일 수도 있고, 레지스터 이름일 수도 있습니다.
이걸 컴퓨터에서는 “주소 지정 방식(Addressing Mode)”이라고 부릅니다. 즉, 데이터가 어디에 있는지를 어떻게 알려줄까? 라는 이야기입니다.
주소 지정 방식 정리
종류 | 설명 | 예시 | 특징 |
즉시(Immediate) | 연산에 사용할 값을 직접 명령어 안에 씀 | ADD A, #5 → A에 5를 더해라 | 가장 빠름. 값이 작아야 함 |
직접(Direct) | 메모리 주소를 명령어 안에 직접 씀 | ADD A, (100) → 주소 100번에 있는 값을 A에 더해라 | 표현 가능한 주소 제한 있음 |
간접(Indirect) | 명령어 안에는 주소의 주소가 있음 | ADD A, ((200)) → 200번 주소에 있는 값을 주소로 삼아, 거기 있는 값을 더해라 | 2단계 접근. 느리지만 유연함 |
레지스터(Register) | 오퍼랜드가 레지스터 이름 | ADD A, R1 → R1에 있는 값을 A에 더해라 | 매우 빠름 (CPU 내부 접근) |
레지스터 간접(Register Indirect) | 레지스터 안에 있는 주소를 통해 메모리 접근 | ADD A, (R2) → R2가 가리키는 메모리 주소의 값을 더해라 | 적당히 빠르며 유연성 좋음 |
📌 유효 주소란?
위 주소 방식에서 "연산에 실제로 사용될 데이터의 위치"를 유효 주소라고 부릅니다.
명령어 구조의 비트 제한
컴퓨터 명령어는 예를 들어 16비트짜리로 정해져 있다고 하면:
- 연산 코드가 4비트라면
- 나머지 12비트 안에 오퍼랜드를 표현해야 합니다
즉, 명령어 크기(N비트) - 연산 코드 크기(M비트) = 오퍼랜드 필드 크기입니다.
그래서 오퍼랜드 필드에 직접 데이터를 넣는 즉시 주소 방식은 크기 제한이 있습니다.
대신 주소를 넣거나, 간접 주소를 쓰거나, 레지스터 이름을 넣는 방법으로 공간을 아껴서 유연하게 사용합니다.
명령어의 네 가지 유형
명령어는 기능에 따라 크게 네 가지로 나눌 수 있습니다:
명령어 유형 | 예 | 설명 |
데이터 전송 | LOAD, STORE, MOV | 데이터를 메모리 ↔ 레지스터 사이로 이동 |
산술/논리 연산 | ADD, SUB, AND, OR, NOT | 덧셈, 뺄셈, 논리 연산 수행 |
제어 흐름 변경 | JUMP, CALL, RET | 특정 조건에 따라 실행 순서 변경 |
입출력 제어 | IN, OUT | 외부 장치와의 통신 제어 |
스택(Stack)과 큐(Queue)란?
스택과 큐는 컴퓨터에서 데이터를 저장하고 꺼내는 방식(자료구조)입니다.
둘 다 여러 데이터를 순서 있게 저장하지만, 꺼내는 순서 규칙이 다릅니다.
스택(Stack): 나중에 넣은 게 먼저 나온다
스택은 후입선출 (LIFO: Last In, First Out) 구조입니다.
- 책 더미를 쌓는 걸 생각하면 쉽습니다. 위에 쌓은 책부터 꺼내게 됩니다.
📌 기능:
- PUSH: 스택 위에 데이터를 넣는 것
- POP: 스택 위에 있는 데이터를 꺼내는 것
예시:
PUSH 10
PUSH 20
PUSH 30
POP → 30 꺼냄
POP → 20 꺼냄
👉 나중에 넣은 30이 먼저 나옵니다
큐(Queue): 먼저 넣은 게 먼저 나온다
큐는 선입선출 (FIFO: First In, First Out) 구조입니다.
- 줄 서는 것과 같습니다. 먼저 들어온 사람이 먼저 나갑니다.
📌 기능:
- ENQUEUE: 큐의 뒤에 데이터 추가
- DEQUEUE: 큐의 앞에서 데이터 꺼내기
예시:
ENQUEUE 10
ENQUEUE 20
ENQUEUE 30
DEQUEUE → 10 꺼냄
DEQUEUE → 20 꺼냄
👉 먼저 넣은 10이 먼저 나옵니다
스택은 왜 중요할까요?
스택은 컴퓨터 내부에서 굉장히 중요한 역할을 합니다. 예를 들어:
- 함수 호출 시 반환 주소 저장
- 지역 변수 저장
- 인터럽트 발생 시 현재 상태 보관
📌 예를 들어 어떤 함수를 호출할 때:
- 지금 하고 있던 작업의 위치를 PUSH
- 함수 끝나면 다시 돌아오기 위해 POP
이렇게 스택이 없으면 함수가 어디서부터 돌아와야 하는지도 모르게 됩니다.
스택 관련 명령어: PUSH / POP
- PUSH 값: 값을 스택에 넣어라
- POP: 스택에서 가장 최근 값 하나를 꺼내라
예시 (레지스터와 함께):
PUSH R1 → R1에 있던 값 저장
POP R2 → 꺼낸 값을 R2에 저장
즉, PUSH는 "잠깐 기억해둬"
POP은 "기억했던 거 꺼내와" 같은 느낌입니다.
'컴퓨터 구조' 카테고리의 다른 글
레지스터 (0) | 2025.06.17 |
---|---|
ALU와 제어장치 (0) | 2025.06.17 |
소스 코드와 명령어 (0) | 2025.06.16 |
0과 1을 문자로 표현하는 방법 (0) | 2025.06.16 |
0과1로 숫자를 표현하는 방법 (0) | 2025.06.16 |