기계어는 컴퓨터 하드웨어가 직접 이해하고 실행할 수 있는 명령어의 이진수로 나타낸 것을 말한다.
RISC-V에서는 모든 명령어가 32비트로 표현된다
명령어의 형식으로는 4가지 타입이 있다
|
구분
|
명령어 종류
|
역할
|
예시
|
|
R-Type
|
Register 타입
|
레지스터끼리 연산
|
add, sub, and, or
|
|
I-Type
|
Immediate 타입
|
즉값(상수)과 연산 또는 load
|
addi, lw, jalr
|
|
S/B-Type
|
Store / Branch 타입
|
메모리 저장, 조건 분기
|
sw, sh, beq, bne
|
|
U/J-Type
|
Upper / Jump 타입
|
상위비트 로드, 점프 명령
|
lui, jal
|
R-Type
R 타입은 레지스터간 연산을 수행하는 명령어 형식이다.
두 개의 레지스터의 값을 읽어서 연산 결과를 다른 레지스터에 저장한다.

|
비트 구간
|
필드명
|
비트 수
|
설명
|
|
31–25
|
funct7
|
7 bits
|
연산 종류를 구분하는 추가 정보
|
|
24–20
|
rs2
|
5 bits
|
두 번째 피연산자(source register 2)
|
|
19–15
|
rs1
|
5 bits
|
첫 번째 피연산자(source register 1)
|
|
14–12
|
funct3
|
3 bits
|
연산 종류를 세분화하는 코드
|
|
11–7
|
rd
|
5 bits
|
연산 결과를 저장할 목적지(destination register)
|
|
6–0
|
opcode
|
7 bits
|
명령어의 대분류 (예: ALU 연산, 메모리, 점프 등)
|
opcode에 따라서 어떤 타입의 어떤 연산을 수행할지 결정한다.
func3은 같은 opcode내에서 연산의 종류를 결정한다.
func7은 ALU 안에서 add/sub, srl,sra 등 미세한 차이를 구분한다.
(add와 sub은 opcode와 func3이 같다.)
opcode에서 func3을 거쳐 func7로 갈수록 더 가지가 늘어나는 것처럼 세분화된다.
I-Type
I 타입은 레지스터 하나와 즉시값을 이용하는 연산 형식이다
혹은 메모리에서 값을 읽어올 때도 I 타입 구조를 사용한다.
|
비트 구간
|
필드명
|
비트 수
|
설명
|
|
31–20
|
imm
|
12 bits
|
즉시값(상수, signed)
|
|
19–15
|
rs1
|
5 bits
|
첫 번째 피연산자(source register 1)
|
|
14–12
|
funct3
|
3 bits
|
연산 종류를 세분화하는 코드
|
|
11–7
|
rd
|
5 bits
|
연산 결과를 저장할 목적지(destination register)
|
|
6–0
|
opcode
|
7 bits
|
명령어의 대분류 (예: ALU 연산, 메모리, 점프 등)
|
대표적으로 addi, lw, jal 가 있다.
즉시값은 부호를 가진다.
12비트 즉시값은 2의 보수 표현을 사용해서 나타낸다.
+12 → 0000 0000 1100 -4 → 1111 1111 0010
S-Type
즉시값이 두 부분으로 쪼개져서 인코딩된다.
이 즉시값은 위에서와 같이 12비트의 2의 보수 값으로 나타낸다.
|
비트 구간
|
필드명
|
비트 수
|
설명
|
|
31–25
|
imm[11:5]
|
12 bits
|
즉시값 상위 7비트(상수, signed)
|
|
24:20
|
rs2
|
5 bits
|
저장할 데이터가 들어 있는 레지스터
|
|
19–15
|
rs1
|
5 bits
|
메모리의 주소 기준 레지스터
|
|
14–12
|
funct3
|
3 bits
|
저장 크기 구분 (000=byte, 001=half, 010=word)
|
|
11–7
|
imm[4:0]
|
5 bits
|
즉시값 하위 5비트
|
|
6–0
|
opcode
|
7 bits
|
Store 명령
|
대표적으로 sw, sh, sb가 있다.
각각 직관적으로 word, hald, biit다
B-Type
B 타입은 S 타입이랑 구조가 비슷하다.
주소 계산은 현재의 프로그램 카운터에서 즉시값을 offset로 삼아서 이루어진다.
|
비트 구간
|
필드명
|
비트 수
|
설명
|
|
31–20
|
imm[12,10:5,4:1,11]
|
12 bits
|
분기 오프셋 (2의 보수, 짝수 주소 단위)
|
|
19-15
|
rs2
|
5 bits
|
두 번째 비교 대상
|
|
14-10
|
rs1
|
5 bits
|
첫 번째 비교 대상
|
|
9-7
|
funct3
|
3 bits
|
분기 조건 (==, !=, <, >= 등)
|
|
6–0
|
opcode
|
7 bits
|
Branch 명령
|
branch하는 명령어들은 모두 여기에 속한다.
(beq, bne, blt, bge, …)
U-Type
즉시값의 크기가 20비트 이상인 명령어 형식이다
|
비트 구간
|
필드
|
비트수
|
설명
|
|
31–12
|
imm[31:12]
|
20
|
상위 20비트 상수 (하위 12비트는 0으로 자동 채워짐)
|
|
11-7
|
rd
|
5
|
즉값을 저장할 레지스터
|
|
6-0
|
opcode
|
7
|
U-Type 명령어 (0110111=LUI, 0010111=AUIPC)
|
J-Type
J 타입은 프로그램 카운터를 상대적으로 변경해서 점프한다.
jal이 여기에 속한다.
|
비트 구간
|
필드
|
비트 수
|
설명
|
|
31-12
|
imm[20,10:1,11,19:12]
|
20
|
점프 오프셋 (2의 보수, instruction 단위)
|
|
11-7
|
rd
|
5
|
점프 전의 다음 주소(PC+4)를 저장할 레지스터
|
|
6-0
|
opcode
|
7
|
1101111 (JAL 명령어)
|

'지식 > 컴퓨터아키텍쳐' 카테고리의 다른 글
| Arithmetic for Computers(2) (0) | 2025.10.16 |
|---|---|
| Arithmetic for Computers(1) (0) | 2025.10.16 |
| Instructions(3) (0) | 2025.10.07 |
| Instruction(2) (0) | 2025.10.07 |
| Instructions(1) (0) | 2025.10.07 |