yeolyi.com성열의 컴퓨터공학

명령어 집합

CPU 설계자와 프로그래머 사이의 약속, 즉 CPU가 이해하는 명령어의 목록을 명령어 집합(ISA)이라고 합니다. 이 시리즈의 8비트 ISA에는 열 가지 명령어가 있습니다. 레지스터와 메모리 사이에서 데이터를 옮기는 명령어 네 가지, ALU로 계산하는 명령어 네 가지, 그리고 이 글에서 볼 흐름을 제어하는 명령어 두 가지입니다.

제어 흐름

데이터를 옮기고 계산하는 명령어만으로는 프로그램이 위에서 아래로 한 줄씩 실행됩니다. 하지만 현실의 프로그램은 그렇지 않습니다. 조건이 맞으면 이쪽으로(if), 맞을 때까지 반복(while) 같은 흐름 제어가 필요합니다.

이를 위한 명령어가 두 가지 있습니다:

JUMP는 무조건 지정한 주소로 이동합니다. 예를 들어 프로그램의 마지막에 JUMP 0을 넣으면 처음으로 돌아가 같은 코드를 무한히 반복합니다.

하지만 무한 반복만으로는 부족합니다. 특정 조건이 충족되면 반복을 멈춰라를 표현하려면 조건부 점프가 필요합니다. 그것이 바로 JZ(Jump if Zero)입니다. JZ는 Zero Flag가 1일 때, 즉 직전 연산 결과가 0일 때만 점프합니다.

구체적인 예를 들어봅시다. R0에서 1씩 빼면서 0이 되면 멈추는 카운트다운 프로그램을 생각해봅시다:

주소 0: SUBI R0, 1    ← R0에서 1을 뺀다
주소 1: JZ 3          ← 결과가 0이면 주소 3으로 점프
주소 2: JUMP 0        ← 아니면 주소 0으로 돌아가 반복
주소 3: (다음 작업)

R0이 3이었다면 SUBI를 세 번 반복한 뒤 결과가 0이 되어 JZ가 작동하고, 반복이 끝납니다. JUMP가 반복을, JZ가 멈출 조건을 담당하는 것입니다. 이 두 명령어의 조합만으로 반복문과 조건 분기를 모두 표현할 수 있습니다.

모아보기

지금까지 본 명령어를 한눈에 정리한 목록입니다. 각 명령어를 클릭해 구조와 동작을 확인해봅시다.

MOVE Rd, Rs

Rs의 값을 Rd로 복사한다.

00004bit
Rd2bit
Rs2bit
MOVE R1, R200000110

데이터를 옮기는 명령어 4개, 연산 명령어 4개, 흐름을 제어하는 명령어 2개. 총 열 가지뿐입니다. 적어 보이지만 이것만으로도 카운트다운, 두 수의 곱셈, 조건 분기 등 다양한 프로그램을 만들 수 있습니다. 다음 글에서 만들어볼 시뮬레이터에서 직접 확인해봅시다.

마무리

CPU와 대화하는 언어를 배웠습니다. 데이터를 옮기고, 연산하고, 흐름을 제어하는 것. 이 세 종류의 명령어가 CPU가 이해하는 전부입니다.

그런데 명령어를 안다고 해서 CPU가 어떻게 동작하는지까지 아는 것은 아닙니다. 메모리에 줄지어 놓인 이 명령어들을 CPU는 어떻게 하나씩 꺼내서 실행할까요? 다음 글에서 그 과정을 따라가 봅시다.