add

add

RISC-V 어셈블리 참조

lyszt.net은 add 및 기타 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

설명

add는 두 레지스터의 값을 더하고 그 결과를 세 번째 레지스터에 저장합니다. 레지스터는 프로세서 내부에 있는 작은 슬롯으로, 하나의 32비트 숫자를 담습니다. RISC-V는 32개의 레지스터를 제공합니다. 비트는 0 또는 1 하나이며, 32비트는 0부터 약 40억까지의 정수를 포괄합니다. 산술 연산은 레지스터 사이에서 이루어지며 메모리를 직접 건드리지 않습니다.

add는 아래와 같은 형식을 가지며, 결과는 rd = rs1 + rs2입니다. rd는 목적지 레지스터로, 답이 들어갑니다. rs1과 rs2는 소스 레지스터이며, 그 값은 그대로 유지됩니다.

add rd, rs1, rs2

목적지는 소스로도 사용할 수 있습니다. 아래 줄은 t1을 t0에 더하고 결과를 다시 t0에 넣습니다. 루프에서의 누적 합계는 이 형식을 사용합니다.

add t0, t0, t1

레지스터는 최대 32비트를 담습니다. 합계가 레지스터가 담을 수 있는 가장 큰 값을 초과하면, 결과는 작은 숫자로 되돌아갑니다. 마치 24시간 시계가 23:59에서 00:00으로 돌아가는 것과 같습니다. 이것이 오버플로이며, RISC-V는 이것이 발생해도 경고를 주지 않습니다.

RISC-V 매뉴얼에는 정수 연산 명령이 산술 예외를 발생시키지 않으며, 기본 명령어 집합에는 오버플로 검사가 포함되지 않는다고 명시되어 있습니다. 분기가 낮은 비용으로 그 역할을 처리하기 때문입니다. 부호 없는 덧셈의 경우, add 뒤의 분기 하나로 충분합니다. 아래 두 줄에서 합계가 피연산자보다 작을 때 분기가 overflow 레이블로 점프하며, 이는 합계가 되돌아간 경우에만 발생합니다.

add t0, t1, t2
bltu t0, t1, overflow

예제에서 처음 두 줄은 li (load immediate)를 사용하여 상수 3과 4를 t0와 t1에 넣습니다. 그런 다음 add 줄이 7을 t2에 남깁니다.

예시

li t0, 3
li t1, 4
add t2, t0, t1   # t2 = 7