Interface between Hardware and Software
RISC-V에서는 Register에 Name을 달아 Usage을 구분한다.
Registers 번호 - Name : Usage 순서이다.
x0 - Zero : Hard-wored zerox1 - ra : Return adressx2 - sp : Stack pointerx3 - gp : Global pointerx4 - tp : Thread pointerx5~x7 - t0~t2 : Temporariesx8 -s0/fp : Saved register/Frame pointerx9 - s1 : Saved registerx10~x11 - a0~a1 : Function arguments/Return valuesx12~x17 - a2~a7 : Function argumentsx18~x27 - s2~s11 : Saved registersx28~31 - t3~t6 : Temporaries데이터의 최소 단위는 bits로 0과1인 2진수로 표현한다.
Bit strings은 아래 처럼 표현된다.


즉시 값은 레지스터나 메모리에서 값을 저장해서 사용하는 것이 아닌 상수로써 사용된다. 명령어의 일부분에 2진수로 저장 되어 사용된다.

register 안에 있는 값의 경우 명령어에 포함되어있는 레지스터의 주소를 통해 값을 가져와 사용한다.

memory 안에 있는 주소 값의 경우 즉시 값과 레지스터로 메모리 주소값을 통해 메모리에 접근한다.

현재 PC 값에 imm을 더해서 주소값을 사용한다.
산술 피연산자
- 3개의 operands를 가진다.
add a, b ,c // a <- b + c
sub a, b, c // a <- b - c
연산을 수행한 뒤에 목적지register인 a에 값을 넣고 있다.
Register 피연산자
- 산술 명령어는 register 피연산자를 가진다.
- RISC-V는 32 registerfile을 가진다. x0~ x31
C code
// f in x19
// g in x20
// h in x21
// i in x22
// j in x23
f = (g + h) - (i + j);
Compiled RISC_V code
add x5 x20 x21
add x6 x22 x23
sub x19 x5 x6
명령어에 지정된 상수 데이터
addi x22, x22, 4 //x22에서 외쪽으로 2번 shift한 후 x22에 저장한다.
12bits 이하의 작은 상수들은 흔하게 사용된다. 이러한 작은 상수들은 레제스터의 모든 공간을 요구하지 않기때문에 immediate 값을 사용한다.
→immediate값은 load 명령어가 필요없다.
상수는 최대 32bits로 표현된다.
immeditate 값 중에는 12bits 값도 있는데? → “Upper Immediate” 필요!
lui rd, contant
즉시 값을 상위 비트로밀고 0으로 채운다.
Memory에서 Register로 가져오는 명령어를 Load라고 한다.
Load instructions have thress parts
ld dst, off(base)
Register에서 Memory로 저장하는 명령어를 Store라고 한다.
load data의 반대되는 절차를 거친다.
sd src, off(base)
컴구 B+