야금야금

#6 컴퓨터구조 - MIPS구조 본문

SWING/컴퓨터구조

#6 컴퓨터구조 - MIPS구조

hyk0425 2020. 6. 14. 21:09

MIPS 시스템

:밉스 테크놀로지에서 개발한 RISC ISA이다.

1980년대 스탠포드 대학에서 John Hennessy와 그의 동료들에 의해 개발되었으며 Silicon Graphics, Nintendo, Cisco의 제품에서 사용되고 있다.

 

[설계 원칙 1]

· 규칙적인 것이 간단성을 위해 좋음

  - 일관성있는 명령어 형태

  - 같은 수의 피연산자 (두 개의 source와 한 개의 destination)

  - 하드웨어로 구현하기 쉬움

 

명령어

- Addition

High-level code : a = b + c ;

MIPS assembly code : add a, b, c

 

- Subtracton

High-level code : a = b - c ;

MIPS assembly code : sub a, b, c

 


 

[설계 원칙 2]

· 많이 발생되는 사항을 빨리 처리함

   - MIPS : 단순하고 많이 사용되는 명령어를 포함

   - 명령어를 해석하고 실행하는 하드웨어 : 단순하고 빠름

   - 복잡한 명령어는 여러 개의 단순한 명령어로 수행됨

 

· 컴퓨터 구조 분류

   - RISC (Reduced Instruction Set Computer) : MIPS

   - CISC (Complex Set Instruction Set Computer) : Intel의 IA-32

 

· 복잡한 코드 : 여러 개의 MIPS 명령어에 의해 처리됨

High-level code : a = b + c - d ;

MIPS assembly code : add t, b, c

                             ② add a, t, d

 


 

[설계 원칙 3]

· 적을수록 빠름

   - MIPS: 적은 수의 레지스터를 포함

   - 32개의 레지스터 (32비트 또는 64비트)

   - 32개의 레지스터로부터 데이터를 획득하는 것이 1000개의 레지스터 또는 메모리로부터 데이터를 획득하는 것보다 빠름

 

MIPS 레지스터 세트

· 레지스터를 사용한 명령어

High-level code : a = b + c ;

MIPS assembly code : $s0 = a, $s1 = b, $s2 = c   

                              add $s0, $s1, $s2

 

High-level code : a = b + c - d ;

MIPS assembly code : $s0=a , $s1=b, $s2=c, $s3=d

                              sub $t0, $s2, $s3

                              add  $s0, $s1, $t0

 


 

 

1. 워드 주소 메모리

( 1word = 4byte )

1) load 명령어 (lw)

- 명령어 형식 : lw dest offset(base)       

ex) lw $s3, 1($0)       # word 1에서 데이터를 읽어와서 $3 레지스터에 저장

 

2) store 명령어 (sw)

- 명령어 형식 : sw  src, offset(base)  

ex) sw $t4, 0x3($0)    # t4에서 데이터를 읽어와서 word1에 저장

 

 

2. 바이트 주소 메모리

1) load 명령어 (lw)

- 명령어 형식 : lw dest offset(base)       

ex) lw $s3, 4($0)       # 4번지에서 데이터를 읽어와서 $3레지스터에 저장

                            # 4byte = 1 word이므로 메모리 읽기의 lw $s3, 1($0)와 같은 위치를 가리킴

 

2) store 명령어 (sw)

- 명령어 형식 : sw  src, offset(base)  

ex) sw $t7, 12($0)    # t7에서 데이터를 읽어와서 12번지(0000 000C)에 저장

 


 

Big-Endian vs Little-Endian

 

Endian : 컴퓨터 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법

(= 데이터를 어떤 순서로 메모리 위치에 저장할 것인가 )

 

Big-Endian : 최상위 바이트부터 차례로 저장하는 방법

Little-Endian : 최하위 바이트부터 차례로 저장하는 방법

 

ex) $t0의 값이 0x23456789라고 가정할 때, 아래의 프로그램이 Big-Edian시스템과 Little-Edian 시스템에서 수행한 후의 $s0의 값은?

 


 

[설계 원칙 4]

· 좋은 설계는 좋은 절충안을 요구함

   - 다중 명령어 형태는 융통성 제공

      ① add, sub : 3개의 레지스터 피연산자 사용

      ② lw, sw : 2개의 레지스터 피연산자와 상수 사용

 

   - 적은 수의 명령어 형태를 유지함

 

 

기계어

- 명령어들의 이진 표현 (0 또는 1)

- 32비트 명령어

- 명령어 형태

   · R-Type

   · I-Type

   · J-Type

 

 

R-Type

- 레지스터 타입

- 3개의 레지스터 피연산자(오퍼랜드)

   · rs, rt : source레지스터

   · rd : destination레지스터

- 다른 필드

   · op : operation 코드 (모든 R-Type명령어의 op 코드값 : 0)

   · funct : function

   · shamt : shift명령어에서 사용되는 shift의 양

 

 

 

I-Type

 

- 즉시값(Immediate) 타입

- 3개의 피연산자(오퍼랜드)

   · rs, rt : 레지스터 피연산자

   · imm : 16비트 즉시값(immediate)

- 다른 필드

   · op : operation 코드 (op 코드)

   · 각각의 I-type명령어는 개별적인 op 코드값을 가짐

 

 

 

J-Type

- Jump 타입

- 1개의 피연산자(오퍼랜드)

   · addr : 주소 피연산자

- 다른 필드

   · op : operation 코드 (op 코드)

 


 

기계어 코드 해석

: opcode를 분석한다

 

1) opcode가 0이면,

 - R-type명령어

 - func 비트를 통해서 명령어 기능 분석

 

2) opcode가 0이 아니면,

 - I-type 또는 J-type 명령어

 

 


명령어 알아보기

 

논리(logical) 명령어

· and, or, xor, nor

  - and : 원치 않는 비트를 0으로 만드는 비트 마스킹에 유용함

  - or : 두 레지스터의 비트를 결합시키는데 유용함

  - nor : 비트들을 역전시키는데 유용함

 

· andi, ori, xori

  - 16비트 즉시 값(immediate)이 and, or, xor의 피연산자로 포함됨

  - 16비트 즉시 값은 32비트로 변환될 때, 제로 확장(zero-extended)됨

 

 

 

조건부 분기 beq (branch on equal)

: 두 레지스터의 값이 같을 경우 분기한다

 

addi   $s0, $0, 4              # $s0 = 0 + 4 = 4

addi   $s1, $0, 1              # $s1 = 0 + 1 = 1

sll      $s1, $s1, 2             # $s1 = 1 << 2 = 4 

beq    $s0, $s1, target      # $s0 = $s1= 4, 따라서 target으로 분기

addi   $s1, $s1, 1             # 실행되지 않음

sub    $s1, $s1, $s0          # 실행되지 않음

 

target:

add    $s1, $s1, $s0         # $s1 = 4 + 4 = 8

 

 

 

조건부 분기 bne (branch on not equal)

: 두 레지스터의 값이 다를 경우 분기한다

 

addi   $s0, $0, 4              # $s0 = 0 + 4 = 4

addi   $s1, $0, 1              # $s1 = 0 + 1 = 1

sll      $s1, $s1, 2             # $s1 = 1 << 2 = 4

bne    $s0, $s1, target       # $s0 = $s1= 4, 따라서 target으로 분기 X

addi   $s1, $s1, 1             # $s1 = 4 + 1 = 5  (실행됨)

sub    $s1, $s1, $s0          # $s1 = 5 – 4 = 1   (실행됨)

 

target:

add    $s1, $s1, $s0          # $s1 = 1 + 4 = 5

 

 

 

무조건 분기 j

: 무조건 분기한다.

 

addi   $s0, $0, 4              # $s0 = 0 + 4 = 4

addi   $s1, $0, 1              # $s1 = 0 + 1 = 1

j        target                  # target으로 무조건 분기

bne    $s0, $s1, target      # 실행되지 않음

addi   $s1, $s1, 1             # 실행되지 않음

sub    $s1, $s1, $s0          # 실행되지 않음

 

target:

add    $s1, $s1, $s0          # $s1 = 1 + 4 = 5

 

 

 

무조건 분기 jr

: 레지스터가 가진 목적지 주소로 무조건 분기한다

 

0x00002000          addi $s0, $0, 0x2010

0x00002004          jr $s0

0x00002008         addi $s1, $0, 1

0x0000200C         sra $s1, $s1, 2

0x00002010         lw $s3, 44($s1)

 

 

if문

: i != j 일 경우 L1으로 분기하여 add $s0, $s1, $s2 ( f = g + h )가 실행되지 않도록 한다

if / else 문

:  i != j 일 경우 (else의 경우) L1으로 분기하여 sub $s0, $s0, $s3 ( f = f - i )가 실행되도록 한다

i == j 일 경우 (if의 경우) bne를 통해 분기하지 않고 add $s0, $s1, $s2( f = g + h )가 실행되도록 한다.

while 루프

: $s0와 $t0가 다르면 분기하지 않고 아래 명령어를 실행하고 무조건 분기문으로 돌면서 while문을 실행한다

$s0와 $t0가 같으면 done으로 분기하여 반복 루프를 탈출한다.

 

for 루프

: $s0가 10이 될 때까지 분기를 하며 반복문을 실행한다

Less Than비교

: $s0과 $t0을 비교하여 $s0가 더 작다면 $t1의 값을 1로 정한다. 

$t1과 $s0이 같다면 done으로 분기한다.

 

 

 

문제

더보기

Q1. 다음은 어떤 타입의 명령어인가?          

 답 : _____________

Q2. 다음 중 데이터를 최상위 바이트부터 차례로 저장하는 방법은? (Big-Endian / Little-Endian)

 

Q3. 다음 중 명령어 실행 후 $s1값이 다른 것은?

 

Q4. 다음 중 기계어 코드에서 opcode가 0이 아닌 것을 모두 고르시오

R-type

② I-type

J-type

 

Q5. 다음 for 루프에서 반복문 탈출 조건은 무엇인가?

 

 

Q6~Q7. 다음 MIPS assembly 코드를 보고 High-level code를 완성하시오

 

해설

더보기

A1. R-type

 

- 레지스터 타입

- 3개의 레지스터 피연산자(오퍼랜드)

   · rs, rt : source레지스터

   · rd : destination레지스터

- 다른 필드

   · op : operation 코드 (모든 R-Type명령어의 op 코드값 : 0)

   · funct : function

   · shamt : shift명령어에서 사용되는 shift의 양

 

A2. 다음 중 데이터를 최상위 바이트부터 차례로 저장하는 방법은? (Big-Endian / Little-Endian)

: Big-Endian은 최상위 바이트부터 차례로 저장하는 방법이다

 

A3.

 

A4. 다음 중 기계어 코드에서 opcode가 0이 아닌 것을 모두 고르시오

 R-type

② I-type

 J-type

 

A5.

답 : $s0와 $t0가 같은 값을 가질 때

 

A6~A7.

 

 

 

< 출처 >
강의노트, 디지털논리와 컴퓨터 설계, Harris et al. (조영완 외 번역), 사이텍미디어, 2007, 컴퓨터 구조와 원리 (비주얼 컴퓨터 아키텍처), 신종홍 저, 한빛미디어, 2011