slt

slt

RISC-V 어셈블리 참조

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

설명

slt는 두 수를 비교하여 결과를 1 또는 0으로 저장합니다. 이 이름은 set less than의 약자입니다. 아래 형식은 rs1이 rs2보다 작은지 검사합니다. 검사가 성공하면 명령어는 목적지 레지스터 rd에 1을 씁니다. 실패하면 0을 씁니다.

slt rd, rs1, rs2

비교는 두 가지 방식으로 사용할 수 있습니다. 분기 명령어는 그 결과에 따라 점프합니다. 또는 예/아니오 답을 숫자로 저장하여, 참이면 1, 거짓이면 0으로 두고 나중에 사용할 수 있습니다. slt가 그 저장을 수행합니다. 어셈블리는 참과 거짓을 저장된 1 또는 0으로 표현하며, 그 값은 다른 수와 마찬가지로 더하거나, 마스킹하거나, 결합할 수 있습니다.

비교는 값을 부호 있는 값으로 취급하므로 음수일 수 있고, -1은 0보다 작은 것으로 간주됩니다. 관련 명령어 sltu는 값을 부호 없는 값으로 취급하는데, 이는 큰 값과 음수처럼 보이는 값에 대해 답을 바꿉니다.

RISC-V 매뉴얼은 slt와 sltu를 rs1이 rs2보다 작으면 rd에 1을, 그렇지 않으면 0을 쓰는 부호 있는 비교와 부호 없는 비교로 설명합니다. 또한 일반 부호 있는 덧셈의 오버플로 검사에서 slt를 사용합니다. 덧셈 후, 아래 두 번째 줄은 두 번째 피연산자가 음수인지 기록하고, 세 번째 줄은 합이 첫 번째 피연산자보다 작은지 기록하며, 마지막 줄은 두 답이 다를 때 점프합니다.

add t0, t1, t2
slti t3, t2, 0
slt t4, t0, t1
bne t3, t4, overflow

그 근거는 합이 한 피연산자보다 작아야 하는 경우는 다른 피연산자가 음수일 때뿐이라는 것입니다.

set greater than 명령어는 존재하지 않습니다. a가 b보다 큰지 검사하려면 피연산자를 바꾸어 b가 a보다 작은지 물으면 됩니다. 예제는 3과 9를 비교합니다. 3이 9보다 작으므로 t2는 1로 설정됩니다.

예시

li t0, 3
li t1, 9
slt t2, t0, t1   # t2 = 1