Instruction은 소프트웨어가 하드웨어에게 무엇을 할지 알려주는 최소 단위의 명령이다. 강제라기보다는 “이렇게 해달라”는 약속에 가깝다. 이러한 명령들의 집합을 Instruction Set Architecture(ISA) 라고 하며, 하드웨어와 소프트웨어가 공통으로 지켜야 하는 규칙이다.
Instruction은 매우 제한적이며, 레퍼토리가 정해져 있다. 하드웨어는 instruction 개수가 적을수록 구현이 쉬워지고, 소프트웨어는 instruction이 많을수록 표현할 수 있는 기능이 늘어난다. 즉, ISA는 하드웨어와 소프트웨어 사이의 공학적 타협의 결과이다.
고급 언어의 statement는 하나의 문장 안에 여러 연산이 포함될 수 있다. 예를 들어 a = b + c + d; 는 하나의 문장이지만, 하드웨어 수준에서는 여러 개의 instruction으로 나뉘어 처리된다.
Instruction은 statement에 비해 매우 단순하며, 어떤 데이터를 가지고 어떤 연산을 할지만 명확히 나타낸다. 복잡한 문장을 instruction 하나로 만들 수는 있지만, 하드웨어 구현 측면에서는 득보다 실이 크기 때문에 사용하지 않는다.
프로세서는 연산만 담당하고, 실제 데이터는 레지스터나 메모리에 저장된다. 레지스터는 프로세서 내부에 있어 접근 속도가 매우 빠르다.
register int i; 와 같은 선언은 변수를 레지스터에 두고 사용하겠다는 의미지만, 실제로는 컴파일러가 자동으로 레지스터 할당을 잘 수행한다.
레지스터는 많을수록 좋지만, 너무 커지면 접근 시간이 길어져 클럭 사이클이 늘어나 실행 속도가 느려질 수 있다. 32개의 레지스터가 있을 경우 이를 구분하는 데 5비트만 필요하다.
메모리는 바이트 단위로 주소가 매겨진다. 한 워드는 4바이트이므로, 연속된 정수 데이터는 주소가 4씩 증가한다. 즉 주소는 0 → 4 → 8 → 12 와 같이 증가한다.
정수 배열에서 인덱스를 사용할 때도 기준 주소에서 (인덱스 × 4바이트) 만큼 떨어진 위치를 가리키게 된다.
연산은 반드시 레지스터에서만 수행된다. 메모리에 있는 값을 바로 연산할 수 없으며, 반드시 load 또는 store 명령어를 사용해야 한다.
이 구조를 load/store architecture라고 한다.
Instruction에는 즉시값(immediate)이 포함될 수 있다. 즉시값의 비트 수가 32비트보다 작을 경우, 나머지 비트는 채워야 한다.
이 과정을 통해 연산 결과의 의미가 유지된다.
분기 명령어는 조건에 따라 프로그램 흐름을 변경한다. 이때 주로 상대 주소를 사용하며, 현재 위치에서 얼마나 떨어져 있는지를 기준으로 이동한다.
분기 오프셋은 워드 단위이기 때문에 항상 4의 배수여야 하며, 하위 비트는 0이 된다.