컴퓨터(Computer Science)/컴퓨터구조(Computer Arichitecture)

MIPS Architecture & Operation, 구조와 연산 [컴퓨터구조]

게임이 더 좋아 2020. 3. 26. 15:54
반응형
728x170

MIPS의 구조를 보자

 

 

MIPS는 32비트의 레지스터를 가지고 있고

레지스터는 0-31 비트가 있다.

 


 

레지스터를 더 자세히 보자면

 

 

32-bit 레지스터를 레지스터 파일(Register File)이라고 한다.

2개의 read port와 1개의 write port가 있다. 

1 clock에 2개를 읽고 1개를 쓸 수 있다는 것이다.

 

저기 그림과 같이 src1 data 와 src2 data를 동시에 읽을 수 있다.

32개의 레지스터 중에서 2개를 읽을 수 있으니까 32-bit짜리 데이터 2개를 읽을 수 있다.

(읽을 레지스터는 src1 addr, src2 addr을 통해서 주소를 입력받아서 읽게 되어있다.) 

(주소는 5-bit)

 

write는 쓰기 위한 데이터 (32-bit)

어떠한 주소에 쓰냐면 dst addr(5-bit)에 쓴다.(destination)

 

write는 항상 일어나면 안되니까 write control로 조정한다.

 

Register는 메인 메모리보다 빠르다.

그러나 레지스터의 수가 늘어나거나 레지스터의 포트가 많아질수록 속도는 느려진다.

 

Register의 주소는(5-bit) 메모리의 주소(32-bit) 그래서 code density를 낮추는데 유용하다.

-> 메모리의 주소 접근보다 유리하다는 말이다.

 


 

각 MIPS의 레지스터 이름이라고 보면 된다.

이름과 역할이 있다.

 

 

0번 레지스터는 지정된 상수로 읽기만 가능하다.

1번 레지스터는 사용자 접근이 제한되어있다.

2-3 function에서 계산한 값에서 반환받음

4-7 function에 arguments를 전송할 때 사용함

8-15, 24-25 temporary 값 저장

global pointer

stack pointer

frame pointer

return address: 하드웨어와 협력해서 function에서 main 루틴으로 돌아올 때 사용한다.

그림으로 보면

 

Preserve on call 이란 sub루틴 call 했을 때 보존이 되느냐?이다.

보존이란 프로그램 수행 후에도 값이 바뀌지 않는다는 것을 의미한다.

 

 

 


 

우선 모든 Instruction은 Binary로 되어있다.

즉, Machine Code로 되어있다.

 

 

맨 위보고 다시봐도 MIPS에서 Instruction도 32비트로 되어있다.

즉, 위의 op, rs, rt, rd .... 등의 정보를 읽어서 연산을 하는 것이다.

 

Instruction의 종류는 3가지가 있다.

즉, 32비트 짜리의 3가지 종류 Instruction이 있다는 말이다.

 


 

1. R -> Arithmetic operation

 

 

R-format의 예를 보자

 

1. opcode + funct을 합쳐서 무슨 연산인지 알아낸다.

2. 해당 연산을 위한 값을 rs, rt에서 가져와 연산을 한다

3. rd에 연산의 결과를 저장한다.

 

여기서는 opcode와 funct을 읽어서 add를 알아내고

$s1는 17, $s2는 18의 값을 가지고 있고 destination인 $t0는 주소가 8인것을 알아낸다.

($t0은 8번 레지스터다.)

여기서는 shamt 값은 없다.

 

 

add $to, $s1, $s2 는 어셈블리어라 우리가 어느정도 이해가 가지만

하드웨어가 알아먹게하기 위한 언어로 바꾸면

즉, 기계어로 위의 operation을 표기하자면

이렇게 되겠다.

(당연히 뭔지 우리는 모른다)

 


 

2. I-format -> Immediate Arithmetic + load/store 

 

 

I-format에서는 Immediate 연산과 load/store를 담당한다.

 

여기서는 4 영역으로 나누어지는 것이 특징이다.

위의 그림에서 n.a 를 보면 알 수 있다. (not available)

즉, 저 나머지 3영역이 1영역으로 합쳐져서 16-bit의 constant 또는 address로 표현된다는 것이다.

 

**Constant의 범위는 from -2^15 to 2^15-1 까지

**Address는 base address에서 더할 수 있는 offset 값이 된다.

 

 

예를 들면 아래와 같다.

 

 


 

 

Logical Opration이다.

 

shift는 비트를 옆으로 미는 것이다.

비트를 밀면 해당 값이 2배로 줄어들거나.. 2배로 늘어나거나 할 것이다.

01001 과 10010의 값의 차이처럼

MIPS에서도 sll은 shift left logical이다. 

** sll은 음수, 양수 둘 다 적용가능

** srl 은 unsigned일 때만 가능(양수일 때만)

 

**MIPS instruction에서 u가 붙으면 거의 unsigned를 표현한다고 보면 된다.

**밀리거나 당겨질 때 비트가 밀려나는 부분이 없어지고 새로 생겨나는 비트가 생기는데

그럴 때는 해당 부분과 맞닿아 있는 비트를 복사해서 붙여준다.

 

 

 


 

그 외에도 AND, OR, NOT 연산이 있다. 이것은 어떻게 처리할까??

 

 

즉, masking 할 때 쓴다.

masking이란 특정한 값을 0으로 숨기는 것을 의미한다.

 

 

어떠한 값은 값을 바꾸지 않고 어떤 부분은 1로 만들 때 사용한다.

 

우선 MIPS에서는 NOT 연산은 없다.

 

 

대신에 MIPS에서는

NOR를 사용해서 구현했다.

NOT은 값을 역전시킬 때 이용한다.

 


 

다음은 Conditional Operation이다.

branch 명령어가 쓰이는데 if문과 아주 비슷하다.

 

 

bne: branch not equal

beq: branch equal

j는 무조건 해당 instruction으로 점프한다는 것이다.

 

예를 들어 보자

C언어에서 이렇게 구현했다면

 

MIPS에서는 이렇게 받아들인다.

 

 


 

Loop Operation도 위의 브랜치, 점프를 이용해서 만들 수 있다.

 

C에서는 이렇게 생겼지만

 

MIPS에서는

왜 2비트 미루는지는.. 4를 곱해야하기 때문이다.

 

 


 

또한 More Conditional Operation도 있다.

즉, 해당 condition과 부합하면 1값을 갖고 아니면 0값을 가지게 한다.

 

아래 rs와 rt의 결과가 true면 rd가 1이되는 것이고 false이면 0이 되는 것이다

 

 

브랜치와 같이 사용하는 것이다.

 


 

어...? 근데 굳이 slt 를 만들어야하나?

처음부터 branch에서 조사하면 되잖아?

 

branch와 섞어버리면 더 많은 instruction이 필요하다. 때문에 비효율을 초래하기 때문에 그렇다.

이 부분이 느려짐으로써 blt를 사용하게되는 모든 것에 비효율을 초래하고 전체를 비효율적으로 만든다.

 

bnq와 bne가 Common case로써 fast하게 해야 성능을 향상시킬 수 있기 때문에

굳이 branch에서 less than 같은 연산은 하지 않는 것이다.

 

 

728x90
반응형
그리드형