명령어의 컴퓨터 내부 표현
거의 모든 명령어가 레지스터를 사용하기 때문에 레지스터 이름을 숫자로 매핑하는 규칙이 있어야 합니다. MIPS에서는 레지스터 $0에서 $7까지는 레지스터번호 16~23번까지로, $t0에서 $t7까지는 번호 8에서 15번까지 매핑합니다.
MIPS 어셈블리 언어를 기계어로 변환 예)
add $t0, $s1, $s2 다음 어셈블리 명령어의 실제 MIPS언어 버전을 십진수와 이진수 형태로 표현하라.
십진수 표현은 다음과 같습니다.
명령어의 각 부분을 필드(field)라 부릅니다. 처음과 마지막 필드는 더셈에 사용할 첫 번째 레지스터 번호, 세 번째 필드는 두 번째 피연산자 레지스터 번호를 나타냅니다. 네 번째 필드는 계산 결과가 들어갈 레지스터의 번호입니다. 이 명령어에서 다섯 번째 필드는 사용되지 않으므로 0으로 표시했습니다. 종합하면 이 명령어는 레지스터 $s1을 레지스터 $s2에 더해서 그합을 레지스터 #t0에 넣으라는 뜻입니다. 이 명령어의 각 필드 값을 이진수로 표시하면 다음과 같습니다.
위 예제에서 보인 레이아웃을 명령어 형식(instruction format)이라고 합니다. MIPS 명령어의 길이는 데이터 워드와 마찬가지로 32비트입니다. " 간단하기 하기 위해서는 규칙적인 것이 좋다 "라는 설계 원칙에 따라 모든 MIPS명령어는 예외 없이 32비트입니다.
어셈블리 언어와 구별하기 위해 명령어를 숫자로 표혆나 것을 기계어라고 하고, 이런 명령어들의 시퀀스를 기계코드(machine code)라 합니다.
MIPS 명령어의 필드
- 표시하기 쉽게 MIPS명령어의 각 필드에는 다음과 같은 이름이 붙어 있습니다.
op : 명령어가 실행할 연산의 종류로서 연산자(opcode)라고 부릅니다.
rs : 첫 번째 근원지(source) 피연산자 레지스터입니다.
rt : 두 번째 근원지 피연산자 레지스터입니다.
rd : 목적지레지스터이며 연산 결과가 기억됩니다.
shamt : 자리이동(shift)량
funct : 기능(function) op필드에서 연산의 종류를 표시하고 funct필드에서는 그중의 한 연산을 구체적으로 지정합니다. 기능 코드라고 부르기 도 합니다.
이것보다 필드 길이가 더 길어야하는 경우에는 문제가 생길 수 있습니다. 예를들어 lw명령어는 레지스터 필드 2개와 상수 필드 하나가 필요합니다. 만일 위의 5비트 필드 중 하나를 주소로 쓴다면 32보다 작은 값만 사용할 수 있습니다. 이 필드는 큰 배열이나 자료구조에서 한 원소를 선택하는 데 사용됩니다. 따라서 32보다 큰 값이 필요한 경우가 많으므로 5비트 필드로는 부족할 것입니다.
설계원칙 3 : 좋은 설계에는 적당한 절충이 필요하다.
MIPS 설계자들이 택한 절충안은 모든 명령어의 길이를 같게 하되, 명령어 종류에 따라 형식은 다르게 하는 것이였습니다. 예를 들어 위의 명령어 형식은 R타입 또는 R형식이라 하는데, 이것만으로는 불충분하기 때문에 I타입 또는 I형식이라는 두번째 명령어 형식을 만들었습니다. I타입은 수치 연산과 데이터 전송 명령어에서 사용되면 다음과 같습니다.
16비트 주소를 사용하므로 lw명령은 베이스 레지스터 rs에 저장된 주소를 기준으로 +-2**15바이트(+-2**13워드)를 지정할 수 있습니다. 마찬가지로 addi에서 사용할 수 있는 상수는 +-2**15보다 더 클 수 없다. 이 명령어 형식에서는 레지스터를 32개 이상 사용하기 어렵습니다. 32개보다 많으면 rs와 rt필드가 더 커져서 한 워드에 모든 정보를 담을 수 없습니다. 이전 적재명령을 다시한번 살펴봅시다.
lw $t0, 32 ($s3)
여기서 rs필드에는 19($s3의 번호), rt필드에는 8($t0의 번호), 주소 필드에는 32가 들어갑니다. 이 명령어에서는 rt필드의 의미가 바뀌어 적재 결과가 들어갈 목적지 레지스터 번호를 표시하는 것으로 바뀌었습니다.
명령어 형식이 여러가지가 되면 하드웨어가 복잡해지지만 모든 형식을 비슷하게 하면 복잡도를 낮출 수 있습니다. 예를 들어 R타입과 I타입은 앞의 3필드는 동일합니다.
명령어 형식은 첫 번째 필드의 값을 보고 구분할 수 있습니다. 형식별로 op필드가 가질 수 있는 값들이 다르므로, 하드웨어는 op필드를 보고 명령어의 오른쪽 절반을 필드 3개로 볼것인지(R type), 필드 하나로 볼 것인지(I type)결정합니다.
MIPS 어셈블리 언어를 기계어로 번역 예)
$t1에 배열 A의 시작 주소가 기억되어 있고 $s2는 변수 h에 대응된다고 할 때 다음 C code A[300] = h+A[300]은 다음과 같이 컴파일 된다.
lw $t0, 1200($t1)
add $t0, $s2, $t0
sw $t0, 1200($t1) 이 세 명령어에 해당하는 MIPS 기계어를 보여라.
편의를 위해서 기계어 명령어르 우선 십진수로 표현하자. 다음과 같은 기계어 표현을 구할 수 있습니다.
op | rs | rt | rd | address/shamt | funct |
35 | 9 | 8 | 1200 | ||
0 | 18 | 8 | 8 | 0 | 32 |
43 | 9 | 8 | 1200 |
lw 명령어의 op 필드값은 35이고, rs필드에는 베이스 레지스터 번호9($t1)가, rt필드에는 목적지 레지스터 번호8($t0)이 지정되어 있습니다. A[300]을 선택하기 위해 offset 1200은 마지막 필드인 address필드에 있습니다. 이를 이진수로 바꾸면 다음과 같습니다.
op | rs | rt | rd | address/shamt | funct |
100011 | 01001 | 01000 | 0000 0100 1011 000 | ||
000000 | 10010 | 01000 | 01000 | 00000 | 100000 |
101011 | 01001 | 01000 | 000 0100 1011 000 |
★ 요점정리
오늘날의 컴퓨터는 두가지 중요한 원리에 바탕을 두고 있습니다.
- 명령어는 숫자로 표현된다.
- 프로그램은 메모리에 기억되어 있어서 데이터처럼 읽고 쓸 수 있습니다.
이것이 내장 프로그램의 개념이고 이 개념을 발명한 덕에 컴퓨터가 눈부시게 발전할 수 있었습니다. 밑 그림은 내장 프로그램의 장점을 보여 줍니다. 메모리에는 편집기가 편집 중인 소스코드, 컴파일된 기계어 프로그램, 실행 프로그램이 상요하는 텍스트 데이터, 심지어는 기계어를 생성하는 컴파일러까지도 기억 될 수 있습니다.
명령어를 숫자처럼 취급하게 된 결과, 프로그램이 이진수 파일 형태로 판매되게 되었습니다. 이것이 상업적으로 기존 명령어 집합과 호환성이 있는 컴퓨터는 다른 컴퓨터의 기성품 소프트웨어를 물려받을 수 있다는 의미를 갖습니다. 이러한 이진 호환성 문제 대문에 상업적으로 살아남는 명령어 집합구조는 극히 소수로 집약됩니다.
'Computer Architecture > 컴퓨터 구조' 카테고리의 다른 글
[11] CH2 명령어:컴퓨터 언어 < MIPS 버전 4 > (0) | 2022.01.19 |
---|---|
[10] CH2 명령어:컴퓨터 언어 < MIPS 버전 3 > (0) | 2022.01.19 |
[8] CH2 명령어:컴퓨터 언어 < MIPS 버전 > (0) | 2022.01.16 |
[9] CH2 명령어:컴퓨터 언어 < Arm 버전 > (0) | 2022.01.13 |
[7] CH1 컴퓨터 추상화 및 관련 기술 < 결론 > (0) | 2022.01.12 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!