<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)
**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를 말한다.
<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>
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