neg伪

neg

伪
RISC-V 汇编 参考

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