beqz

RISC-V beqz 伪指令详解

汇编器伪指令

等于零则分支伪指令,展开为 beq rs, x0, offset。当寄存器值为零时跳转,常用于空指针检查、循环终止和标志位测试。

你写下的是
beqz rs, offset
常见真实展开
beq rs, x0, offset

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

比 beq rs, x0, offset 更自然地表达「如果为零则跳转」的控制流。汇编器将其作为别名简化代码阅读和编写。

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

官方语义核对重点

官方汇编手册把 beqz 作为汇编器层面的伪指令/别名处理,硬件执行的是展开后的真实指令序列。
真实语义以 BEQ 等展开指令的 ISA 定义为准;本页不把 beqz 当作独立硬件 opcode。
分支比较的有符号/无符号属性继承自 BEQ/BNE/BLT/BGE/BLTU/BGEU;零比较只是把 x0 作为其中一个操作数。

展开过程怎么理解

步骤 1
汇编器展开为 beq rs, x0, offset。
步骤 2
BEQ 比较 rs 与 x0(永远为 0),若相等则 PC ← PC + offset × 2。

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

beq rs, x0, offset 在反汇编中显示为 beqz rs, offset。

官方依据与阅读顺序

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

什么时候优先想到它

空指针检查(指针 == NULL)
循环终止条件(计数器归零时退出)
malloc/realloc 返回值有效性检测
引用计数归零时的资源释放分支

容易混淆 / 常见误区

分支范围仅为 ±4 KiB(B-type 立即数限制)——超远分支需 beqz + j 组合
beqz 检查的是整个寄存器宽度(XLEN)是否为零,不仅是低 32 位
只是一种汇编器别名;调试机器码时应以 beq rs, x0, offset 为准

常见问题

beqz 是真实 RISC-V 指令吗?

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

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

分支范围仅为 ±4 KiB(B-type 立即数限制)——超远分支需 beqz + j 组合