neg
伪lyszt.net 更详细地介绍了 neg 和其他 RISC-V 指令。
描述
neg 会反转数字的符号:5 变成 -5,-5 变成 5。这个名称是 negate 的缩写。下面的形式将源寄存器 rs 的相反数放入目标寄存器 rd。
neg rd, rs
neg 是一条伪指令。汇编器会在处理器遇到伪指令之前,将一个可读的名称(伪指令)重写为一条或多条真实指令。neg 会变成下面的指令,它从 zero(始终保存 0 的特殊寄存器)中减去该数字。
sub rd, zero, rs
0 减去 x 等于 -x,因此这会产生相反数。RISC-V 通过这种方式复用减法和零寄存器,使其真实指令集保持精简。
负数的范围比正数范围多延伸一步。它达到约 -21 亿,而正数只到约 +21 亿。最负的数没有正数对应值,因此对它取相反数会回绕并得到同一个数。计算绝对值的代码必须处理这种情况。
RISC-V 手册将 sub 定义为从 rs1 中减去 rs2,并将这里称为 zero 的寄存器 x0 描述为硬连线到所有位均为 0 的值。从 x0 中减去一个值会得到它的相反数,这就是 neg 变成的形式。
该示例将 5 取反为 -5。与一个在该数已经为正时跳过 neg 的分支结合,它就产生了通常的两条指令的绝对值。
展开为
sub rd, zero, rs
汇编器会将此伪指令替换为上面列出的真实指令或指令。
示例
li t0, 5 neg t1, t0 # t1 = -5
简三的图詰
- [1]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.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.1, Programmers' Model for Base Integer ISA, page 23.
