neg

RISC-V neg 伪指令详解

汇编器伪指令

取负(二进制补码)伪指令,展开为 sub rd, x0, rs。计算 0 - rs 得到 rs 的相反数。常用于符号翻转、绝对值计算前置步骤和减法优化。

你写下的是
neg rd, rs
常见真实展开
sub rd, x0, rs

这条伪指令到底在帮你省什么

比 sub rd, x0, rs 更直观地表达取负语义。编译器常用 neg 实现一元减号运算符,优化 a - b 为 a + neg(b)。

neg 的核心作用是“取负,0-rs的补码”。它是汇编器层面的简写;调试、审计或阅读机器码时,应回到页面列出的真实展开指令和相关重定位语义来判断行为。

官方语义核对重点

官方汇编手册把 neg 作为汇编器层面的伪指令/别名处理,硬件执行的是展开后的真实指令序列。
真实语义以 SUB 等展开指令的 ISA 定义为准;本页不把 neg 当作独立硬件 opcode。

展开过程怎么理解

步骤 1
汇编器展开为 sub rd, x0, rs。
步骤 2
SUB 计算 x0(0) - rs,结果即 rs 的二进制补码取负。

在 objdump / 反汇编里可能看到什么

sub rd, x0, rs 在反汇编中显示为 neg rd, rs。

官方依据与阅读顺序

本页把伪指令当作汇编器层面的别名或宏来解释:先看它会展开成哪些真实指令,再回到官方 ISA 手册理解真实指令的行为。涉及 ABI、重定位或链接器松弛时,以 psABI 文档为准。

什么时候优先想到它

取反数值(一元减号运算符 -x)
实现 C 语言的取负操作
绝对值计算(abs):先用 srai 取符号位,再 neg
减法变加法优化中作为中间步骤

容易混淆 / 常见误区

对最小负值取反会溢出——例如 RV32 下 neg(0x80000000) = 0x80000000(不自陷,结果等于自身)
取反结果可用于溢出检测——配合分支指令检查是否超出表示范围
neg 作用于整个 XLEN 位宽,RV64 上注意高 32 位

常见问题

neg 是真实 RISC-V 指令吗?

neg 是汇编器伪指令或别名,不是单独硬件 opcode。页面中的“常见真实展开”列出官方展开,真实行为由展开后的 ISA 指令决定。

使用 neg 时最容易误解什么?

对最小负值取反会溢出——例如 RV32 下 neg(0x80000000) = 0x80000000(不自陷,结果等于自身)