개발/컴퓨터구조

R-format 이란? (+ 계산방법까지 전부 공개합니다.)

IT의 타이탄 2023. 9. 25. 11:21
SMALL

혹시 이 글에 들어오시기 전에 이런 고민을 가지고 계셨나요?

 

 

1. 대학교에서 R-format에 대해 배웠는데 어떻게 하는지 잘모르겠네

 

2. R-format을 좀 쉽게 설명해주는데 어디없을까? 

 

 

그렇다면 잘 들어오셨습니다. 제가 이번 글을 통해 R-format에 대해 5학년 민지도 이해할 수 있게끔 쉽게 설명할 예정입니다.

 

 

만약 이번 R-format에 대한 개념을 아예 모르고, Mips Instruction에 대해서도 제대로 모른다면 아래의 글을 읽고 오시는 것을 추천드립니다.

 

👉 Mips Instruction에 대한 총정리 1편

 

👉 Mips Instruction에 대한 총정리 2편

 

👉 Mips Instruction에 대한 총정리 3편

 

 

 

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

 

 

[목차]

 

1. R-format 이란?

 

2.  R-format을 계산하는 방법

 

 

목차를 보시고 여러분에게 필요한 정보만 가져가시길 바라며, 글을 작성하도록 하겠습니다.

 

 

R-format에 대해 A부터 Z까지 설명하겠습니다.

1. R-format이란?

R-format에 대해 배우기 위해선 먼저 우리가 컴퓨터에게 연산을 요청하는 과정을 알아야 합니다.

 

 

우리가 C언어, java, python과 같은 컴퓨터언어로 컴퓨터에게 연산을 요청하면 컴퓨터는 바로 실행하지 못합니다.

 

 

왜냐하면 컴퓨터는 2진수로 표현되는 것들만 연산처리가 가능하기 때문입니다.

 

 

이런 이유로 컴퓨터 안에있는 compiler와 assembler라는 것들을 통해 우리의 명령어를 컴퓨터가 연산을 할 수 있는 2진수로 바뀌게 되는것입니다.

 

 

우리가 입력한 값 (C언어, 파이썬, 자바 등)
=> Mips Instruction (컴파일러를 통해 메모리에 저장됨)
=> 2진수 표현 (어셈블러를 통해 레지스터에 저장된 후 연산 실행)

 

 

이를 그림과 같이 표현하면 다음과 같습니다.

 

 

R-format 연산 과정

 

좀더 쉽게 이에 대한 과정들을 그림으로 표현하면 다음과 같습니다.

 

 

R-format

 

우리가 입력한 코드가 Input값이 되는 것이고 이를 컴파일러를 통해 Memory에 저장하게 됩니다.

 

 

메모리에는 text segment와 data segment 2개로 저장되곤 하는데요. 이에 대한 값을 표현하는 방식이 바로 Mips Instruction입니다.

 

 

예를 들어, add $2, $4, $2 이런 것들이 바로 Mips Instruction이며, 메모리에 저장되는 것입니다.

 

 

하지만 이것들을 바로 연산하기에는 컴퓨터는 아직 뭔소리를 하는지 모르는 것입니다. 마치 영어만 사용하는 외국인에게 다음과 같이 명령하는 것입니다.

 

 

4번째에 있는 레지스터값과 2번째에 있는 레지스터값을 더해서 2번째에 있는 레지스터값에 담아줘

 

 

한국말로 하면 외국인이 이해할까요? 모릅니다. 영어로 해줘야합니다. 마찬가지로 컴퓨터도 숫자로 표현을 해줘야 연산을 할 수 있는것입니다.

 

 

이때, Mips Instruction을 컴퓨터가 연산할 수 있는 방법으로 바꿔주는 것이 바로 R-format인 것입니다.

 

 

R-format으로 바꿔야만이 컴퓨터가 연산할 수 있게 되는 것이고 이를 표현하는 방식은 다음과 같습니다.

 

R-format 표현방식

 

여기서 기억해야하는 것은 2가지입니다.

 

 

1. 각 필드가 몇 bit씩 담고 있는지?

 

2. 필드의 순서방식

 

 

각 필드들은 6, 5, 5, 5, 5, 6비트로 총 32비트의 값을 가지고 있습니다. 32bit값을 가지고 있는 이유는 레지스터가 32bit값을 저장할 수 있기 때문입니다.

 

 

각 필드에 대한 설명을 하자면 다음과 같습니다.

 

 

op : 가장 아래에 있는 funct와 연관되어 있으며, 명령의 방식입니다. ex) add
rs : 1번째 소스 목적어 (source operand)
rt : 2번째 소스 목적어 (source operand)
rd : 목적지 목적어 (destination operand)
shamt : 쉬프트 연산자 (sll, srl, sra가 아니면 대부분 0)
funct : op와 연관되어있으며 명령의 방식입니다. ex) add

 

op는 funct와 함께 봐야하며, 이 2개의 값에 따라 명령어들이 바뀌게 됩니다.

 

 

여기서 주목해야하는 것은 Mips Instruction에서는 명령어 뒤에 첫번째로 목적지 목적어가 왔지만, R-format에서는 4번째에 위치한다는 것입니다.

 

 

이를 예를 들어 표현해보도록 하겠습니다.

 

 

Mips instruction : add $t0, $s1, $s2

R-format : add $s1, $s2, $t0, shamt, add

 

 

그러면 R-format으로 바꾼 값은 무엇일까요? 이에 대한 계산 방식은 어떻게 해야할까요? 그 답은 아래에 있습니다.

 

 

2. R-format 계산 방법

R-format으로 계산하는 방법은 Mips instruction의 값을 전부 숫자로 바꾸면 되는 것입니다.

 

 

add의 경우 op : 0 / funct : 32값을 가지고 있습니다. 이는 Mips opcode map을 참조하면 확인할 수 있습니다.

 

 

$s1의 경우 17번의 레지스터의 별명이며, $s2의 경우 18번 레지스터의 별명입니다. $t0은 8번의 레지스터 별명이고 add는 이동연산자가 없기 때문에 0이 됩니다.

 

 

전부 숫자로 바꿨다면 이를 우리가 아까 기억한 bit에 맞춰서 표현하면 됩니다.

 

 

답은 02324020이 나오게 되고 이를 어셈블 했다고 표현합니다.

 

 

그렇다면 반대의 연산도 가능할까요? 물론 가능합니다. 이를 disassemble이라 표현합니다. 그렇다면 우리가 한번 예제로 풀어볼까요?

 

 

- 0x016C6820을 Disassemble하시오

 

 

이에 대한 답은 댓글을 남겨주시면 제가 비밀글로 달아드리도록 하겠습니다. 꼭 스스로 한번 해보시길 바랍니다.

 

 


 

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

 

 

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

 

 

긴 글 읽어주셔서 감사드리고 다음에는 I-format에 대해 배워보도록 하겠습니다.

LIST