School Lecture Study/Computer Architecture

MIPS Instructions

vㅔ로 2021. 12. 10. 18:18
728x90

Instructions 들은 binary로 인코딩 된다. 

32-bit instruction words로 구성되며, instructions format이 R, I, J로 적은 편이다. 

 

== Register numbers == 

$t0 ~ $t7은 8-15

$t8 ~ $t9는 24-25

$s0 ~ $s7은 16-23으로 각각 정해져있다. 

MIPS 초록 종이에 다 나와 있음.

 

R-format은 op, rs, rt, rd, shamt, funct로 구성된다. 

op : r-format임을 표시해주는 부분

rs rt : source register

rd : destination register이다. 

shamt: shift 연산일 때 쓰이는데, 안 쓰이면 0이 들어간다. 

funct : add, sub 등 실제 어떤 연산을 할 지 명시하는 부분

MIPS 레지스터는 총 32개이기 때문에, rs, rt, rd의 크기는 5bits 이다. (2^5)

 

* funct 코드도 green card에 있다.

 

I-format

 

op : I-format인 거 구분하기 위해서 있다.

I-format에서 rs, rt는 연산에 따라 다른 역할을 한다.

Ex) lw에서 rt는 destination, sw에서 rt 는 source

constant or address : 상수의 경우 -2^15 ~ 2^15 - 1까지, address는 rs에 더해질 offset이다. (16bits 임)

 

뒤에 i가 붙은 것들은 상수를 포함한 연산인데, 상수를 레지스터에 저장하지 않고 바로 계산할 수 있다.

 

보면 알겠지만 R-format과 그렇게 많이 다르지 않다. 

 

Logical Operations

 

주의할 점은 logical shift right, left인 경우에는 shift 결과 후 앞 또는 뒤를 0으로 채워야 한다. 

 

shift operation

shift 연산에서 rs는 쓰이지 않는다. 그치만 R-format임.

rt와 rd만 쓰이는데, rd를 shamt만큼 shift 연산한 값을 rt에 넣으라는 것이다.

shift right logic인 srl은 unsigned에서만 가능한데, signed에서는 또 다른 식으로 처리해야 한다. (Ch 3에 나옴)

** and, or 연산은 R-format

Ex ) and $t0, $t1, $t2   <- 이 경우 t1과 t2를 and 한 값을 t0에 저장하라는 뜻이다.

 

beq, bne, j

 

컴퓨터는 input 데이터에 따라 다른 행동을 하거나, 계산하는 동안 값을 생성할 수 있다.

-> branch를 사용하면 가능 (C를 예로 들면, if, else, else if, for, while, switch와 같은 것들)

 

beq rs, rt, L1

- rs와 rt가 같으면 L1으로 이동할 것

bne rs, rt, L1

slt, slti

  • slt rd, rs, rt
  • rs가 rt보다 작으면 rd는 1이고, rs가 rt보다 크면 rd는 0이다.
  • slti rt, rs, constant
  • rs가 상수보다 작으면 rt는 1, 크면 0

blt, bge가 없는 이유?

blt, bge는 beq, bne보다 속도가 느리다.

beq, bne와 slt, slti로 blt, bge를 구현 가능하다.

Procedure Calling

함수는 MIPS에서 어떻게 구현되는가?

  1. 함수 매개 변수를 register에 저장한다.
  2. control을 함수에 전달한다.
  3. 함수를 위한 stack 공간을 할당한다.
  4. 함수 실행
  5. caller를 위해 register에 값을 넣는다.
  6. 함수를 호출한 쪽으로 돌아간다.

PC : program counter로, 지금 진행하고 있는 instruction의 주소를 나타낸다. (special한 레지스터)

$ra : return address. 돌아가야 하는 부분의 주소를 저장하는 레지스터


jal, jr

jal ProcedureLabel

jump-and-link의 줄임말

  1. next instruction의 주소 (PC+4)를 $ra에 저장한다.
  2. target Address로 jump 한다.

jr $ra

jump-register의 줄임말

$ra를 PC에 옮겨 담는다.

$ra에 있던 주소로 되돌아 간다.


Register Usage and Stack

  • More on MIPS registers$a0 - $a3 : arguments (4-7)$s0 - $s7 : 스택에 저장되는 값. $s0과 $s1를 callee에서 사용하면 이전에 있던 값이 사라지기 때문에 스택에 저장한 후, register를 사용하고 스택의 값을 복구하여 리턴한다. (즉, 이전의 값과 같다.)$sp : stack pointer (29)$ra : return address (31)
  • $fp : frame pointer (30)
  • $gp : global pointer for static data (28)
  • $t0 - $t9 : temporaries (임시 변수) → 호출한 함수에서 동일한 레지스터에 값을 쓴다면 덮어씌워질 수 있다. (즉, 이전의 temp 값과 다를 수 있다.)
  • $v0, $v1 : result values (2-3번)
  • Stack
    • LIFO 데이터 구조
    • $sp는 가장 최근에 할당된 주소를 저장하는 register이다.
    • stack은 위에서부터 값이 저장된다. (주소값이 높은 것에서부터 낮은 것으로)
    • stack에 있는 값을 없애려면 addi $sp, $sp, 4를 하면 된다. (-4는 스택에 자리를 할당하는 것 - 스택은 아래로 자라나므로)

Memory Layout

  • Text : 프로그램 코드
  • Static data : 크기는 고정되어 있으며, global variable들이 저장되는 장소
  • Dynamic data : heap. 실행 전에는 얼마나 할당될 지 모르며, 실행 후에 크기가 결정되는 데이터 구조. 크기는 정해져 있지 않다.
  • Stack : 크기가 정해져 있지 않음. 자동으로 할당되는 공간인 듯.

!!! Stack과 Dynamic data가 만나면 어떻게 될까?

  1. 아무 일도 안 일어난다. → 놀랍게도 아무런 말도 해주지 않는다. 덮어씌워져도 개발자가 알 수가 없기 때문에 매우 주의해야 함.
  2. 충돌이 일어난다. (X)

lb, lbu, sb 는 수업에 언급된 적이 없으니 안 쓰겠다.

Branch Addressing

  • beq, bne가 사용하는 format
  • Opcode, 레지스터 2개, target Address 가 존재하므로 I-format이다.
  • 대부분의 branch들은 근처의 branch를 가리키기 때문에, 주로 PC의 근처이다. → bne, beq는 비교적 가까운 주소로 이동하는 것이다.
  • bne, beq는 PC와 상대적인 주소 처리이다.
    • Target Address = PC + offset(16bits) * 4이다. (마찬가지로 instruction이 4bytes 이므로 4를 곱한다)
    • branch는 -2^15 ~ 2^15까지의 instruction이 들어갈 수 있는데, MIPS의 instruction은 4bytes 이므로 총 +-2^17까지 저장할 수 있다.
    • PC가 현재 이 위치에 있다는 것은 PC에 PC+4의 값이 들어가 있는 것이기 때문에, 실제 연산은 (PC + 4) + offset * 4이다.

Jump Addressing

  • j, jal이 사용하는 format
  • 조건 상관 없이 뒤에 오는 address 어디든지 이동할 수 있다.
  • Direct jump addressing : Target address = address * 4이다.
  • 2^26 words 내의 모든 주소를 이동할 수 있다. (words는 4bytes 이므로 2^28bytes의 주소들)
  • jr은 R-format이다.
    • OPcode, rs, funct만 존재하는 R-format

** 만약 beq를 사용해서 branch 처리를 했는데, target address가 너무 멀리 있는 경우에는 어셈블러가 자동으로 j-format으로 변경해준다.

Addressing Mode Summary

728x90

'School Lecture Study > Computer Architecture' 카테고리의 다른 글

Each instruction's datapath  (0) 2021.12.23
Simple DataPath  (0) 2021.12.16
[5-2] Division  (0) 2021.10.21
[5-1] Overflow / Multiplication  (0) 2021.10.18
[3-3] Immediate Operands & Integer Wrapping & 보수  (0) 2021.10.01