icon

안동민 개발노트

4장 : 컴퓨터구조

컴퓨터 기본구조, 시스템 버스, 명령어

컴퓨터구조 학습 절입니다.

3장 4절까지는 자료구조를 배웠습니다.

배열, 스택, 큐, 연결리스트, 트리, 그래프, 탐색, 정렬, 해싱

이제 다시 컴퓨터 내부로 들어갑니다.

4장 1절부터는 컴퓨터구조 + 운영체제 블록입니다.

이번 절의 핵심은 다음과 같습니다.

컴퓨터는 CPU, 기억장치, 입출력장치로 구성됩니다.
CPU와 장치들은 시스템 버스로 연결됩니다.
명령어는 연산자와 피연산자로 구성됩니다.
CPU는 명령어를 가져와서 해석하고 실행합니다.

이번 절 내용은 컴퓨터구조 출제범위의 컴퓨터 기본구조, 폰노이만 모델, 시스템 버스, 명령어 구성, 명령어 형식, 주소 지정 방식, 명령어 종류와 직접 연결됩니다.


이번 절의 큰 그림

이번 절에서 배울 순서는 다음과 같습니다.

컴퓨터의 기본 구성요소
→ 폰노이만 구조
→ 저장 프로그램 개념
→ 시스템 버스
→ 데이터버스, 주소버스, 제어버스
→ 명령어의 구성
→ 명령어 형식
→ 0주소, 1주소, 2주소, 3주소 명령어
→ 주소 지정 방식
→ 명령어 종류

4장 1절은 앞으로 배울 CPU, 메모리, 운영체제의 기초입니다.

이번 절 내용을 잘 잡아야 4장 2절의 CPU와 명령어 사이클, 5장 1~2절의 운영체제도 덜 어렵습니다.


컴퓨터 기본 구성

컴퓨터는 무엇으로 구성되는가?

컴퓨터는 크게 네 부분으로 볼 수 있습니다.

입력장치
출력장치
기억장치
중앙처리장치, CPU

조금 더 자세히 보면 다음과 같습니다.

구성요소역할
입력장치데이터를 컴퓨터에 넣음키보드, 마우스, 스캐너
출력장치처리 결과를 밖으로 보여줌모니터, 프린터, 스피커
기억장치데이터와 프로그램 저장RAM, ROM, SSD, HDD
CPU명령어를 해석하고 실행제어장치, ALU, 레지스터

컴퓨터구조 범위에서도 컴퓨터 기본구조의 구성요소, 폰노이만 모델, 시스템 버스를 다룹니다.


입력, 처리, 저장, 출력

컴퓨터의 동작을 가장 쉽게 표현하면 다음과 같습니다.

입력 → 처리 → 저장 → 출력

예를 들어 계산기 프로그램에서 3 + 5를 입력한다고 가정하겠습니다.

단계실제 일
입력키보드로 3, +, 5 입력
저장입력값이 메모리에 저장
처리CPU가 덧셈 수행
출력모니터에 8 출력

즉 컴퓨터는 단순히 계산만 하는 기계가 아닙니다.

데이터를 입력받고,
기억장치에 저장하고,
CPU가 처리하고,
결과를 출력합니다.

CPU란?

CPU는 Central Processing Unit, 즉 중앙처리장치입니다.

CPU의 역할은 한 문장으로 말하면 다음과 같습니다.

CPU는 명령어를 가져오고, 해석하고, 실행하는 장치입니다.

CPU 안에는 대표적으로 다음 구성요소가 있습니다.

구성요소역할
제어장치, CU명령어 해석, 장치 제어
산술논리장치, ALU산술 연산과 논리 연산 수행
레지스터CPU 내부의 빠른 임시 저장소
내부버스CPU 내부 데이터 이동 통로

컴퓨터구조 출제범위의 중앙처리장치 구성요소에도 산술논리장치, 레지스터, 제어장치, 내부버스가 포함됩니다.

이번 절에서는 CPU 내부를 깊게 파지는 않습니다. CPU 내부 구조와 명령어 사이클은 4장 2절에서 자세히 합니다.

이번 절에서는 이렇게만 정리합니다.

CPU = 명령어 실행 담당

기억장치란?

기억장치는 데이터와 프로그램을 저장하는 장치입니다.

대표적으로
레지스터
캐시
주기억장치, RAM
보조기억장치, SSD/HDD

가 있습니다.

CPU에 가까운 순서로 보면
레지스터 → 캐시 → 주기억장치 → 보조기억장치

시험에서는 보통 다음 순서를 많이 묻습니다.

캐시 기억장치 → 주 기억장치 → 보조 기억장치

컴퓨터구조 예시문제에도 기억장치 계층구조를 CPU에 가까운 쪽부터 나열하는 문제가 있고, 정답 흐름은 캐시 기억장치 → 주 기억장치 → 보조 기억장치입니다.


기억장치의 핵심 특징

기억장치는 CPU에 가까울수록 빠르지만 비싸고 용량이 작습니다.

CPU에서 멀어질수록 느리지만 싸고 용량이 큽니다.

기억장치속도용량가격
레지스터매우 빠름매우 작음매우 비쌈
캐시빠름작음비쌈
RAM중간중간중간
SSD/HDD느림저렴
짧게 외우면
빠를수록 작고 비쌉니다.
느릴수록 크고 쌉니다.

폰노이만 구조

구조 개요

현대 컴퓨터의 기본 구조는 폰노이만 구조를 바탕으로 합니다.

폰노이만 구조의 핵심은 이것입니다.

프로그램과 데이터를 같은 기억장치에 저장하고, CPU가 기억장치에서 명령어를 하나씩 가져와 실행합니다.

이것을 저장 프로그램 방식이라고도 합니다.

프로그램도 메모리에 저장
데이터도 메모리에 저장
CPU가 메모리에서 명령어를 가져와 실행

컴퓨터구조 범위에도 컴퓨터 기본구조 안에 폰노이만 모델이 포함되어 있습니다.


저장 프로그램 방식

예전에는 컴퓨터가 어떤 일을 하려면 배선을 바꾸거나 장치를 직접 조정해야 했습니다.

폰노이만 구조에서는 프로그램 자체를 메모리에 저장합니다.

예를 들어 메모리에 이런 명령어들이 저장되어 있다고 가정하겠습니다.

100번지: LOAD A
101번지: ADD B
102번지: STORE C

CPU는 메모리에서 명령어를 하나씩 가져옵니다.

100번지 명령어 가져오기
→ 실행
101번지 명령어 가져오기
→ 실행
102번지 명령어 가져오기
→ 실행

이 흐름이 컴퓨터 실행의 기본입니다.


폰노이만 구조의 기본 흐름

폰노이만 구조에서 CPU는 보통 이런 식으로 동작합니다.

1. 메모리에서 명령어를 가져옵니다.
2. 명령어를 해석합니다.
3. 필요한 데이터를 가져옵니다.
4. 연산을 수행합니다.
5. 결과를 저장합니다.
6. 다음 명령어로 이동합니다.
예를 들어
c = a + b;

라는 코드가 있다고 가정하겠습니다.

컴퓨터 내부에서는 대략 이렇게 됩니다.

a 값을 메모리에서 가져옵니다.
b 값을 메모리에서 가져옵니다.
CPU의 ALU가 더합니다.
결과를 c에 저장합니다.

즉 우리가 쓰는 C 코드도 결국 CPU 명령어들의 묶음으로 실행됩니다.


시스템 버스

시스템 버스란?

CPU, 기억장치, 입출력장치는 서로 데이터를 주고받아야 합니다.

이때 필요한 통로가 버스입니다.

버스는 컴퓨터 내부 장치들 사이에서 데이터, 주소, 제어신호가 이동하는 공통 통로입니다.

컴퓨터 안의 길이라고 보면 됩니다.

CPU ↔ 기억장치
CPU ↔ 입출력장치
기억장치 ↔ 입출력장치

이런 통신이 버스를 통해 이루어집니다.

컴퓨터구조 범위에는 컴퓨터 기본구조와 입출력장치 영역에 모두 시스템 버스, 데이터버스, 주소버스, 제어버스가 포함되어 있습니다.


시스템 버스의 세 종류

시스템 버스는 보통 세 가지로 나눕니다.

데이터버스
주소버스
제어버스
버스역할
데이터버스실제 데이터가 이동하는 통로
주소버스어느 위치에 접근할지 주소를 전달
제어버스읽기, 쓰기, 인터럽트 같은 제어신호 전달

이 세 개는 반드시 정리해 둡니다.

시스템 버스 = 데이터버스 + 주소버스 + 제어버스

컴퓨터구조 예시문제에서도 시스템 버스를 구성하는 것으로 보기 어려운 것을 묻고, 주소버스·데이터버스·제어버스는 시스템 버스의 기본 구성요소지만 로컬버스는 기본 3요소가 아니므로 정답이 로컬버스입니다.


데이터버스

데이터버스는 실제 데이터가 이동하는 길입니다.

예를 들어 CPU가 메모리에서 숫자 10을 가져온다고 가정하겠습니다.

메모리의 값 10 → 데이터버스 → CPU

또 CPU가 계산 결과 30을 메모리에 저장한다고 가정하겠습니다.

CPU의 값 30 → 데이터버스 → 메모리

즉 데이터버스는 실제 값이 오가는 통로입니다.

데이터버스 = 실제 데이터 이동

데이터버스의 폭이 넓으면 한 번에 더 많은 데이터를 보낼 수 있습니다.

예를 들어
32비트 데이터버스 = 한 번에 32비트 전송
64비트 데이터버스 = 한 번에 64비트 전송

주소버스

주소버스는 접근할 위치의 주소를 전달하는 길입니다.

CPU가 메모리에서 데이터를 읽으려면 먼저 어디에서 읽을지 알려줘야 합니다.

CPU: 메모리 1000번지의 값을 읽고 싶습니다.

이때 1000번지라는 주소가 주소버스를 통해 전달됩니다.

CPU → 주소버스 → 메모리

주소버스의 폭은 접근 가능한 메모리 크기와 관련됩니다.

예를 들어 주소버스가 4비트라면 표현 가능한 주소는
2⁴ = 16개

즉 16개의 주소를 구분할 수 있습니다.

주소버스가 32비트라면
2³²개 주소

를 표현할 수 있습니다.

핵심
주소버스 = 어디로 갈지 알려주는 길

제어버스

제어버스는 제어신호가 이동하는 길입니다.

주소와 데이터만으로는 충분하지 않습니다.

CPU가 메모리에 접근할 때는 이런 정보도 필요합니다.

읽을 것인가?
쓸 것인가?
입출력장치가 준비되었는가?
인터럽트가 발생했는가?

이런 신호가 제어버스를 통해 이동합니다.

대표 제어신호는 다음과 같습니다.

제어신호의미
Read읽기
Write쓰기
Interrupt인터럽트 요청
Clock동작 타이밍
Reset초기화
핵심
제어버스 = 어떻게 동작할지 지시하는 신호 통로

버스 예시: 메모리 읽기

CPU가 메모리 1000번지의 데이터를 읽는다고 가정하겠습니다.

필요한 과정은 다음과 같습니다.

1. CPU가 주소버스에 1000번지를 보냅니다.
2. CPU가 제어버스에 Read 신호를 보냅니다.
3. 메모리가 1000번지의 데이터를 찾습니다.
4. 메모리가 데이터버스를 통해 값을 CPU로 보냅니다.

정리하면 다음과 같습니다.

버스하는 일
주소버스1000번지 전달
제어버스읽기 명령 전달
데이터버스실제 데이터 전달

이 예시는 시험에도 자주 연결됩니다.

주소 = 주소버스
읽기/쓰기 = 제어버스
실제 값 = 데이터버스

버스 예시: 메모리 쓰기

이번에는 CPU가 메모리 2000번지에 값 50을 저장한다고 가정하겠습니다.

1. CPU가 주소버스에 2000번지를 보냅니다.
2. CPU가 데이터버스에 값 50을 보냅니다.
3. CPU가 제어버스에 Write 신호를 보냅니다.
4. 메모리가 2000번지에 50을 저장합니다.

정리하면 다음과 같습니다.

버스내용
주소버스2000번지
데이터버스값 50
제어버스Write 신호

시스템 버스 시험 포인트

시스템 버스에서 꼭 외울 것은 이것입니다.

데이터버스 = 데이터
주소버스 = 주소
제어버스 = 제어신호

그리고 시험에 이렇게 나올 수 있습니다.

다음 중 시스템 버스를 구성하는 것으로 보기 어려운 것은?

보기
주소버스
데이터버스
로컬버스
제어버스
정답
로컬버스

기본 시스템 버스 3요소는 주소, 데이터, 제어버스입니다.


명령어 기본

명령어란?

이제 명령어로 넘어갑니다.

명령어는 CPU에게 어떤 일을 하라고 지시하는 코드입니다.

예를 들어 사람에게는 이렇게 말할 수 있습니다.

A 값을 가져와라.
B를 더해라.
결과를 저장해라.

CPU 명령어로는 이런 식이 됩니다.

LOAD A
ADD B
STORE C

명령어는 컴퓨터가 실제로 실행하는 기본 단위입니다.


명령어의 구성

명령어는 크게 두 부분으로 구성됩니다.

연산자 + 피연산자
구성
연산자, opcode무슨 일을 할지LOAD, ADD, STORE
피연산자, operand대상 데이터나 주소A, B, C, 1000번지
ADD B
여기서
ADD = 연산자
B = 피연산자
B 값을 더하라.

컴퓨터구조 출제범위에서도 컴퓨터 명령어의 구성으로 연산자와 피연산자가 포함됩니다.


명령어 예시

몇 가지 대표 명령어를 살펴보겠습니다.

명령어
LOAD AA의 값을 CPU로 가져옴
STORE ACPU의 값을 A에 저장
ADD AA의 값을 더함
SUB AA의 값을 뺌
MUL AA의 값을 곱함
DIV AA의 값으로 나눔
JUMP L1L1 위치로 이동
AND AA와 논리 AND 연산
OR AA와 논리 OR 연산

이런 명령어들이 모여서 프로그램이 됩니다.


누산기, AC

컴퓨터구조 예시문제에서 AC라는 말이 나옵니다.

AC는 Accumulator, 즉 누산기입니다.

쉽게 말하면 CPU 안에서 계산 결과를 임시로 담는 레지스터입니다.

예를 들어
LOAD A
ADD B

라고 하면 보통 이렇게 해석합니다.

AC ← M[A]
AC ← AC + M[B]

여기서는 다음과 같습니다.

표현
AC누산기
M[A]메모리 A번지 또는 A라는 위치의 값
왼쪽에 오른쪽 값을 저장
AC ← M[A]

메모리 A의 값을 AC에 넣어라.

라는 뜻입니다.


예시 프로그램 해석

컴퓨터구조 예시문제에 이런 명령어들이 나옵니다.

LOAD  A
ADD   B
MUL   C
STORE T
LOAD  D
MUL   E
ADD   T

하나씩 해석해 보겠습니다.

초기에는 변수 A, B, C, D, E가 메모리에 있다고 가정하겠습니다.

1단계

LOAD A
AC ← M[A]

즉 AC에 A 값을 넣습니다.

AC = A

2단계

ADD B
AC ← AC + M[B]
현재 AC는 A이므로
AC = A + B

3단계

MUL C
AC ← AC * M[C]
현재 AC는 A+B이므로
AC = (A + B) * C

4단계

STORE T
M[T] ← AC

즉 T에 현재 AC 값을 저장합니다.

T = (A + B) * C

5단계

LOAD D

AC에 D를 넣습니다.

AC = D

6단계

MUL E

E를 곱합니다.

AC = D * E

7단계

ADD T

T를 더합니다.

AC = D * E + T
그런데 T는 아까
T = (A + B) * C

였습니다.

따라서 전체 결과는
D * E + (A + B) * C
보통 보기 좋게 쓰면
(A + B) * C + D * E
정답
(A+B)*C+D*E

명령어 해석 문제 푸는 법

명령어 해석 문제는 이렇게 풀이할 수 있습니다.

1. AC 값을 계속 추적합니다.
2. STORE가 나오면 임시 변수에 저장합니다.
3. LOAD가 나오면 AC가 새 값으로 바뀝니다.
4. ADD, MUL, SUB는 현재 AC를 기준으로 계산합니다.
예를 들어
LOAD A
ADD B
AC = A + B

입니다.

하지만
LOAD A
STORE T
LOAD B
ADD T
T = A
AC = B + T = B + A

입니다.

LOAD를 만나면 이전 AC 값이 덮어써질 수 있다는 점을 조심해야 합니다.


명령어 형식

명령어 형식이란?

명령어 형식은 명령어가 어떤 구조로 되어 있는지를 말합니다.

명령어에는 보통 이런 정보가 들어갑니다.

연산 코드
주소 또는 피연산자 정보
주소 지정 방식 정보
간단히 표현하면
[ opcode | operand ]
[ ADD | A ]
여기서
opcode = ADD
operand = A

입니다.

컴퓨터구조 출제범위에는 명령어 형식으로 0주소, 1주소, 2주소, 3주소 명령어가 포함됩니다.


주소 수에 따른 명령어 형식

명령어는 피연산자 주소가 몇 개 들어가느냐에 따라 나눌 수 있습니다.

0주소 명령어
1주소 명령어
2주소 명령어
3주소 명령어

여기서 “주소”는 피연산자의 위치를 가리킨다고 이해하면 됩니다.

예를 들어
ADD A, B, C

라면 A, B, C라는 주소 또는 피연산자가 3개 있습니다.


3주소 명령어

3주소 명령어는 피연산자 주소가 3개 있는 명령어입니다.

형식
연산자 목적지, 피연산자1, 피연산자2
ADD C, A, B
C ← A + B

즉 A와 B를 더해서 C에 저장합니다.

장점
명령어 하나로 의미를 분명하게 표현할 수 있습니다.
단점
주소가 3개 들어가므로 명령어 길이가 길어집니다.
ADD T, A, B
MUL X, T, C
MUL Y, D, E
ADD Z, X, Y

이런 식으로 씁니다.


2주소 명령어

2주소 명령어는 주소가 2개 있습니다.

형식
연산자 A, B
보통 뜻은
A ← A 연산 B
ADD A, B
A ← A + B

즉 A가 입력이면서 동시에 결과 저장 장소입니다.

장점
3주소보다 명령어가 짧습니다.
단점
피연산자 중 하나가 덮어써집니다.
ADD A, B
MUL A, C

이렇게 하면 A가 계속 결과 저장 장소로 쓰입니다.


1주소 명령어

1주소 명령어는 주소가 1개 있습니다.

누산기 AC를 사용하는 구조에서 많이 설명됩니다.

LOAD A
ADD B
STORE C

여기서 명시된 주소는 하나씩입니다.

하지만 실제 계산에는 AC가 묵시적으로 사용됩니다.

ADD B
AC ← AC + M[B]

즉 명령어에는 B 하나만 쓰였지만, AC가 자동으로 포함된 것처럼 동작합니다.

1주소 명령어의 핵심
AC 같은 누산기를 묵시적으로 사용합니다.

컴퓨터구조 예시문제의 LOAD A, ADD B, MUL C, STORE T 형태가 이런 방식으로 이해하기 좋습니다.


0주소 명령어

0주소 명령어는 주소가 명시적으로 없는 명령어입니다.

보통 스택 구조에서 설명됩니다.

PUSH A
PUSH B
ADD
POP C

여기서 ADD 자체에는 주소가 없습니다.

왜냐하면 연산 대상이 스택의 맨 위 값들이기 때문입니다.

PUSH A
PUSH B
ADD
동작
A를 스택에 넣음
B를 스택에 넣음
ADD가 스택에서 B와 A를 꺼내 더함
결과를 다시 스택에 넣음

0주소 명령어는 스택을 이용하므로 주소를 명시하지 않아도 됩니다.

0주소 명령어 = 스택 기반 명령어

주소 수별 명령어 비교

구분특징장점단점
3주소주소 3개ADD C,A,B의미 명확명령어 깁니다
2주소주소 2개ADD A,B비교적 짧음한 피연산자 덮어씀
1주소주소 1개ADD AAC 사용AC 추적 필요
0주소주소 없음ADD스택 사용, 짧음스택 연산 필요
짧게 외우면
3주소 = 결과, 입력1, 입력2
2주소 = 왼쪽에 결과 저장
1주소 = AC 사용
0주소 = 스택 사용

주소 지정 방식

주소 지정 방식이란?

주소 지정 방식은 명령어의 피연산자를 어떻게 찾을지 정하는 방식입니다.

예를 들어
ADD 100

이라고 할 때 100이 무엇을 의미할까요?

가능한 해석이 여러 가지입니다.

100이라는 값 자체를 더하라는 뜻일 수도 있습니다.
100번지에 있는 값을 더하라는 뜻일 수도 있습니다.
100번지에 들어 있는 주소를 따라가라는 뜻일 수도 있습니다.
레지스터 번호일 수도 있습니다.

그래서 필요한 것이 주소 지정 방식입니다.

컴퓨터구조 출제범위에는 주소 지정 방식으로 직접, 간접, 즉치, 묵시적, 레지스터, 레지스터 간접, 변위 주소지정방식이 포함됩니다.


즉치 주소지정방식

즉치 주소지정방식은 명령어 안에 실제 값이 들어 있는 방식입니다.

ADD #5
AC ← AC + 5

여기서 5는 주소가 아니라 실제 값입니다.

핵심
즉치 = 값 자체가 명령어 안에 들어 있음
비유하면
“5를 더해라”

라고 바로 숫자를 알려주는 것입니다.

장점
메모리에 가서 값을 가져올 필요가 없어 빠릅니다.
단점
명령어 안에 들어갈 수 있는 값의 크기에 제한이 있습니다.

직접 주소지정방식

직접 주소지정방식은 명령어에 실제 데이터가 있는 메모리 주소가 들어 있는 방식입니다.

ADD 1000
AC ← AC + M[1000]

즉 1000번지에 저장된 값을 가져와 더합니다.

핵심
직접 = 명령어에 데이터가 있는 주소가 직접 들어 있음
비유하면
“1000번 사물함에 있는 값을 가져와라”

입니다.


간접 주소지정방식

간접 주소지정방식은 명령어에 들어 있는 주소가 실제 데이터의 주소를 가리키는 방식입니다.

ADD @1000
AC ← AC + M[M[1000]]

이 부분은 다소 어렵습니다.

천천히 살펴보겠습니다.

1000번지에 실제 데이터가 있는 것이 아닙니다.
1000번지에는 다른 주소가 들어 있습니다.
그 주소를 따라가면 실제 데이터가 있습니다.
M[1000] = 5000
M[5000] = 20
그러면
ADD @1000

은 결국 20을 더합니다.

AC ← AC + M[5000]
핵심
간접 = 주소를 한 번 더 따라감
비유하면
1000번 사물함을 열었더니 “5000번 사물함을 보세요”라는 쪽지가 있음.
5000번 사물함에 실제 값이 있음.

묵시적 주소지정방식

묵시적 주소지정방식은 피연산자가 명령어에 직접 쓰이지 않아도 정해져 있는 방식입니다.

ADD B

에서 AC가 자동으로 사용되는 경우가 있습니다.

또 스택 기반 명령어에서
ADD

라고만 써도 스택의 맨 위 두 값을 꺼내 더한다고 약속되어 있으면, 피연산자가 묵시적으로 정해져 있는 것입니다.

핵심
묵시적 = 명령어에 안 써 있어도 약속으로 정해져 있음
AC 사용
스택 top 사용

레지스터 주소지정방식

레지스터 주소지정방식은 피연산자가 메모리가 아니라 레지스터에 있는 방식입니다.

ADD R1
AC ← AC + R1
또는 구조에 따라
R0 ← R0 + R1

같이 해석될 수 있습니다.

핵심
레지스터 주소지정 = 피연산자가 레지스터에 있음
장점
메모리보다 레지스터가 훨씬 빠릅니다.
단점
레지스터 개수는 제한되어 있습니다.

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

레지스터 간접 주소지정방식은 레지스터에 실제 데이터가 있는 것이 아니라, 데이터가 있는 메모리 주소가 들어 있는 방식입니다.

ADD (R1)
AC ← AC + M[R1]
예를 들어
R1 = 1000
M[1000] = 50
이면
ADD (R1)

은 50을 더합니다.

핵심
레지스터 간접 = 레지스터 안의 주소를 따라가 메모리 값을 사용

변위 주소지정방식

변위 주소지정방식은 기준 주소에 변위 값을 더해서 실제 주소를 구하는 방식입니다.

형태
실제 주소 = 기준 레지스터 값 + 변위
R1 = 1000
변위 = 20
실제 주소
1000 + 20 = 1020
그러면 데이터는
M[1020]

에서 가져옵니다.

변위 주소지정방식은 배열 접근, 상대 주소, 베이스 레지스터 방식 등과 연결됩니다.

핵심
변위 = 기준 주소 + 떨어진 거리

주소 지정 방식 비교표

방식의미
즉치값 자체가 명령어에 있음ADD #5
직접명령어에 데이터 주소가 있음ADD 1000
간접명령어 주소에 또 다른 주소가 있음ADD @1000
묵시적피연산자가 약속으로 정해짐ADD, AC 사용
레지스터값이 레지스터에 있음ADD R1
레지스터 간접레지스터가 메모리 주소를 가짐ADD (R1)
변위기준 주소 + 변위ADD 20(R1)
짧게 외우면
즉치 = 값
직접 = 주소
간접 = 주소의 주소
레지스터 = 레지스터 값
레지스터 간접 = 레지스터 안의 주소
변위 = 기준 + 거리
묵시적 = 안 써도 정해짐

주소 지정 방식 예제

다음 상황을 살펴보겠습니다.

AC = 10
M[1000] = 20
M[2000] = 1000
R1 = 1000

즉치

ADD #1000

1000은 값 자체입니다.

AC = 10 + 1000 = 1010

직접

ADD 1000

1000번지의 값을 더합니다.

AC = 10 + M[1000]
AC = 10 + 20 = 30

간접

ADD @2000

2000번지에는 1000이 들어 있습니다.

M[2000] = 1000
M[1000] = 20
따라서
AC = 10 + 20 = 30

레지스터

ADD R1

R1 자체의 값을 더합니다.

AC = 10 + 1000 = 1010

레지스터 간접

ADD (R1)

R1에 들어 있는 1000을 주소로 봅니다.

M[1000] = 20
AC = 10 + 20 = 30

이런 비교 문제가 시험에 잘 나옵니다.


명령어 종류와 실행 흐름

명령어 종류

명령어는 기능에 따라 나눌 수 있습니다.

컴퓨터구조 범위에는 명령어 종류로 데이터 전달 명령어, 산술 연산 명령어, 논리 연산 명령어, 분기 명령어, 기타 명령어가 포함되어 있습니다.

대표 종류는 다음과 같습니다.

종류역할
데이터 전달 명령어데이터 이동LOAD, STORE, MOVE
산술 연산 명령어계산ADD, SUB, MUL, DIV
논리 연산 명령어논리 처리AND, OR, NOT, XOR
분기 명령어실행 흐름 변경JUMP, BRANCH
입출력 명령어장치와 데이터 교환IN, OUT
기타 명령어제어, 상태 변경NOP, HALT

데이터 전달 명령어

데이터 전달 명령어는 데이터를 한 곳에서 다른 곳으로 옮깁니다.

LOAD A
STORE B
MOVE R1, R2
명령어의미
LOAD A메모리 A의 값을 레지스터나 AC로 가져옴
STORE A레지스터나 AC 값을 메모리 A에 저장
MOVE R1, R2R2 값을 R1으로 이동
주의할 점
데이터 전달 명령어는 보통 값을 복사하거나 이동합니다.

산술 연산 명령어

산술 연산 명령어는 계산을 수행합니다.

ADD
SUB
MUL
DIV
INC
DEC
명령어의미
ADD더하기
SUB빼기
MUL곱하기
DIV나누기
INC1 증가
DEC1 감소
ADD B
는 보통
AC ← AC + M[B]

로 해석할 수 있습니다.


논리 연산 명령어

논리 연산 명령어는 비트 단위 논리 연산을 수행합니다.

AND
OR
NOT
XOR

1장 3절에서 배운 논리게이트와 연결됩니다.

1010 AND 1100 = 1000

논리 연산은 마스크 처리, 특정 비트 검사, 비트 변경 등에 사용됩니다.


분기 명령어

분기 명령어는 프로그램의 실행 흐름을 바꿉니다.

보통 프로그램은 명령어를 순서대로 실행합니다.

100번지
101번지
102번지
103번지

하지만 조건에 따라 다른 곳으로 이동해야 할 때가 있습니다.

if (score >= 60) {
    printf("pass");
} else {
    printf("fail");
}

이런 C 코드도 내부적으로는 조건 분기 명령어로 실행됩니다.

대표 분기 명령어는 다음과 같습니다.

명령어의미
JUMP무조건 이동
BEQ같으면 이동
BNE같지 않으면 이동
BGT크면 이동
BLT작으면 이동
CALL서브루틴 호출
RET서브루틴 복귀
핵심
분기 명령어 = 다음 실행 위치를 바꾸는 명령어

명령어와 C언어 연결

우리가 C에서 배운 코드들은 내부적으로 명령어로 바뀝니다.

대입문

a = b;
내부적으로는
LOAD B
STORE A

처럼 볼 수 있습니다.

덧셈

c = a + b;
내부적으로는
LOAD A
ADD B
STORE C

처럼 볼 수 있습니다.

조건문

if (a > b) {
    c = a;
}

내부적으로는 비교와 분기 명령어가 사용됩니다.

COMPARE A, B
BRANCH_IF_NOT_GREATER end
STORE C
end:

즉 C언어는 사람이 읽기 쉬운 표현이고, 컴퓨터 내부에서는 명령어 단위로 실행됩니다.


컴퓨터 실행 흐름 전체 연결

지금까지 배운 내용을 한 번에 연결해 보겠습니다.

C 코드 작성
→ 컴파일
→ 기계어 명령어로 변환
→ 명령어가 메모리에 저장
→ CPU가 명령어를 가져옴
→ CPU가 명령어를 해석
→ 필요한 데이터 주소를 버스로 전달
→ 메모리에서 데이터 가져옴
→ ALU가 계산
→ 결과를 저장

즉 컴퓨터 실행은 다음의 반복입니다.

명령어 가져오기
명령어 해석하기
명령어 실행하기

이 세부 과정은 4장 2절의 명령어 사이클에서 본격적으로 다룹니다.


자주 혼동되는 출제 포인트

혼동 포인트 1. 시스템 버스 3요소

데이터버스
주소버스
제어버스

로컬버스는 기본 시스템 버스 3요소가 아닙니다.


혼동 포인트 2. 데이터버스와 주소버스 구분

데이터버스 = 실제 값 이동
주소버스 = 위치 정보 이동

값과 위치를 헷갈리면 안 됩니다.


혼동 포인트 3. 제어버스는 읽기/쓰기 신호

Read, Write, Interrupt 같은 제어신호

가 제어버스를 통해 전달됩니다.


혼동 포인트 4. 명령어는 연산자와 피연산자로 구성됩니다

ADD B
에서
ADD = 연산자
B = 피연산자

혼동 포인트 5. 1주소 명령어는 AC를 잘 추적해야 합니다

LOAD A
ADD B
MUL C

이런 문제는 AC 값이 어떻게 바뀌는지 따라가야 합니다.


혼동 포인트 6. 0주소 명령어는 스택 기반입니다

ADD

처럼 주소가 없어도 스택의 맨 위 값들을 사용합니다.


혼동 포인트 7. 즉치와 직접 주소지정방식 차이

ADD #5 = 값 5를 더함
ADD 5 = 5번지의 값을 더함

#이 있으면 보통 즉치값으로 해석합니다.


혼동 포인트 8. 직접과 간접 주소지정방식 차이

직접 = 해당 주소의 값을 바로 사용
간접 = 해당 주소에 들어 있는 주소를 한 번 더 따라감

혼동 포인트 9. 레지스터와 레지스터 간접 차이

ADD R1 = R1의 값을 더함
ADD (R1) = R1이 가리키는 메모리의 값을 더함

혼동 포인트 10. LOAD를 만나면 AC가 새 값으로 바뀝니다

LOAD D

가 나오면 이전 AC 값은 덮어써집니다.

그래서 중간 결과가 필요하면 STORE T처럼 저장해야 합니다.


이번 절의 핵심 정리

컴퓨터 기본 구성

CPU
기억장치
입력장치
출력장치

폰노이만 구조

프로그램과 데이터를 같은 기억장치에 저장하고,
CPU가 명령어를 순서대로 가져와 실행하는 구조

시스템 버스

데이터버스 = 실제 데이터
주소버스 = 위치 주소
제어버스 = 읽기/쓰기 등 제어신호

명령어 구성

명령어 = 연산자 + 피연산자

명령어 주소 수

3주소 = 결과, 입력1, 입력2
2주소 = 왼쪽에 결과 저장
1주소 = AC 사용
0주소 = 스택 사용

주소 지정 방식

즉치 = 값 자체
직접 = 주소
간접 = 주소의 주소
묵시적 = 안 써도 정해짐
레지스터 = 레지스터 값
레지스터 간접 = 레지스터가 가진 주소
변위 = 기준 주소 + 거리

명령어 종류

데이터 전달
산술 연산
논리 연산
분기
입출력
기타

핵심 한 문장

이번 절의 핵심을 한 문장으로 정리하면 다음과 같습니다.

컴퓨터는 CPU, 기억장치, 입출력장치가 시스템 버스로 연결된 구조이고, CPU는 메모리에 저장된 명령어를 가져와 연산자와 피연산자를 해석한 뒤 주소 지정 방식에 따라 데이터를 찾아 실행합니다.
더 짧게
컴퓨터 = CPU + 메모리 + 입출력장치
버스 = 데이터·주소·제어 신호의 길
명령어 = 연산자 + 피연산자
주소 지정 방식 = 피연산자를 찾는 방법

확인 문제

문제 1

컴퓨터의 기본 구성요소로 보기 어려운 것은?

① CPU ② 기억장치 ③ 입출력장치 ④ 후위표기식


문제 2

폰노이만 구조의 핵심으로 알맞은 것은?

① 프로그램과 데이터를 모두 기억장치에 저장하고 CPU가 명령어를 가져와 실행합니다 ② 모든 명령어는 반드시 종이에 기록합니다 ③ CPU 없이 입출력장치만으로 계산합니다 ④ 데이터는 저장하지 않고 항상 즉시 버립니다


문제 3

시스템 버스의 기본 구성요소가 아닌 것은?

① 데이터버스 ② 주소버스 ③ 제어버스 ④ 로컬버스


문제 4

실제 데이터가 이동하는 통로는?

① 주소버스 ② 데이터버스 ③ 제어버스 ④ 인터럽트버스


문제 5

메모리의 어느 위치에 접근할지 알려주는 통로는?

① 주소버스 ② 데이터버스 ③ 제어버스 ④ 로컬버스


문제 6

읽기, 쓰기, 인터럽트 같은 신호가 이동하는 통로는?

① 데이터버스 ② 주소버스 ③ 제어버스 ④ 누산기


문제 7

명령어의 구성으로 알맞은 것은?

① 연산자와 피연산자 ② 루트와 리프 ③ front와 rear ④ head와 tail


문제 8

ADD B에서 ADD는 무엇인가?

① 피연산자 ② 연산자 ③ 주소버스 ④ 기억장치


문제 9

ADD B에서 B는 무엇인가?

① 연산자 ② 피연산자 ③ 제어장치 ④ 프로그램 카운터


문제 10

누산기 AC를 묵시적으로 사용하는 명령어 형식은?

① 0주소 명령어 ② 1주소 명령어 ③ 2주소 명령어 ④ 3주소 명령어


문제 11

스택을 기반으로 하며 명령어에 주소가 명시되지 않는 방식은?

① 0주소 명령어 ② 1주소 명령어 ③ 2주소 명령어 ④ 3주소 명령어


문제 12

ADD #5처럼 명령어 안에 실제 값이 들어 있는 주소 지정 방식은?

① 직접 주소지정방식 ② 간접 주소지정방식 ③ 즉치 주소지정방식 ④ 레지스터 간접주소지정방식


문제 13

명령어에 적힌 주소가 실제 데이터가 있는 메모리 주소인 방식은?

① 직접 주소지정방식 ② 간접 주소지정방식 ③ 묵시적 주소지정방식 ④ 변위 주소지정방식


문제 14

명령어에 적힌 주소를 따라갔더니 또 다른 주소가 있고, 그 주소를 다시 따라가 데이터를 찾는 방식은?

① 직접 주소지정방식 ② 간접 주소지정방식 ③ 즉치 주소지정방식 ④ 레지스터 주소지정방식


문제 15

다음 명령어들의 결과 수식으로 알맞은 것은?

LOAD A
ADD B
MUL C
STORE T
LOAD D
MUL E
ADD T

A+B+C+D+E(A+B)*C+D*EA*B+C*D+E(A*B)+(C*D)+E


정답과 해설은 절별 확인문제 정답해설에서 확인합니다.

다음 4장 2절은 CPU, 레지스터, 명령어 사이클, 기억장치입니다. 4장 1절이 “컴퓨터가 어떤 구조로 연결되어 있고 명령어가 어떻게 생겼는가”였다면, 4장 2절은 “CPU가 그 명령어를 실제로 어떤 순서로 실행하는가”를 배웁니다.

목차

이번 절의 큰 그림
컴퓨터 기본 구성
컴퓨터는 무엇으로 구성되는가?
입력, 처리, 저장, 출력
CPU란?
기억장치란?
기억장치의 핵심 특징
폰노이만 구조
구조 개요
저장 프로그램 방식
폰노이만 구조의 기본 흐름
시스템 버스
시스템 버스란?
시스템 버스의 세 종류
데이터버스
주소버스
제어버스
버스 예시: 메모리 읽기
버스 예시: 메모리 쓰기
시스템 버스 시험 포인트
명령어 기본
명령어란?
명령어의 구성
명령어 예시
누산기, AC
예시 프로그램 해석
1단계
2단계
3단계
4단계
5단계
6단계
7단계
명령어 해석 문제 푸는 법
명령어 형식
명령어 형식이란?
주소 수에 따른 명령어 형식
3주소 명령어
2주소 명령어
1주소 명령어
0주소 명령어
주소 수별 명령어 비교
주소 지정 방식
주소 지정 방식이란?
즉치 주소지정방식
직접 주소지정방식
간접 주소지정방식
묵시적 주소지정방식
레지스터 주소지정방식
레지스터 간접 주소지정방식
변위 주소지정방식
주소 지정 방식 비교표
주소 지정 방식 예제
즉치
직접
간접
레지스터
레지스터 간접
명령어 종류와 실행 흐름
명령어 종류
데이터 전달 명령어
산술 연산 명령어
논리 연산 명령어
분기 명령어
명령어와 C언어 연결
대입문
덧셈
조건문
컴퓨터 실행 흐름 전체 연결
자주 혼동되는 출제 포인트
혼동 포인트 1. 시스템 버스 3요소
혼동 포인트 2. 데이터버스와 주소버스 구분
혼동 포인트 3. 제어버스는 읽기/쓰기 신호
혼동 포인트 4. 명령어는 연산자와 피연산자로 구성됩니다
혼동 포인트 5. 1주소 명령어는 AC를 잘 추적해야 합니다
혼동 포인트 6. 0주소 명령어는 스택 기반입니다
혼동 포인트 7. 즉치와 직접 주소지정방식 차이
혼동 포인트 8. 직접과 간접 주소지정방식 차이
혼동 포인트 9. 레지스터와 레지스터 간접 차이
혼동 포인트 10. LOAD를 만나면 AC가 새 값으로 바뀝니다
이번 절의 핵심 정리
컴퓨터 기본 구성
폰노이만 구조
시스템 버스
명령어 구성
명령어 주소 수
주소 지정 방식
명령어 종류
핵심 한 문장
확인 문제
문제 1
문제 2
문제 3
문제 4
문제 5
문제 6
문제 7
문제 8
문제 9
문제 10
문제 11
문제 12
문제 13
문제 14
문제 15