1️⃣ RV32I 명령어

<aside> 💡

RV32I는 곱셈, 나눗셈 연산이 없는 정수형 명령어 세트

</aside>

RV32I 명령어는 R-Type, I-Type, S-Type, B-Type, U-Type, J-Type 6가지 형태로 만들 수 있음.

명령어는 4가지(R-Type, I-Type, S-Type, U-Type) 기본 형태와 2가지(B-Type, J-Type) 파생된 형태로 만들어짐(명령어 길이는 모두 32bit)

image.png

**opcode[6:0]**은 7-bit로 명령어가 어떤 operation을 해야 하는지 말해준다.

funct7[31:25], **funct3[14:12]**도 opcode처럼 명령어가 어떤 동작을 해야 하는지 말해주는 역할을 하는 명령어 field이다.

**rs1[19:15]**는 5-bit로 첫 번째 피연산자 레지스터를 명시하고, **rs2[24:20]**은 두 번째 피연산자 레지스터를 명시한다.

**rd[11:7]**은 목적어 레지스터를 명시하고 rs는 source operand register라서 r's'이고 rd는 destination register라서 r'd'이다.

imm은 명령어에 포함된 상수, immediate를 말한다.

image.png

<aside> 💡

ex) add x2, x3, x4 (R-type) // x2 = x3 + x4 → x3 + x4를 x2에 저장

opcode(7-bit) = 011_0011(2)

funct7(7-bit) = 000_0000(2)

funct3(3-bit) = 000(2)

rs1(5-bit) = 3 = 00011(2)

rs2(5-bit) = 4 = 01000(2)

rd(5-bit) = 2 = 00010(2)

앞서 정리한 2진수를 표와 같이 배열해 machine code를 정리해보면 아래와 같다.

binary = 000_0000_00100_00011_000_00010_011_0011

hex =  0000_0000_0100_0001_1000_0001_0011_0011(2) = 0x0041 8133

</aside>

image.png

AUIPC : Add upper immediate to PC

LUI : Load Upper Immediate

JAL : Jump And Link - $ra 저장 후 점프

JALR : Jump And Link Register - $rd 저장 후 $rs로 점프

BEQ : Branch if Equal

BNE : Branch Not Equal

BLT : Branch Less Than