sub

sub

RISC-V 어셈블리 참조

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

설명

sub는 한 레지스터의 값을 다른 레지스터의 값에서 뺀 뒤, 그 결과를 세 번째 레지스터에 저장합니다. 이 기능은 레지스터, 즉 프로세서 내부에 있는 각각 32비트 숫자 하나를 저장하는 작은 번호가 매겨진 저장 슬롯에서 작동합니다.

sub의 형식은 아래와 같으며, 결과는 rd = rs1 - rs2입니다. rd는 결과가 저장되는 대상 레지스터입니다. rs1과 rs2는 소스 레지스터입니다. 순서는 중요하며, 순서를 뒤바꾸는 것은 초보자들이 흔히 저지르는 실수입니다.

sub rd, rs1, rs2

다음 줄은 t0에서 t1을 뺀 값을 계산합니다. 왼쪽 소스(rs1)는 뺄 수 있는 값입니다.

sub rd, rs1, rs2

상수를 뺄 때 사용하는 subi 명령어는 없습니다. addi는 음수 상수를 허용하므로, 고정된 수를 뺀다는 것은 그 부호가 반전된 값을 더하는 것을 의미합니다. 다음 줄은 t0의 값을 1 줄여줍니다.

addi t0, t0, -1

RISC-V에는 항상 값 0을 유지하는 zero라는 특수 레지스터가 있습니다. zero에서 숫자를 빼면 부호가 반전되므로, 다음 줄은 t1의 음수를 t0에 저장합니다. neg 명령어는 이를 나타내는 약어입니다.

sub t0, zero, t1

RISC-V 매뉴얼에서는 sub를 rs1에서 rs2를 뺀 값으로 정의합니다. 오버플로는 무시되며, 결과값 중 XLEN 비트 이하의 저위 비트만 rd에 기록됩니다. 여기서 XLEN은 레지스터의 비트 폭을 의미하며, 이 예제에서는 32입니다. 또한 매뉴얼에는 레지스터 x0(이 시뮬레이터에서는 zero로 명명됨)이 모든 비트가 0인 값으로 고정되어 있다고 명시되어 있습니다.

이 예제에서 10에서 4를 빼면 t2에 6이 남습니다. 두 피연산자의 순서를 바꾸면 -6이 되며, 프로세서는 이를 자체적인 음수 처리 방식에 따라 저장합니다.

예시

li t0, 10
li t1, 4
sub t2, t0, t1   # t2 = 6