minhui study

week 6 - MIPS 구조 본문

컴퓨터 구조/Swing study

week 6 - MIPS 구조

minhui 2020. 6. 9. 00:52

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments