yeolyi.com성열의 컴퓨터공학

ALU

CPU는 메모리에서 데이터를 꺼내 레지스터라는 가까운 곳에 두고 작업합니다. 이 시리즈의 8비트 ISA에는 R0, R1, R2, R3 네 개의 레지스터가 있습니다. 그런데 데이터를 옮기기만 해서는 의미가 없습니다. 레지스터의 값으로 계산은 어떻게 할까요?

연산

시리즈 초반에 논리 게이트를 조합하여 가산기를 만들었습니다. 이 가산기가 포함된 장치가 ALU(Arithmetic Logic Unit)입니다. ALU는 덧셈, 뺄셈 같은 산술 연산을 담당합니다.

ALU를 사용하는 연산 명령어는 네 가지입니다:

여기서 Rd는 destination, 즉 결과가 저장되는 레지스터이고, Rs는 source, 즉 값을 가져오는 레지스터입니다. ADDI와 SUBI는 레지스터 대신 즉시값, 즉 명령어 자체에 포함된 숫자를 사용하는 버전입니다.

레지스터
R05
R13
R20
R30
Rd
Rs
결과-
Z 플래그0
  1. ADD를 선택하고 Rd와 Rs를 골라 실행해봅시다. Rd에 결과가 저장됩니다.
  2. ADDI를 선택하면 Rs 대신 즉시값(0-3)을 직접 지정할 수 있습니다.
  3. 같은 값이 든 두 레지스터를 골라 SUB를 실행해봅시다. 결과가 0이면 Zero Flag(Z)가 1이 됩니다.

Zero Flag

Zero Flag는 직전 연산 결과가 0인지를 기록하는 1비트 표시등입니다. 왜 필요할까요? 두 값이 같은가요?라는 질문에 답할 수 있기 때문입니다. 두 레지스터의 값을 빼서 결과가 0이면 두 값은 같습니다. 이 표시등은 프로그램의 흐름을 바꾸는 제어 흐름 명령어에서 결정적인 역할을 합니다.

마무리

덧셈, 뺄셈 같은 계산은 ALU가 맡고, 그 결과가 0인지는 Zero Flag에 남습니다. 그런데 데이터를 옮기고 계산하는 명령어만으로는 프로그램이 위에서 아래로 한 줄씩 실행될 뿐입니다. 다음 글에서는 Zero Flag를 활용해 프로그램의 흐름을 바꾸는 명령어를 알아보고, 전체 명령어 집합을 정리해봅시다.