본문 바로가기

RISC-V/RISC-V 개념

[RISC-V] RV32I 레지스터

RV32I는 기본적으로 32개의 범용 레지스터와 1개의 PC(Program Counter)를 갖고 있습니다.

 

1. 범용 레지스터(x0 ~ x32)

 모든 레지스터는 32비트 크기입니다. 각 레지스터는 숫자 이름(x0 ~ x31)이 있지만, 프로그래밍 편의를 위해 역할에 따른 ABI(Application Binary Interface) Name을 주로 사용합니다.

 

레지스터 (Alias) 이름 설명
x0 (zero) Hard-wired Zero 항상 0입니다. 값을 쓰려고 해도 무시되며, 읽으면 항상 0입니다.
x1 (ra) Return Address 함수 호출 후 돌아갈 주소를 저장합니다.
x2 (sp) Stack Pointer 스택의 현재 위치를 가리킵니다.
x3 (gp) Global Pointer 전역 변수 영역을 가리킵니다.
x4 (tp) Thread Pointer 스레드 로컬 저장소를 가리킵니다.
x5~7, x28~31 Temporaries 임시 데이터를 저장합니다. (함수 호출 시 보존되지 않음)
x8 (s0/fp) Saved / Frame Pointer 보존 레지스터 혹은 프레임 포인터로 사용됩니다.
x9, x18~27 Saved Registers 함수 호출 전후로 값이 보존되어야 하는 데이터용입니다.
x10~11 (a0~1) Arguments / Return Value 함수의 매개변수 전달 및 결과값을 반환할 때 사용합니다.
x12~17 (a2~7) Arguments 함수의 추가 매개변수 전달용입니다.

 

2. 주요 특징

2.1 x0 (zero)의 존재

 - RISC-V의 가장 큰 득징 중 하나입니다. "0"이라는 상수가 하드웨어적으로 고정되어 있어 별도의 명령어를 줄일 수 있습니다. 

예를 들어, 레지스터 간 값 복사는 add x1, x2, x0( x1 = x2 + 0)과 같은 방식으로 처리됩니다.

 

2.2. PC가 범용 레지스터와 따로 존재

 -현재 실행중인 명령어의 주소를 가리키는 레지스터가 범용 레지스터에는 포함되지 않습니다. 제어 흐름 명령어를 통해서만 PC를 변경할 수 있게 제한하여 코드의 흐름을 명확하게 관리할 수 있습니다.

(ARM-32에서 PC 범용 레지스터를 공유하여 사용한다. 모든 명령어가 PC에 접근할 수 있기 때문에, 복잡한 예외 규칙을 추가해야한다.)

 

2.3 정렬

 - RV32I에서 명령어는 기본적으로 4바이트 경계에 정렬되어야 합니다. 

 

3. 요약

  RV32I는 범용레지스터(x0 ~ x31)과 PC를 포함해 총 32개의 레지스터를 가집니다.