거의 모든 명령어가 레지스터를 사용하기 때문에 레지스터 이름을 숫자로 매핑하는 규칙이 있어야 하는데 MIPS에서는 레지스터 $s0에서 $s7까지는 레지스터 번호 16~23번, $t0에서 $t7까지는 8~15번으로 매핑한다.
예제: MIPS 어셈블리 언어를 기계어로 변환
다음 어셈블리 명령어의 실제 MIPS 언어 버전을 십진수와 이진수 형태로 표현하라.
add $t0, $s1, $s2
십진수 표현은 다음과 같다.
명령어의 각 부분을 필드(field)라 부른다.
처음과 마지막 필드(0과 32)가 컴퓨터에게 덧셈을 하라고 지시하는 부분이다.
두 번째 필드는 덧셈에 사용할 첫 번째 피연산자 레지스터의 번호(17 = $s1),
세 번째 필드는 두 번째 피연산자 레지스터 번호(18 = $s2),
네 번째 필드는 계산 결과가 들어갈 레지스터의 번호(8 = $t0)다.
이 명령어에서 다섯 번째 필드는 사용되지 않으므로 0으로 표시했다.
이 명령어는 레지스터 $s1을 레지스터 $s2에 더해서 그 합을 레지스터 $t0에 넣으라는 뜻이다.
이 명령어의 각 필드 값을 이진수로 표시하면 다음과 같이 된다.
어셈블리 언어와 구별하기 위하여 명령어를 숫자로 표현한 것을 기계어라고 하고, 이런 명령어들의 Sequence를 기계 코드(machine code)라 한다.
MIPS 명령어 필드
표시하기 쉽게 MIPS 명령어의 각 필드에는 다음과 같은 이름이 붙어 있다.
- op: 명령어가 실행할 연산의 종류로 연산자(opcode)라고 부른다.
- rs: 첫 번째 source 피연산자(operand) 레지스터
- rt: 두 번째 source 피연산자 레지스터.
- rd: 목적지 레지스터, 연산 결과가 기억된다.
- shamt: shift amount
- funct: function code.
op 필드에서 연산의 종류를 표시하고 funct 필드에서 그중의 한 연산을 구체적으로 지정한다.
기능 코드(function code)라고 부르기도 한다.
이것보다 필드 길이가 더 길어야 하는 경우에 문제가 생길 수 있다. 만약 위의 5비트 필드 중 하나를 주소로 쓴다면 5bit만큼인 32보다 작은 값만을 사용할 수 있다. 이 필드는 큰 배열이나 자료구조에서 한 원소를 선택하는 데 사용된다. 따라서 32보다 큰 값이 필요한 경우가 많으므로 5비트 필드로는 부족하다.
MIPS 설계자들이 택한 절충안은 모든 명령어의 길이를 같게 하되, 명령어 종류에 따라 형식은 다르게 하는 것이다. 예를 들어 명령어 형식은 R type 또는 R format이라 하는데 이것으로 부족하기 때문에 I type (I format)이라는 두 번째 명령어 형식을 만들었다. I type은 수치 연산과 데이터 전송 명령어에서 사용되며 그 모양은 다음과 같다.
- rt: destination or source register number
- Constant: -2^15 to 2^15 -1
- Address: offset added to base address in rs
명령어 형식은 첫 번째 필드의 값을 보고 구분할 수 있다. 형식별로 op 필드가 가질 수 있는 값들이 다르므로, 하드웨어는 op 필드를 보고 명령어의 오른쪽 절반을 필드 3개로 볼 것인지(R타입), 필드 하나로 볼것인지(I타입) 결정한다.
정리
오늘날의 컴퓨터는 두 가지 중요한 원리에 바탕을 두고 있다.
- 명령어는 숫자로 표현된다.
- 프로그램은 메모리에 기억되어 있어서 데이터처럼 읽고 쓸 수 있다.
이것이 내장 프로그램의 개념이다. 메모리에는 편집기가 편집 중인 소스 코드, 컴파일된 기계어 프로그램, 실행 프로그램이 사용하는 텍스트 데이터, 심지어는 기계어를 생성하는 컴파일러까지도 기억될 수도 있다.
명령어를 숫자처럼 취급하게 된 결과, 프로그램이 이진수 파일 형태로 판매되게 되었다. 이것이 상업적으로는 기존 명령어 집합과 호환성이 있는 컴퓨터는 다른 컴퓨터의 기성품 소프트웨어를 물려받을 수 있다는 의미를 갖는다. 이러한 "이진 호환성(binary compatibility)"문제 때문에 상업적으로 살아남는 명령어 집합 구조는 극히 소수로 집약된다.
프로그램과 데이터를 메모리에 적재하고 컴퓨터한테 어떤 위치에서 실행을 시작할지만 알려 주면 이런 전환이 일어난다. 명령어를 데이터와 똑같이 취급함으로써 컴퓨터 시스템의 메모리 하드웨어와 소프트웨어가 모두 간단해진다. 특히 데이터 저장을 위해 개발된 메모리 기술이 프로그램 저장에도 그대로 사용되며, 컴파일러 같은 프로그램이 인간에게 편리한 형태로 작성된 코드를 컴퓨터가 이해할 수 있는 코드로 바꿀 수 있는 것도 이 특성 덕분이다.