isPowerfulBlog

[컴퓨터구조] #03 | MIPS R/I-format 본문

CS

[컴퓨터구조] #03 | MIPS R/I-format

왕밤빵도라에몽 2023. 10. 16. 20:24

임은진 교수님의 컴퓨터구조 lecture08~09을 학습하고 작성한 TIL입니다


R-format

6개의 field로 구성

| op(6bits) | rs(5bits) | rt(5bits) | rd(5bits) | shamt(5bits) | funct(6bits) |

  • 어떤 instruction인지?
    op operation code
    funct function code
  • operands
    rs fist source register number
    rt second source register number
    rd destinationregister number
  • shift amount
    shamt shift amount (default 00000)

✅ 기계어와 어셈블리어는 순서가 다름!
기계어destination이 operands 셋 중에 젤 나중에 옴!

000000 rs   rt   rd 00000 100000
add    $t0, $s1, $s2

R-format instructions

add / addu

sub / subu

or / and / nor

sll / srl


I-format

5개의 field로 구성
R-format은 상수를 바로 더해주는 i연산(ex: addi, ori....)을 할 수 없음

| op(6bits) | rs(5bits) | rt(5bits) | constant or address(16bits) |

  • 어떤 instruction인지?
    op operation code

  • operands
    rs source register number
    rt destination or source register number
    immediate field (constant or address field) can represent -2^15 ~ (+2^15-1)

I-format instructions

ori, andi

논리연산
no sign extension of immediate value

addi

산술연산
sign extension of immediate value

lui

load upper immediate instruction

lui rt, constant
op 00000 rt imm
  • 16-bit인 constant를 rt 레지스터의 왼쪽(upper) 16-bit에 쓴다.
  • rt 레지스터의 오른쪽(lower) 16-bit는 0x000으로 쓴다.

✅ ALU 연산은 32-bit짜리 두 개를 받아서 연산을 수행한다!
그런데 immediate field16-bit이므로 앞에 16-bit가 남음

  • 논리연산
    앞의 16-bit를 0으로 채움
    no sign extension
  • 산술연산
    immediate fieldsign값과 같은 값으로 앞의 16-bit를 채워줌
    sign extension

ex) 16-bit로 표현된 -2를 32-bit로 extend

  1. 양수 2를 2진수로 표현
0000 0000 0000 0010
  1. 2를 2의 보수로 나타내기
    ```
    1111 1111 1111 1101
  • 1

= 1111 1111 1111 1110


3. 32-bit로 extend
위의 수의 sign bit가 1이므로

1111 1111 1111 1111 1111 1111 1111 1110


## out of range error for I-format instruction

`immediate field`는 **16-bit**의 constant를 저장한다.

addi $10, $0, 0x8000

위의 코드는 10번 레지스터에 16진수 0x8000을 저장하겠다는 코드인데, 이 수를 2진수로 나타내었을 때 아래와 같다.

1000 0000 0000 0000

위에서 언급했듯이 `immediate field`이 **표현할 수 있는 범위**는 -2^15 ~ (+2^15-1)
즉 2진수로 나타내었을 때

0111 1111 1111 1111 # 양수범위 최대 (+2^15-1)
1000 0000 0000 0000 # 음수다 얘부터는
1111 1111 1111 1111 # 음수범위 최소??(아무튼 끝ㅋㅋ) -2^15

```
이므로 16진수 0x8000은 산술명령어 addi의 constant field에서 표현 가능한 범위를 벗어난다.

그래서 spim상에서 out of range error을 발생시키는데, 이때 Abort를 누르지 않고 OK로 계속 실행하게 되면 SPIM은 사용자가 원하는 명령을 수행하기 위해 다른 instruction을 대신 수행한다.

✅ out of range 범위는 명령어 종류(산술/논리)에 따라 결정된다.

  • 산술명령어 - 상수 operand가 signed number여야 한다고 가정
  • 논리명렁어 - 상수 operand가 unsigned number여야 한다고 가정

✅ 상수 operand는 10진수인지 16진수인지에 따라 해석된다. SPIM 어셈블러는 상수를 해석할 때는 어떤 명령어인지 상관이 없이 진수에 따라 해석한다.

  • 10진수 - signed number로 해석
  • 16진수 - unsigned number로 해석

헷갈린다면 명쾌상쾌통쾌한 교수님 글을 다시 읽어보자 나 자신아..


참고 임은진 교수님 컴퓨터구조 강의안


2021년 벨로그 글 옮겨옴,