not
RISC-V not 伪指令详解
汇编器伪指令按位取反(NOT)伪指令,展开为 xori rd, rs, -1。将寄存器 rs 的每一位取反(0变1,1变0)后存入 rd。常用于位掩码生成、位清除和逻辑运算。
你写下的是
not rd, rs
常见真实展开
xori rd, rs, -1
这条伪指令到底在帮你省什么
比 xori rd, rs, -1 更自然可读。利用 XOR 与全 1 的特性——任何位 XOR 1 都会翻转——简洁地实现 NOT 操作。
not 的核心作用是“按位取反所有位”。它是汇编器层面的简写;调试、审计或阅读机器码时,应回到页面列出的真实展开指令和相关重定位语义来判断行为。
官方语义核对重点
官方汇编手册把 not 作为汇编器层面的伪指令/别名处理,硬件执行的是展开后的真实指令序列。
真实语义以 XORI 等展开指令的 ISA 定义为准;本页不把 not 当作独立硬件 opcode。
展开过程怎么理解
步骤 1
汇编器展开为 xori rd, rs, -1。
步骤 2
-1 的 12 位编码为 0xFFF,符号扩展后为 64 位全 1(0xFFFFFFFFFFFFFFFF)。
步骤 3
XORI 将 rs 每一位与 1 异或,实现按位翻转。
在 objdump / 反汇编里可能看到什么
xori rd, rs, -1 在反汇编中显示为 not rd, rs。-1 在 12 位有符号立即数中即 0xFFF。
官方依据与阅读顺序
本页把伪指令当作汇编器层面的别名或宏来解释:先看它会展开成哪些真实指令,再回到官方 ISA 手册理解真实指令的行为。涉及 ABI、重定位或链接器松弛时,以 psABI 文档为准。
什么时候优先想到它
生成位掩码的补码(mask & ~bits)
实现 C 语言按位取反运算符 ~
清除寄存器中的指定位
计算 ~0 即全 1 值(not rd, zero)
容易混淆 / 常见误区
NOT 作用于整个寄存器位宽(RV32=32bit, RV64=64bit),注意与预期数据宽度一致
XORI 的 -1 会作为 12 位立即数符号扩展成全 1,这是该伪指令成立的关键
not 生成的是逐位取反结果;如果只想翻转低几位,需要先构造掩码再 xor
常见问题
not 是真实 RISC-V 指令吗?
not 是汇编器伪指令或别名,不是单独硬件 opcode。页面中的“常见真实展开”列出官方展开,真实行为由展开后的 ISA 指令决定。
使用 not 时最容易误解什么?
NOT 作用于整个寄存器位宽(RV32=32bit, RV64=64bit),注意与预期数据宽度一致