티스토리 뷰

컴퓨터구조

[컴퓨터구조] MIPS 하드웨어 연산

Hani_Levenshtein 2020. 9. 23. 07:30

지난 포스팅에서는 ISA(Instruction Set Architecture) 가 무엇인지 알게 되었습니다.

그리고 하드웨어와 소프트웨어의 상호연결을 위한 ISA 의 중요성에 대하여 강조를 했습니다.

 

2020/09/22 - [컴퓨터구조] - [컴퓨터구조] ISA(Instruction Set Architecture)

 

이번 포스팅에선 ISA 중 하나인 MIPS(Microprocessor without Interlocked Pipeline Stages) 에 대하여 알아보겠습니다.


CPU 는 가능하면 메인메모리보다 CPU 내부에 있는 메모리인 레지스터로부터 데이터를 읽어오는 것이 낫습니다.

RAM 은 DRAM 이고 레지스터는 SRAM 이기 때문에 레지스터의 속도가 더 빠르기 때문입니다.

 

즉, 레지스터를 이용한 연산이 더 많은 연산을 수행할 수 있습니다.

 

MIPS 에선 32bit 의 레지스터를 32개 사용할 수 있고, 레지스터에는 자주 접근하는 데이터를 저장해놓습니다.

그 중에서 일부 레지스터에는 미리 이름이 부여됩니다.

임시 값을 위한 (Temporary Resister) $t0 - $t9

저장된 변수를 위한 (Saved Resister) $s0 - $s7

 

레지스터 피연산자를 이용한 산술 연산을 예를 들어보겠습니다.

a = (b + c) - (d + e);

add $t0, $s1, $s2 // $t0 = $s1 + $s2

add $t1, $s3, $s4 // $t1 = $s3 + $s3

sub $s0, $t0, $t1 // $s0 = $t0 - $t1

1번 줄의 고수준 언어의 코드는 그 아랫줄과 같은 레지스터 피연산자를 통해 계산됩니다.

a부터 e까지를 $s0 ~ $s4 로 본다면 (b + c) 와 (d + e) 연산은 각각 임시 값을 위한 $t0, $t1 에 저장됩니다.

그리고 $t0 - $t1 연산의 결과 a는 레지스터 $s0 에 저장됩니다.   


배열이나 구조체와 같은 복합적 데이터는 메인메모리 상에 보관됩니다.

MIPS 에서의 산술 연산은 레지스터에서 계산되기 때문에 레지스터로 메모리의 주소를 가져와야합니다.

이렇게 계산된 값은 레지스터에서 메모리로 넘겨 저장합니다.

 

레지스터가 32bit 단위이기 때문에 MIPS 를 사용하는 컴퓨터는 메모리 주소의 크기를 4byte 로 일치시킵니다. 

따라서 배열의 값을 가져올 때도 4byte 단위로 가져오기 위해 4의 배수를 곱해야합니다.

 

예를 들어보겠습니다.

y = x + A[8]

lw $t0, 32($s3) // $t0 = $s3[8]
add $s1, $s2, $t0 // $s1 = $s2 + $t0

배열 A의 주소를 $s3 이라고 한다면 A[i] 의 주소는 4*i ($s3) 이라고 할 수 있습니다.

A[8] 의 주소 4*8($s3) 을 임시 값 $t0 에 적재(load word) 시킨 후, 덧셈 연산을 할 수 있습니다.

word 라는 단어가 쓰인 이유는 32bit 데이터가 word 라고 불리기 때문입니다.

 

A[12] = a + A[8]

lw $t0, 32($s3) // $t0 = $s3[8]
add $t0, $s2, $t0 // $t0 = $s2 + $t0
sw $t0, 48($s3) // A[12] = $t0

또한 레지스터에서 메모리로 값을 보내 저장(store word) 시킬 수도 있습니다.


상수는 레지스터에서 직접 연산을 통해 이뤄집니다.

addi $s2, $s2, -1 // $s2 = $s2 + (-1)
addi $s2, $s2, $zero // $s2 = $s2 + 0

subi 연산이 없기때문에 음수를 더해서 뺄셈 연산을 하며, 상수 0은 $zero 로 불러올 수 있습니다.


1word 에는 0과 1을 나타낼 수 있는 32개의 bit 가 있습니다.

부호가 없다면 1word 는 0부터 2^32-1 까지 나타낼 수 있습니다.

 

0000 0000 0000 ... 0000 0

1111 1111 1111 ... 1111 2^32-1

 

부호가 있다면 2의 보수법을 통해서 -2^31 부터 2^31-1 까지 나타낼 수 있습니다.

2의 보수법에선 첫번째 비트는 음수(1) 와 양수(0) 를 나타내며 나머지 31개의 비트는 수의 크기를 나타냅니다.

 

1000 0000 0000 ... 0000 -2^31

1111 1111 1111 ... 1111 -1

0000 0000 0000 ... 0000 0

0111 1111 1111 ... 1111 2^31-1


 

댓글