ETC/CS

[컴퓨터구조] ch.2-3 MIPS

지과쌤 2020. 10. 25.
반응형

MIPS ( RISC ) Design Principles (설계 원칙)

막 외우자고 생각하지말고 한번 슥 보고 지나가자.

 

  • 단순하게 만들어 규칙성을 확보하라
    • 고정된 크기 (32 bite)
    • 명령어 형식을 많이 만들지 말라.
    • 동작을 나타내는 코드는 앞에 6 bits 에 표현
  • 작은것이 더 빠르다
    • 명령어 셋 많이 쓸 필요 없다.
    • 레지스터들의 집합 수 32개정도로 제한
    • 주소 지정 방식(연산에 필요한 값을 어디로부터 어떻게 가져올 것인가를 지정하는 방식) 많이 만들지 마라.
  • 자주 사용되는것 빠르게 실행되게 하자
    • 메모리에 접근하는 경우는 load-store 명령어만을 통해서 사전에 레지스터 파일을 가져다놓으면 그 값에 대해서 연산하도록 하자.
    • immediate operands를 명령어상에 가지도록 하자
  • 좋은 설계란 적절한 절충을 하는것이다.

MIPS-32 ISA

  • 프로세서의 명령어
    • 산술 논리 작업
    • load-store 작업
    • 의사결정 기능
  • MIPS의 명령어 카테고리
    • 산술 논리 작업
    • load-store 작업
    • 점프, 분기 작업
    • 부동소수점 작업
    • 메모리 관리 작업

명령어가 취하는 형식

모든 포멧은 32 bits의 길이를 갖는다.

맨 앞에 operation code 를 가진다.

 

R format : register

I format :  immediate

J format : jump target


MIPS Arithmetic Instructions (산술 명령어)

add $t0, $s1, $s2

sub $t0, $s1, $s2

 

더하기 빼기 -> 임의의 레지스터에 있는 두 값에 대해 연산 후 결과를 또다른 레지스터에 저장

 

따라서 각각의 산술 명령어들은 하나의 작업을 수행한다.

 

전체적으로 보면 피연산자(operands)들은 레지스터 파일에 들어있다.($t0, $s1, $s2)

 

위의 연산을 다시 한번 자세히 보자.

 

add $t0, $s1, $s2

sub $t0, $s1, $s2

 

$t0 -> destination

$s1 -> source 1

$s2 -> source 2
add, sub -> op

 

destination <- source1 op source2

 

Instruction Format(R format)

명령어 포멧 중 R 포멧이다.

sub $t0, $s1, $s2 에서

 

sub :  0(operation code)과 0x22

$s1 : 17 (17번 레지스터라는 의미)

$s2 : 18 (18번 레지스터라는 의미)

$t0 : 8 (8번 레지스터라는 의미)

 

따라서 위의 산술연산은 18번 레지스터와 17번 레지스터에서 값을 가져와 연산한 후 8번 레지스터에 저장하게된다.


MIPS Instruction Fields ( MIPS 명령어 필드 )

아래 그림은 MIPS 명령어를 구성하는 32bit 의미

각 부분의 의미

op : 구체적인 동작을 나타내는 opcode

rs : 첫번째 피연산자

rt : 두번째 피연산자

rd : 결과값이 저장되는곳

shamt : 쉬프트 명령어에서 어느정도 쉬프트 할지?

funct : 6비트의 opcode를 보충해주기 위한 코드


MIPS Register File

레지스터 파일 : 전체 레지스터들의 집합

 

레지스터 파일

32개의 레지스터가 각각 4byte의 길이를 가진다.

 

src1 addr, scr2 addr 레지스터의 값을 읽고, 연산한 결과값은 dst addr에 저장한다. 이때, wite data 저 부분을 통해 쓰기인지/읽기인지 control 이 된다. (위에서는 write)

 

다시말해, 위의 경우 write를 하게되는데,  write data /32 저 라인을 통해 데이터가 들어오게 된다.

 

한편 /5 /32와 같이 저 숫자는 병렬로 동시에 전달할 수 있는 데이터의 크기(물리적으로 5개, 32개...)이다.

 

왜 레지스터인가?

  • 메인 메모리보다 빠르다.
  • 컴파일러가 사용하기 편리하다.
  • 변수들을 유지하고 있어 코드의 밀도(code density)를 고려하기 유리하다.

참고자료 : MIPS Register Convention

참고만 하자.

 


MIPS Memory Access Instructions (MIPS 메모리 접근 명령어)

lw     $t0,  4 ( $s3 )     #load word from memory

sw     $t0,  8 ( $s3 )     #store word to memory

 

메모리에 접근하여 명령어를 가져오거나, 연산한 결과를 메모리에 저장하는.... 즉 load / store 이다.

 

대표적으로 lw (load), sw (store) 가 있다.

 

메모리 주소는 32bit이다. base address register에 들어있는 값에 offset 값을 더해 접근할 메모리 주소를 구한다.


Machine Language - Load Instruction

Load/Store Instruction Format ( I format ) 

아래를 보면 위에서 다루었던 R 포멧과는 조금 다르다.

전체 길이는 32bit로 같지만, R포멧의 뒤 세 필드가 합쳐져$24_10$(상수값)가 위치한 필드가 되었다.

lw : 35, operation code

$t0 : 8번 레지스터

$s3 : 19번 레지스터, s3 레지스터에 들어있는 내용

24 :  $24_10$, offset 값 접근할 메모리 주소를 계산하는데 필요한 내용

 

접근할 메모리 주소를 계산하기 위해서는 $s3에 들어있는 값에 offset값을 더해야 한다. 즉

 

0x12004094$24_10$을 더하면 0x120040ac 가 된다.

 

이후 $t0 에 대한 동작을 진행하면 0x120040ac 에 대한 동작이 진행되게 된다.


Memory Access Example : Array (배열의 요소에 접근하는 경우)

 

lw    $t0,   4 ( $s3 )     // $s3에서 4 더한 위치에 있는 내용을 $t0에 넣고...

 

add    $t0,   $s2,   $t0     //$t0의 값과 $s2의 값을 더해 $t0에 다시 저장하고...

 

sw    $t0,   12 ( $s3 )     //$t0에 있는 값을 $s3에서 12 더한 위치에 저장


MIPS Immediate Instructions (즉각적인 명령)

보통 작은 상수가 많이 쓰인다.

 

그렇다면, 명령어가 상수값을 직접 갖고있게 하면 어떨까?

 

당연히 포멧은 I format이 된다.

 

I format

상수값이 명령어 내부 그 자체에 유지가 된다!

따라서 그 상수값의 표현 범위도 $+2^15-1$부터 $-2^15$ 사이로 제한된다.

저장 위치는 0x0F 저 부분.

반응형

댓글

💲 추천 글