서론
- 컴퓨터 하드웨어에게 일을 시키려면 하드웨어가 알아들을 수 있는 언어로 말을 해야 한다. 컴퓨터 언어에서 단어를 명령어(instruction)라 하고, 그 어휘를 명령어 집합(instruction set)이라고 한다.
- 기계어도 다양한 것처럼 보이지만 실제로는 모두 유사하기 때문에 서로 다른 언어라기보다는 같은 언어의 사투리 정도로 보는 것이 타당하다. 그러므로 일단 한 언어를 배우면 다른 언어들도 쉽게 익숙해질 수 있다.
- 사용할 명령어 집합은 MIPS에서 선택했다.
- 이 장에서 명령어 표현 방식을 배우는데, 표현 방식을 배우면 컴퓨터의 가장 큰 비밀인 내장 프로그램 개념(stored-program concept)을 이해할 수 있다.
하드웨어 연산
- 기본적으로 모든 컴퓨터는 산술 연산을 할 수 있어야 한다. 다음 MIPS 어셈블리 언어는 두 변수 b와 c를 더해서 그 합을 a에 넣으라고 컴퓨터에 지시한다.
add a, b, c
- MIPS 산술 명령어는 반드시 한 종류의 연산만 지시하며 항상 변수 세 개를 갖는 형식을 엄격히 지킨다. 네 변수 b, c, d, e의 합을 a에 넣으려면 다음과 같이 한다.
- 네 변수의 합을 구하려면 명령어가 세 개 필요하다.
add a, b, c # The sum of b and c is placed in a
add a, a, d # The sum of b, c, and d is now in a
add a, a, e # The sum of b, c, d, and e is now in a
- #의 오른쪽은 주석(comment)인데, 컴퓨터는 이것을 무시한다. 고급 프로그래밍 언어와 달리 한 줄에 명령어 하나만 쓸 수 있으며, 줄이 끝나면 주석도 끝난다는 점이 C와 다르다.
- 모든 명령어가 피연산자를 반드시 세 개씩 갖도록 제한하는 것은 하드웨어를 단순하게 하자는 원칙과 부합한다. 이런 관점에서 하드웨어 설계의 3대 원칙 중 첫 번째를 도출 할 수 있다.
설계 원칙 1: 간단하게 하기 위해서는 규칙적인 것이 좋다.
피연산자
- 상위 수준 언어 프로그램과 달리 산술 명령어의 피연산자에는 제약이 있다. 레지스터(register)라고 하는 하드웨어로 직접 구현된 특수 위치 몇 곳에 있는 것만을 사용할 수 있다.
- 레지스터는 하드웨어 설계의 기본 요소인 동시에 프로그래머에게도 보이는 부분이므로 컴퓨터를 구성하는 벽돌과 같다고 할 수 있다.
- MIPS 구조에서 레지스터의 크기는 32비트이다. MIPS에서는 32비트가 한 덩어리로 처리되는 일이 매우 빈번하므로 이것을 워드(word)라고 부른다.
- 프로그래밍 언어에서 사용하는 변수와 하드웨어 레지스터의 큰 차이점 하나는 레지스터는 개수가 한정되어 있다는 점이다. 현대 컴퓨터에서는 MIPS에서처럼 보통 32개의 레지스터가 있다.
- 그러므로 기호 형태로 표현된 MIPS 언어를 단계적으로 구체화할 때 산술 명령어의 각 피연산자는 32개의 32비트 레지스터 중 하나이어야 한다는 제약이 추가된다.
- 레지스터 개수를 32개로 제한하는 이유는 하드웨어 기술의 바탕이 되는 세 가지 설계 원칙 중 두 번째 원칙에서 찾을 수 있다.
설계 원칙 2: 작은 것이 더 빠르다.
- 레지스터가 아주 많아지면 전기 신호가 더 멀리까지 전달되어야 하므로 클럭 사이클 시간이 길어진다.
- 물론 ‘작은 것이 더 빠르다’가 절대적인 것은 아니다. 예컨대 레지스터를 31개로 한다고 해서 32개보다 빨라지지는 않는다. 이 같은 사실은 컴퓨터 설계자로 하여금 이 문제를 진지하게 고려하도록 만든다.
- 컴퓨터 설계자는 더 많은 레지스터를 원하는 프로그램의 갈망과 클럭 사이클을 빠르게 하고 싶은 본인의 바람 사이에서 적절한 타협점을 찾아야 할 것이다.
- 레지스터를 32개 이상 사용하지 않는 또 다른 이유는 비트 수와 관련 있다. 이는 2.5절에서 살펴보겠다.