[CS] #2. MIPS(1)

<div>elop·2022년 1월 17일
0

What is MIPS(Microprocessor without Interlocked Pipeline Stages)?

-RISC기반의 명령어 집합체계
-High-level language를 컴파일러가 mips 코드로 변환시켜줌
-한 줄당 한 개의 instruction이 들어감

-특징-

  • 1 destination, 2 sources로 이루어진 3개의 operhands가 존재
    ex) add a,b,c==>a=b+c
  • operhands들은 32개의 register들 중 하나로 선택됨
    (MIPS architecture에서 register의 size는 32bit
    Word : 32bit(4byte)의 group을 의미 (자주 나올 단위이니 기억하도록 하자)
  • register엔 $을 붙여 표시할 것임

MIPS엔 아래와 같이, 32bit의 register가 32개 있다.

예를 들어 f = ( g + h ) - ( i + j )는 MIPS코드로 다음과 같이 표현할 수 있다.
(↑여기서 $t는 temporary register, $s는 saved register)


그리고 arithmetic instruction 연산은 MIPS의 register 내에서 일어나는 과정이므로, 이를 memory와 연동하는 data transfer 과정이 필요하다. 이때 lw(load word), sw(store word)를 사용한다.

예를 들어
A의 base address(A[0]), h의 값을 각각 $s3, $s2라고 하면
lw     $t0, 32($s3)
add   $t0, $t0, $s2
sw     $t0, 48($s3)

여기서 왜 A[8], A[12]를 표현 할때 index에 4를 곱해서
$s3+32, $s3+48 라고 표현했을까?
여기서 등장하는것이 Alignment restriction이다.

※Alignment restriction : MIPS에선 byte address를 사용하므로 address는 반드시 4의 배수여야 한다.

앞으론 왜 4를곱하는지 언급 안할거다! 알아두자!


++ 추가
  • addi : add immediately, register값에 상수를 바로 더하는 instruction.
    ex) $t0, $t0, 3    # $t0 = $t0+3
    빼고싶을때 subi는 따로 없고, 상수자리에 음수를 넣어서 사용하면 된다.
  • $zero : 상수 0을 의미하는 register를 따로 두어서 활용한다.
  • signed to unsigned : 𝑥̅ + 1 = −𝑥임을 이용한다.




ㅡMIPS to machine instruction

이제 MIPS코드가 어떻게 machine language로 변환되는지 알아보자.
우선 register들은 각각 할당된 bit가 있는데,
$s0 ~ $s7은 16~23,
$t0 ~ $t7은 8~15, $t8 ~ $t9는 24~25번째 bit에 할당되어있다.
(대부분의 코드는 $t7까지로 표현이 되므로 t8,t9는 예외의 경우를 위해 존재하므로 떨어져서 할당.)
이제

add $to, $s1, $s2를 표현해보자!
다음과 같이 표현된다. add instruction이라서 R-format으로 표현됐는데, 아직 와닿지 않을것이다.
먼저 R-format 과 I-format을 살펴보자.

  • R-format (일반적으로 arithmetic이나 logit operation에 사용)

    op,func => 어떤 instruction이냐를 의미한다.
    rs,rt,rd => 3개의 operhands를 의미한다.
    shamt => shift amount. 아래서 다시 언급할 예정이니, 눈에 익혀만 두자.

  • I-format (메모리에 접근하는 instruction, branch instruction에 사용)

    op => 어떤 instruction이냐를 의미한다.
    rs,rt => source,target register를 의미한다.
    constant or address => 주소값 또는 상수




이제 이 그림으로 돌아와보자.

opcode가 0, func 부분이 32라는것은 add instruction이라는 것을 의미한다.
add이므로 shamt부분은 사용되지 않았고,(bit를 shift할 필요가 없음)
rs,rt,rd부분은 first,second, destination register을 의미하는것이다.
아래 표를 보면 이해가 훨씬 쉽다!



ㅡLogical operations

이제 논리 연산을 알아보자.

and나 or은 알겠는데, sll과 srl은 뭘까?

  • sll(shift left logical) : 말그대로 bit를 왼쪽으로 옮기라는 뜻이다.
    예를들어
    0000 0000 0000 0000 0000 0000 0000 1001(=9)를 4만큼 shift left하면
    0000 0000 0000 0000 0000 0000 1001 0000(=144)이 된다.

    sll은 2^n만큼 곱한 것과 같다는 것을 볼 수있다.

  • srl(shift right logical) : 당연히 반대로 bit를 오른쪽으로 옮기라는 뜻이다.

    여기서 주의할점은, sll과 달리 srl을 하게되면 sign bit가 바뀔 수 있기 때문에 unsigned인 경우에만 2^n으로 나누는 것을 의미한다.

profile
기록장

0개의 댓글