본문 바로가기
about COMPUTER/컴퓨터 시스템

# 02. MIPS의 ISA

by saniii 2020. 10. 9.

▶MIPS ISA

 

 

 

# MIPS : 밉스 테크놀로지에서 개발한 RISC ISA

 

- MIPS에서는 메모리 주소를 나타내기 위해 총 32bits를 이용한다.

 

 


 

# MIPS register & memory

 

▶ 레지스터 

* 레지스터는 총 32개로 나누어져 있어 각 칸은 $0 - $31로 나타낼 수 있다.

 

* instruction에서 피연산자와 결과는 레지스터의 주소값을 지정하는데

이때 레지스터를 구별하기 위해 32(= $$2^5$$ )개의 수를 표현할 수 있어야 하고 즉 최소 5bits가 필요하다.

 

* 레지스터 한 칸은 4byte이고 1byte8bit이므로 레지스터 한칸은 32bit메모리의 주소를 가리킨다

 

+ 실행할 다음 명령어를 가리키는 특수 목적 레지스터 PC(program counter)가 존재한다.

 

 

▶ 메모리

* 메모리는 총 2^32 byte로 한칸당 1byte이며 2^32칸이 존재한다.

 

* 각 메모리의 주소는 32bits로 표현한다.                                                

 

 


 

# MIPS Instruction의 종류

 

+ Arithmetic / Logic instructions : 산술 논리 연산            

 

+ Data Transfer (Load/Store) instruction : 데이터 전송 연산

* Load : 메모리에서 레지스터로 데이터를 복사하는 것

* Store : 레지스터에서 메모리로 데이터를 복사하는 것

[ MIPS에서 이 연산만 메모리의 주소가 피연산자로 올 수 있다 ]

 

+ Conditional branch instructions : 조건 분기 연산           

 

+ Unconditional jump instructions                                

 

 


# MIPS instruction Format

필드에서 뒤의 두 칸은 추가적인 연산을 표현하여 필요할 때 쓰면 된다

 

 

 * 접근 속도가 빠른 순서 -> immediate -> 레지스터 -> 메모리

 

** immediateinstruction 자체에 포함되는 상수필드

- 재사용 풀가 (두 번사용할 수 없음)                

- 추가적인 메모리 접근이 없어 빠른 연산이 가능

- instruction32bit내에 포함되어야 하므로 사용하는데 한계가 있다.

 

 


# MIPS의 연산

 

+ Arithmetic Operations                                                                     

연산자 예시 )    add $s1, $s2, $s3 

-> $s2에 $s3를 더하여 $s1에 저장하라

 

* instruction에서 addu , subu 와 같이 'u'가 붙으면 unsigned라는 뜻으로 오버플로우를 무시한다

 

** unsigned : 자료형에 대하여 모두 양수값으로 표현 (0~...)

** 오버플로우 : 변수에 저장할 수 있는 값의 범위를 넘음    

 

++ 문제 예시 : 피연산자(operand)의 표현에 드는 총 비트 수가 많은 순서? => addi > add  

      (아마 immediate의 영향 때문일 듯)

 

+ Logic Operations                                                                            

                       큰 데이터를 처리할 때 레지스터와 메모리간에 데이터를 전송하는 것이 필요하다

+ 논리연산은 숫자자체가 아닌 비트단위로 연산한다

 

연산자 예시 )    and $s1, $s2, $s3 

-> $s2와 $s3의 각 비트를 and 연산하여 그 결과를 $s1에 저장하라

 

+ AND : 두 비트가 모두 1일 때만 1을 결과로 출력한다.

+ OR : 두 비트 중 적어도 하나 이상 1이면 1을 결과로 출력한다.

+ XOR : 두 비트가 서로 다르면 1, 같으면 0을 결과로 출력한다.

 

+ Data Transfer Instructions                                                                

+ 레지스터에 메모리주소를 저장할 때 계속 메모리 주소를 변경(오버헤드)할 수 없으므로

원하는 메모리가 처음 지정 메모리 위치로부터 얼마나 떨어져 있는지로 나타낸다.

( -> $s2 : 시작 주소 )

 

+ 메모리의 주소는 byte로 나타내고 1 word가 4byte이며 

word는 4의 배수가 주소의 시작이다.

즉, $s2+100 은 4의 배수

 

+ load byte signed의 경우 1word = 4byte중 뒤의 1byte(=하위 8bit)를 복사하고

**MSB에 따라 앞의 3byte를 채운다. ( **2의 보수 연산)

+ load byte unsigned이면 위와 같지만 양수이므로 MSB에 상관없이

앞의 3byte를 모두 0으로 채운다

 

**MSB : 가장 왼쪽에 위치한 비트

**2의 보수 연산 : 절댓값을 기준으로 비트를 채우고

                                       각 비트를 이에 대한 보수로 바꾼뒤 1을 더한다.

ex) +5 => 00000101

1) 각 비트의 보수 취하기 => 11111010

2) 1을 더하기                => 11111011

                             

                    따라서 -5 => 11111011

 

+ 만약 4의 배수로 시작하는 주소부터 접근하고 싶지 않다면 연산자를 여러개 사용하여 나누어 접근해야 한다.

 

연산자 예시 )    lb $s8 4($s9) 

-> $s9+4의 값을 $s8에 저장하라

 

 

+ Conditional Branch Instructions                                                        

* 조건에 따라 수행할 기계어의 위치를 바꿈

 

* address 필드는 16bit로 현재 위치에서 가까운 위치로만 branch가 가능하다.

(** locality(인접성) : branch instruction 만으로도 웬만한 주소 접근 범위를 수용할 수 있게 하는 프로그램의 접근 속성)

 

 

+ Unconditional Jump Instructions                                                       

* 조건 없이 무조건 수행할 기계어의 위치를 바꿈 

 

 

 

댓글