개발/컴퓨터구조

I-format이란? (+ 계산 방법까지 전부 쉽게 알려드립니다.)

IT의 타이탄 2023. 9. 26. 14:21
SMALL

안녕하세요 저번 글에 이어 이번 시간에는 I-format에 대해 가르쳐드릴까 합니다.

 

(저번 글을 보고오지 못하셨다면?)

👉 R-format을 A부터 Z까지 전부 설명해드립니다.

 

 

이 글에 들어오기 전 대부분 I-format이 무엇인지 헷갈리고, 다시한번 개념을 정립해보자! 라는 생각을 가지고 찾아오셨을텐데요.

 

 

정말 잘 들어오셨다는 말을 전달드리고 싶습니다.

 

I-format

 

 

I-format에 대해 어느정도 알고 있는지는 전혀 상관없습니다. 제로베이스가 이 글을 읽더라도 매우 쉽게 이해할 수 있게끔 친절히 설명할 예정이기 때문입니다.

 

 

다만, I-format을 배우기전에 기초개념 Mips Instruction이 무엇이고, assembler가 무엇인지 모르신다면 이 글을 아무리 쉽게 설명해도 이해하기 어려울 것입니다.

 

 

그런 이유로 반드시 위에 링크를 달아놓은 R-format의 총정리 글을 읽어보시길 바랍니다.

 

 

이번 글의 목차는 다음과 같습니다.

 

 

[목차]

 

1. I-format 이란?

 

2. I-format 계산 방법 및 예제

 

 

여러분에게 필요한 정보만 가져가신다음에 과제, 퀴즈, 중간고사, 기말고사 혹은 다른 프로젝트에서 십분 활용하시길 바라며 글을 작성하도록 하겠습니다.

 

 

I-format에 대해 A부터 Z까지 정리해드리겠습니다.

1. I-format이란?

I-format이란 MIPS instruction을 표기하는 방식 중 하나로 R-format과 대표주자로 인식되어있습니다.

 

 

I-format은 R-format이 표현할 수 없는 것들을 표현하기 위해서 존재하는 방식인데요. 지난 글의 기억을 더듬어서 R-format이 표현할 수 없는 명령어는 과연 무엇이었을까요?

 

 

5초의 시간을 드릴테니 한번 생각해보시길 바랍니다.

 

 

(5)

 

 

 

(4)

 

 

 

(3)

 

 

 

(2)

 

 

 

(1)

 

 

 

바로 addi, andi, ori와 같이 3번째 Operand로 상수가 왔을 경우입니다.

 

 

R-format와 달리 I-format에서는 3번째 Operand가 레지스터값이 아닌 상수가 들어오기 때문에 이를 표현하는 방식 또한 달라지게 됩니다.

 

 

I-format의 표현방식은 다음과 같습니다.

 

 

[MIPS I-format Instructions]

op | rs | rt | constant or address

 

op : 명령어를 의미한다. (6bits)

 

rs : 첫번째 source Operand를 의미한다. (5bits)

 

rt : 2번째 source Operand이자 destination Operand를 의미한다. (5bits)

 

constant or address : 3번째에 오는 상수를 의미한다. (16bits)

 

 

 

여기서 여러분이 기억해야하는 것은 2가지가 존재합니다.

 

 

1. R-format과 달리 I-format에서는 rt가 2번째 레지스터 값이자 목적지를 의미한다

 

2. I-format에서의 각 명령어 별 bit값

 

 

이 2가지는 R-format과 다르기 때문에 반드시 기억해야하며, 이를 예제를 통해 설명드리면 다음과 같습니다.

 

 

ex) ori $11, $9, 0x8000 (명령어 | 목적지 및 소스 | 소스1 | 상수의 구조를 가지고 있음)

op : ori | rs : $9 | rt : $11 | constant : 0x8000 

* => 001101 01001 01011 1000000000000000 (ori : Mips opcode에 의하면 13을 의미함)

* 0011 0101 0010 1011 1000 0000 0000 0000 (위의 bit를 4bit씩 쪼갬)
= 0x352B8000 (위의 2진수를 16진수로 표현)

 

 

위에 보이는 * 기호 부분은 I-format을 계산하는 방법인데요. 이에 대해 차근차근 알아보도록 하겠습니다. 얼마 남지 않았늬 조금만 더 힘을내주시길 바랍니다!

 

 

2. I-format 계산 방법

I-format은 R-format과 마찬가지로 Mips instruction을 숫자로 변환한 후에 이를 4bit씩 끊어서 총 32bit로 표현하면 되는데요.

 

 

위의 예제를 통해 설명해드리도록 하겠습니다.

 

 

1. 001101 01001 01011 1000000000000000

위에 있는 숫자들은 ori $11, $9, 0x8000에 해당하는 부분을 2진수로 표현 한 것입니다.

 

 

ori는 Mips opcode에 따라 13을 의미하기 때문에 숫자 13을 2진수로 변환해서 001101이라는 값이 나오게 됩니다.

 

 

6개의 값으로 표현한 이유는 op의 경우 6bit값을 담기 때문입니다. 13을 2진수로 표현하면 1101이라는 숫자가 나오는데요.

 

 

이는 4bit값이기 때문에 앞에 00을 채워 총 6bit의 값으로 만들어주면 됩니다.

 

 

이와 마찬가지로 11번 레지스터 값과 9번 레지스터값을 2진수로 표현하고 0x8000으로 표현된 16진수 값을 2진수로 표현하면 위와 같은 숫자가 출력됩니다.

 

 

여기서 주의해야할 점은 위에서도 언급했지만 첫번째 oprand인 $11은 I-format에서 목적지 operand이자 소스 operand로 2번쨰에 위치하기 때문에 $11을 2진수로 변환한 01011이 3번째에 위치하게 됩니다.

 

 

0x8000에서 0x는 16진수를 표현하는 방식이기에 이는 계산하지 않고 뒤에 있는 8000을 2진수로 표현할 경우 1자리수당 4개의 bit값을 차지하게 됩니다.

 

 

즉, 8 = 1000 이되고 0 = 0000이기에 1000000000000000 이라는 숫자가 나오게 됩니다.

 

 

2. 0011 0101 0010 1011 1000 0000 0000 0000

1번에 있는 숫자를 4bit씩 끊어서 표현해 8자리로 만들면 다음과 같이 표현되게 됩니다.

 

 

이를 16진수로 표현하면 0x352B8000가 되고 우리가 얻고자하는 답을 얻을 수 있습니다. 이는 메모리에 있는 값을 레지스터에서 연산하기 위해 변환한 형식이고 이에 대한 값을 통해 컴퓨터는 연산을 할 수 있게 됩니다.

 

 

이를 반대로 하는 과정을 Disassemble이라고 표현하고 이는 R-format에서 설명드렸기에 생략하도록 하겠습니다.

 

 

그러면 해당 값들을 컴퓨터가 연산을 할때는 어떤식으로 진행할까요? 우리는 분명 Mips Instruction은 32bit의 값을 연산하는걸로 알고있는데요.

 

 

우리가 저장한 상수의 값은 16bit값으로 아직 16bit의 값이 부족하게 됩니다.

 

 

컴퓨터는 이때, extension이라는 것을 통해 0 또는 1로 상위비트들을 채우곤 합니다. extension을 하는 기준은 다음과 같습니다.

 

 

extension을 하는기준
1. addi와 같이 산술 연산의 경우 signed bit로 음수면 1, 양수면 0으로 채운다.
2. andi, ori와 같은 논리 연산의 경우 unsigned bit로 무조건 0으로 채운다.

 

이에 대한 예시 사진을 한번 보여드리도록 하겠습니다.

 

I-format 예시

andi 연산의 경우 논리연산이기에 0xffff의 상위비트인 16bit값을 전부 0으로 채우는 것을 확인할 수 있습니다.

 

 

상위 비트는 사진에서의 ? 이고 ?가 전부 0으로 채워진다는 사실을 알 수 있습니다.

 

 

그러면 만약 상수의 값에서 0x007d0900에 해당하는 값이 들어오게 되면 어떻게 될까요?

 

 

이는 상수의 범위인 2의 15승 -1 보다 큰 숫자가 들어오게 되는 경우인데요 이때는, 새로운 명령어인 lui를 사용해야합니다.

 

 

이에 대한 내용은 글이 너무 길어지니 다음 글에서 배워보도록 하겠습니다.

 

 

위에 내용들을 꼭 확인하시고 이해가 되지 않는 부분이 있으면 꼭 반복해서 보는 것을 추천드립니다.

 

 


 

지금까지 I-format이 무엇인가, I-format을 계산하는 방법에 대해 배워보았습니다.

 

 

I-format을 완벽히 알기 위해선 R-format과 마찬가지로 끊임없는 복습이 필수라고 생각합니다. 계속해서 I-format, R-format을 익히시고 모르신다면 글을 읽어보시길 바랍니다.

 

 

긴 글 읽어주셔서 감사드리고 다음 시간에는 lui에 대한 명령어를 배워보도록 하겠습니다.

LIST