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。左侧的源寄存器是被减的值。

sub rd, rs1, rs2

没有专门用于减去常量的 subi 指令。addi 指令支持负常量,因此减去一个固定数值实际上等同于将其负数相加。下一行将 t0 的值减一。

addi t0, t0, -1

RISC-V 有一个名为 zero 的特殊寄存器,其值始终为 0。从 zero 中减去一个数会反转其符号,因此下一行将 t1 的负值存入 t0。neg 指令是此操作的简写形式。

sub t0, zero, t1

RISC-V 手册将 sub 定义为从 rs1 中减去 rs2。溢出将被忽略,且仅将结果的低 XLEN 位写入 rd,其中 XLEN 表示寄存器宽度(以位为单位),此处为 32 位。 手册还列出了寄存器 x0(该模拟器将其命名为 zero),其值被硬编码为全零。

在该示例中,10 减去 4 后,t2 中剩余 6。交换两个源值后结果为 -6,处理器会将其存储在其自身的负数表示方案中。

示例

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