minhui study
week 6 - MIPS 구조 본문
MIPS 시스템이란
□ 개요
- 1980년대 스탠포드대학에서 John Hennessy와 그이 동료들에 의해 개발되었다.
- Silicon Graphics, Nintendo, Cisco 의 제품에서 사용되고 있다.
□ 디자인 원리
- 규칙적인 것이 간단성을 위해 좋다.
- 많이 발생되는 사항을 빨리 처리한다.
- 적을수록 빠르다.
- 좋은 설계는 좋은 절충안을 요구한다.
#설계 원칙 1
□ 규칙적인 것이 간단성을 위해 좋다.
- 일관성있는 명령어 형태
- 같은 수의 피연산자( 두 개의 source와 한 개의 destination )
- 하드웨어로 구현하기 쉽다.
□ 명령어
- Addition
- Substraction
□ 덧셈 (Addiction)
□ 뺄셈 (Substraction)
#설계 원칙 2
□ 많이 발생되는 사항을 빨리 처리한다.
- MIPS : 단순하고, 많이 사용되는 명령어를 포함한다.
- 명령어를 해석하고 실행하는 하드웨어 : 단순하고 빠르다.
- 복잡한 명령어는 여러개의 단순한 명령어로 수행된다.
□ 컴퓨터 구조 분류
- RISC (Reduced Instruction Set Computer) : MIPS
- CISC (Complex Set Instruction Set Computer) : Intel의 IA-32
□ 복잡한 코드 : 여러 개의 MIPS 명령어에 의해 처리된다
#설계 원칙 3
□ 적을수록 빠르다.
- MIPS : 적은 수의 레지스터를 포함한다.
- 32개의 레지스터 (32비트 또는 64비트)
- 32개의 레지스터로부터 데이터를 획득하는 것이 1000개의 레지스터 또는 메모리로부터 데이터를 획득하는 것보다 빠르다.
※MIPS 레지스터 세트
01. 레지스터를 사용한 명령어
02. 워드(word) 주소 메모리
*word = 4byte
03. 워드(word) 주소 메모리 읽기
□ load 명령어(lw)
□ store 명령어(sw)
04. 바이트(byte) 주소 메모리 읽기
□ load 명령어(lw)
□ store 명령어(sw)
Big-Endian vs. Little-Endian
→ 예제
▷ $t0의 값이 0x23456789라고 가정한다. 아래의 프로그램이 Big-Endian 시스템과 Little-Endian 시스템에서 수행한 후에 $s0의 값은?
#설계 원칙 4
□ 좋은 설계는 좋은 절충안을 요구한다.
- 다중 명령어 형태는 융통성을 제공한다.
(1) add, sub : 3개의 레지스터 피연산자를 사용한다.
(1) lw, sw : 2개의 레지스터 피연산자와 상수를 사용한다.
- 적은 수의 명령어 형태를 유지한다.
1_기계어
□ 개요
- 명령어들의 이진 표현 ( 0 또는 1 )
- 32비트 명령어
□ 명령어 형태
· R-Type
· I-Type
· J-Type
01. R-Type
□ 레지스터 타입
3개의 레지스터 피연산자(오퍼랜드)
→ rs, rt : source 레지스터
- rs는 첫 번째 근원지(source) 피연산자 레지스터
- rt는 두 번째 근원지(source) 피연산자 레지스터
→ rd : destination 레지스터 (목적지 피연산자 레지스터)
다른 필드
→ op : operation 코드 (op코드). 실행할 연산의 종유를 나타낸다.
* 모든 R-Type 명령어의 op코드값 : 0
→ funct : function(기능 코드). 연산자 코드에서 나타난 연산 종류 중 구체적으로 지정한다.
* 6bits로 모든 명령어를 표현할 수 없으므로 funct라는 추가적인 6bit를 사용한다.
→ shamt : shift 명령어에서 사용되는 shift양. 쉬프트 명령에서 사용
02. I-Type
□ 즉시값(Immediate) 타입
3개의 피연산자(오퍼랜드)
→ rs, rt : 레지스터 피연산자
→ imm : 16비트 즉시값(immediate)
다른 필드
→ op : operation 코드 (op코드)
→ 각각의 I-type 명령어는 개별적인 op 코드값을 갖는다.
03. J-Type
□ Jump 타입
1개의 피연산자(오퍼랜드)
→ addr : 주소 피연산자
다른 필드
→ op : operation 코드(op코드)
2_저장된 프로그램 (stored program)
□ 32비트 명령어와 데이터는 메모리에 저장된다.
□ 프로그램 실행
- 프로그램을 메모리에 저장한다.
- 메모리에 있는 명령어들을 순차적으로 읽어서 실행한다.
- 프로그램 카운터(PC)를 이용해서 다음에 수행할 명령어를 파악한다.
Assembly Code | Machine Code |
0x8C0A0020 | |
0x02328020 | |
0x2268FFF4 | |
0x016D4022 |
3_기계어 코드 해석
(1) opcode 분석
(2) opcode가 0이면,
▷ R-type 명령어
▷ func 비트를 통해서 명령어 기능 분석
(3) opcode가 0이 아니면,
▷I-type 또는 J-type 명령어
4_논리(logical) 명령어
□ and, or, xor, nor
- and : 원치 않는 비트를 0으로 만드는 비트 마스킹에 유용하다.
- or : 두 레지스터의 비트를 결합시키는데 유용하다.
- nor : 비트들을 역전시키는데 유용하다.
□ andi, ori, xori
- 16비트 즉시값(immediate)이 and, or, xor의 피연산자로 포함된다.
- 16비트 즉시값은 32비트로 변환될때, 제로 확장(zero-extended)된다.
5_조건부 분기(beq)
# MIPS assembly
: 두 레지스터의 값을 비교하여 값이 같을 경우 분기한다.
$s0와 $s1가 4로 값이 동일하므로 밑에 명령어들을 실행하지 않고 target으로 분기하고 $s1에 4+4=8를 넣는다.
* shift연산
sll // 0001(1) << 0100(4)
6_조건부 분기(bne)
# MIPS assembly
: 동일하지 않을 경우 분기한다.
$s0와 $s1은 동일하므로 분기하지 않고 밑에 명령어들이 실행된다.
7_무조건 분기( j )
# MIPS assembly
: 무조건 분기한다.
8_무조건 분기( jr )
# MIPS assembly
: 목적지 주소로 분기한다.
종류 | 명령어 | 예 | 의미 | 설명 |
조건 분기 | branch on equal | beq $s1, $s2, L | if($s1 == $s2) go to L | 동일한 경우 분기 |
branch on not equal | bne $s1, $s2, L | if($s1 != $s2) go to L | 상이할 경우 분기 | |
set on less | slt $s1, $s2, $s3 | if($s2 < $s3) $s1 = 1; else $s1 = 0 |
작은가를 검사 | |
무조건 분기 | jump | j 2500 | go to 2500 | 목적지 주소로 분기 |
jump register | jr $t1 | go to $t1 | 목적지 주고로 분기 |
9_if문
i와 j가 같으면 다음 실행문을 실행해야 하므로 같지 않으면 L1으로 분기하여야 한다.
10_if/else문
i와 j가 같으면 다음 명령을 실행하고 같지 않으면 L1으로 분기한다. 여기서 중요한 점은 i와 j가 같다면 f=f-i;는 실행이 되면 안된다는 것이다. 그러므로 j done을 통해 i와 j가 같다면 else문을 실행하지 않도록 한다.
11_while 루프
pow가 128이 될때까지 while문이 반복되므로 pow($s0)과 128($t0)이 같다면 done으로 분기한다. 그 전에는 내부 연산을 실행하고 j while 을 통해 while문을 반복한다.
12_for 루프
i가 0부터 1씩 증가하여 10이 되기 전까지 for문을 반복해야 되므로 i가 10이 되면 분기를 하고 그 전까지는 i를 1씩 증가시키며 j for를 통해 for문을 반복한다.
13_Less Than 비교
*set on less than
slt $t1, $s0, $t0 #$t1=1 if $s0 < St0
만약에 i가 101보다 작으면 $t1이 1이 되고 101과 같거나 크면 0이 된다. for문은 i가 101보다 작을 동안 반복되므로 i가 101과 같은 순간이 되면 done으로 분기하고 그 전에는 j loop를 통해 for문을 반복한다.
문제▼
1. 다음 그림은 어떤 명령어 형태를 나타낸 것인가 ( R-type, I-type, J-type 중 하나 )
2. 다음은 논리(logical) 명령어 andi, ori, xori에 대한 설명이다. 빈칸을 채우시오
16비트 즉시값(immediate)이 and, or, xor의 피연산자로 포함되며 16비트 즉시값은 32비트로 변환될때,
( ) 된다.
3. 다음 설명 중 틀린 것을 고르시오
① 기계어 코드에서 opcode가 0이면 R-type 명령어이다.
② 기계어 코드에서 opcode가 0이 아니면 func 비트를 통해서 명령어 기능을 분석할 수 있다.
③ 기계어 코드에서 opcode가 0이 아니면 I-type 또는 J-type 명령어이다.
④ 기계어 코드에서 opcode가 0이면 func 비트를 통해서 명령어 기능을 분석할 수 있다.
4. 다음 중 $s0과 $s1이 같지 않으면 분기하는 것을 고르시오
① beq $s0, $s1, target
② bne $s0, $s1, target
③ beq target, $s0, $s1
④ bne target, $s0, $s1
5~6. 다음 for 루프 중 빈 칸을 채우시오
7. Less Than 비교에 관한 문제입니다. 다음 중 틀린 곳을 고르시오
답안▼
1. R-type
R-type은 레지스터 타입으로 3개의 레지스터 피연산자와 다른 필드들이 있다.
3개의 레지스터 피연산자(오퍼랜드)
→ rs, rt : source 레지스터
- rs는 첫 번째 근원지(source) 피연산자 레지스터
- rt는 두 번째 근원지(source) 피연산자 레지스터
→ rd : destination 레지스터 (목적지 피연산자 레지스터)
다른 필드
→ op : operation 코드 (op코드). 실행할 연산의 종유를 나타낸다.
* 모든 R-Type 명령어의 op코드값 : 0
→ funct : function(기능 코드). 연산자 코드에서 나타난 연산 종류 중 구체적으로 지정한다.
* 6bits로 모든 명령어를 표현할 수 없으므로 funct라는 추가적인 6bit를 사용한다.
→ shamt : shift 명령어에서 사용되는 shift양. 쉬프트 명령에서 사용
2.
16비트 즉시값(immediate)이 and, or, xor의 피연산자로 포함되며 16비트 즉시값은 32비트로 변환될때,
( 제로 확장(zero-extended) ) 된다.
3. ②
→ opcode가 0이면 R-type 명령어이고, func 비트를 통해서 명령어의 기능을 분석할 수 있다.
4. ② bne $s0, $s1, target
종류 | 명령어 | 예 | 의미 | 설명 |
조건 분기 | branch on equal | beq $s1, $s2, L | if($s1 == $s2) go to L | 동일한 경우 분기 |
branch on not equal | bne $s1, $s2, L | if($s1 != $s2) go to L | 상이할 경우 분기 |
beq는 같으면 분기하는 명령어로 같지 않으면 분기하는 명령어는 bne이다.
5~6.
→ i가 50이 되기 전까지 for문을 반복해야 하므로 i와 비교할 $t0에 50을 넣어야 하고(addi $t0, $0, 50), 그리고 i가 1씩이 아닌 2씩 증가하는 for문이므로 addi $s0, $s0, 2이 되어야 한다.
7. ④
→ sll은 shift연산으로 8이 되려면 다음과 같이 3번 shift를 해야한다.
0001(1) << 1000(8)
< 출처 >
강의노트, 디지털논리와 컴퓨터 설계, Harris et al. (조영완 외 번역), 사이텍미디어, 2007, 컴퓨터 구조와 원리 (비주얼 컴퓨터 아키텍처), 신종홍 저, 한빛미디어, 2011
'컴퓨터 구조 > Swing study' 카테고리의 다른 글
week5 - 캐시(Cache) 기억장치 (0) | 2020.06.02 |
---|---|
week4 - 명령어 분류와 형식 (0) | 2020.05.26 |
week3(2) - 메모리 구조와 레지스터 종류 (0) | 2020.05.20 |
week3(1) - 명령어를 효과적으로 실행하기 위한 기법 (0) | 2020.05.19 |
week 2(1) - 컴퓨터 정보의 표현 (0) | 2020.04.13 |