add
lyszt.net은 add 및 기타 RISC-V 명령어를 더 자세히 다룹니다.
인코딩 형식
설명
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
하는주시
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4, Integer Computational Instructions, page 27.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4.2, Integer Register-Register Instructions, page 29.
