addi

addi

RISC-V 어셈블리 참조

lyszt.net은 addi 및 기타 RISC-V 명령어를 더 자세히 다룹니다.

인코딩 형식

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

설명

addi는 레지스터에 상수를 더합니다. 이름은 add immediate를 의미합니다. 즉시값(immediate)은 레지스터에서 읽는 것이 아니라 명령어 자체에 쓰여진 상수 값입니다. 프로그램을 작성할 때 숫자 중 하나가 고정되어 있는 경우, 예를 들어 카운터에 1을 더할 때 사용합니다.

addi의 형식은 아래와 같습니다. 소스 레지스터 rs1의 값을 읽고, 상수 imm을 더한 뒤, 결과를 목적지 레지스터 rd에 씁니다.

addi rd, rs1, imm

다음 줄은 t0를 읽고, 1을 더한 뒤, 결과를 다시 쓰므로 t0 = t0 + 1이 됩니다.

addi t0, t0, 1

상수는 12비트를 차지하며 부호가 있으므로 범위는 -2048에서 2047입니다. 어셈블러는 더 큰 값을 거부합니다. 더 큰 상수의 경우 먼저 li로 레지스터에 로드하세요. 음수 상수는 addi가 뺄셈도 하게 만드는데, 이것이 RISC-V에 별도의 subtract-immediate 명령어가 없는 이유입니다. 다음 줄은 카운트다운합니다.

addi t0, t0, -1

RISC-V 매뉴얼은 이 상수를 부호 확장된 12비트 즉시값이라고 부릅니다. 산술 오버플로는 무시된다고 명시하므로, 결과는 하위 XLEN 비트만 유지합니다. 여기서 XLEN은 레지스터 폭(비트)이며 여기서는 32입니다. 상수의 부호를 알 때, 덧셈 후 하나의 분기가 부호 있는 오버플로를 확인합니다. 아래 두 줄은 양수 상수를 더하는 일반적인 경우를 처리합니다.

addi t0, t1, +imm
blt t0, t1, overflow

프로그램은 addi를 카운터, 포인터를 다음 항목으로 이동, 스택에 공간을 예약하는 데 사용합니다. 예제는 카운터를 진행하기 위해 1을 더하고, 작업 메모리 16바이트를 예약하기 위해 -16을 더합니다. 이것이 작업 공간이 필요한 함수가 보통 시작하는 방식입니다.

예시

addi t0, t0, 1     # t0++
addi sp, sp, -16   # reserve 16 bytes of stack