zext-h

RISC-V zext-h 伪指令详解

汇编器伪指令

零扩展半字伪指令,保留低 16 位并清零高位。无 Zbb 时可用左移再逻辑右移序列;有 Zbb 时可用单指令形式。

你写下的是
zext.h rd, rs
常见真实展开
# Zbb path zext.h rd, rs # or without Zbb: slli rd, rs, XLEN-16 srli rd, rd, XLEN-16

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

半字数据常需要转成无符号整数;zext.h 明确表达低 16 位零扩展,并让工具链按 Zbb 可用性选择实现。

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

官方语义核对重点

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

可用性与扩展条件

基础条件
  • RV32I/RV64I 可用移位序列表达
单指令/标准写法条件
  • Zbb 提供真实 ZEXT.H 指令
回退/边界
无 Zbb 时使用 SLLI 后接 SRLI,移位量按 XLEN 选择。
备注
  • 零扩展低 16 位,不是符号扩展。

工具链与链接器边界

有 Zbb 时 zext.h 可作为真实单指令出现;无 Zbb 时汇编器可用 SLLI/SRLI 序列表达同一零扩展意图。
反汇编显示取决于目标扩展和工具偏好,不应把单指令路径当作基础 ISA 保证。

展开过程怎么理解

步骤 1
Zbb 路径:真实 ZEXT.H 指令直接把低 16 位零扩展到 rd。
步骤 2
无 Zbb 路径第 1 步:SLLI 将低 16 位移到寄存器高端,丢弃原高位。
步骤 3
无 Zbb 路径第 2 步:SRLI 逻辑右移回原位置,用 0 填充高位。

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

有 Zbb 时反汇编可能显示真实 zext.h 指令;无 Zbb 的移位序列也可能按伪指令意图理解。

官方依据与阅读顺序

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

什么时候优先想到它

把低 16 位解释为无符号半字
处理 UTF-16、半字数组或外设 16 位寄存器值
在 RV32/RV64 上统一表达半字零扩展意图

容易混淆 / 常见误区

可用序列取决于是否支持 Zbb
这是零扩展,不是符号扩展
移位序列中的 XLEN 在 RV32/RV64 上不同

常见问题

zext-h 是真实 RISC-V 指令吗?

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

使用 zext-h 时最容易误解什么?

可用序列取决于是否支持 Zbb