seqz

RISC-V seqz 伪指令详解

汇编器伪指令

等于零则置位伪指令,展开为 sltiu rd, rs, 1。若 rs == 0 则 rd = 1,否则 rd = 0。rd = (rs == 0) ? 1 : 0。常用于空指针判断和布尔化。

你写下的是
seqz rd, rs
常见真实展开
sltiu rd, rs, 1

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

直接表达「等于零」的比较逻辑——利用 SLTIU(无符号小于立即数)语义:rs < 1 当且仅当 rs == 0。结果是指针/值的布尔化。

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

官方语义核对重点

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

展开过程怎么理解

步骤 1
汇编器展开为 sltiu rd, rs, 1。
步骤 2
SLTIU 执行无符号比较:若 rs < 1(即 rs == 0),则 rd = 1;否则 rd = 0。

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

sltiu rd, rs, 1 在反汇编中显示为 seqz rd, rs。注意 rs == 0 时 rd=1,rs != 0 时 rd=0。

官方依据与阅读顺序

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

什么时候优先想到它

检查指针是否为 NULL
将任意值布尔化(C 的 bool 转换,但逻辑相反)
条件赋值的比较部分(三元运算符)
检测计算结果是否为零

容易混淆 / 常见误区

seqz 的语义是「为零则 1」——与 C 语言的 bool 转换相反(C 中 0→false, 非0→true),需配合 not 或 xori 反转
SLTIU 是无符号比较——但 seqz 仅比较「小于 1」,对负值(作为大无符号数)也会返回 0,语义正确
在对指针做空判断时,确保指针未被符号扩展污染(RV64 注意高 32 位)

常见问题

seqz 是真实 RISC-V 指令吗?

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

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

seqz 的语义是「为零则 1」——与 C 语言的 bool 转换相反(C 中 0→false, 非0→true),需配合 not 或 xori 反转