CPU는 메모리에서 데이터를 꺼내 레지스터라는 가까운 곳에 두고 작업합니다. 이 시리즈의 8비트 ISA에는 R0, R1, R2, R3 네 개의 레지스터가 있습니다. 그런데 데이터를 옮기기만 해서는 의미가 없습니다. 레지스터의 값으로 계산은 어떻게 할까요?
시리즈 초반에 논리 게이트를 조합하여 가산기를 만들었습니다. 이 가산기가 포함된 장치가 ALU(Arithmetic Logic Unit)입니다. ALU는 덧셈, 뺄셈 같은 산술 연산을 담당합니다.
ALU를 사용하는 연산 명령어는 네 가지입니다:
ADD Rd, Rs: Rd와 Rs를 더해 Rd에 저장SUB Rd, Rs: Rd에서 Rs를 빼서 Rd에 저장ADDI Rd, Imm: Rd에 즉시값을 더하기SUBI Rd, Imm: Rd에서 즉시값을 빼기여기서 Rd는 destination, 즉 결과가 저장되는 레지스터이고, Rs는 source, 즉 값을 가져오는 레지스터입니다. ADDI와 SUBI는 레지스터 대신 즉시값, 즉 명령어 자체에 포함된 숫자를 사용하는 버전입니다.
Zero Flag는 직전 연산 결과가 0인지를 기록하는 1비트 표시등입니다. 왜 필요할까요? 두 값이 같은가요?라는 질문에 답할 수 있기 때문입니다. 두 레지스터의 값을 빼서 결과가 0이면 두 값은 같습니다. 이 표시등은 프로그램의 흐름을 바꾸는 제어 흐름 명령어에서 결정적인 역할을 합니다.
덧셈, 뺄셈 같은 계산은 ALU가 맡고, 그 결과가 0인지는 Zero Flag에 남습니다. 그런데 데이터를 옮기고 계산하는 명령어만으로는 프로그램이 위에서 아래로 한 줄씩 실행될 뿐입니다. 다음 글에서는 Zero Flag를 활용해 프로그램의 흐름을 바꾸는 명령어를 알아보고, 전체 명령어 집합을 정리해봅시다.