내장형 프로그램 방식에서는 프로그램도 데이터처럼 메모리에
저장됩니다. 01100011 같은 이진수가 R0에 3을 저장해라라는 명령이 될 수
있습니다. CPU 설계자와 프로그래머 사이의 이런 약속을 명령어 집합(ISA)이라고
합니다.
그런데 약속의 목록은 아직 보지 못했습니다. CPU에게 일을 시키려면 구체적으로 어떤 명령어들이 있을까요? 이 시리즈의 8비트 ISA에는 열 가지 명령어가 있습니다. 이 글에서는 그중 가장 기본인, 데이터를 옮기는 명령어부터 알아봅시다.
요리사가 냉장고에서 재료를 꺼내 바로 조리대 위에서 일하듯이, CPU도 메모리에서 데이터를 꺼내 가까운 곳에 놓고 작업합니다. 이 조리대가 바로 레지스터입니다.
왜 메모리에서 바로 작업하지 않을까요? 메모리는 용량이 크지만 CPU에서 물리적으로 떨어져 있어 접근이 느립니다. 반면 레지스터는 CPU 내부에 있어서 접근이 매우 빠릅니다. 대신 그만큼 비싸기 때문에 개수가 적습니다. 이 시리즈의 ISA에는 R0, R1, R2, R3 네 개의 레지스터가 있습니다.
레지스터와 메모리 사이에서 데이터를 옮기는 명령어는 네 가지입니다:
LOAD Addr: 메모리 주소의 값을 R0에 가져오기STORE Addr: R0의 값을 메모리 주소에 저장LDI Rd, Imm: 숫자를 레지스터에 바로 넣기MOVE Rd, Rs: 레지스터 간 값 복사LOAD와 STORE는 메모리와 R0 사이에서만 값을 주고받습니다. 다른 레지스터에 값을 넣고 싶다면? MOVE로 R0의 값을 옮기거나, LDI(Load Immediate)로 원하는 레지스터에 직접 값을 넣으면 됩니다. 여기서 Immediate(즉시값)란 명령어 자체에 포함된 숫자를 말합니다. 메모리까지 갈 필요 없이 명령어 안에 값이 들어 있어 바로 사용할 수 있습니다.
데이터를 옮길 수 있게 되었습니다. 그런데 옮기기만 해서는 의미가 없습니다. 데이터로 무엇을 할 수 있을까요? 다음 글에서 레지스터의 값으로 계산하는 명령어를 알아봅시다.