首页/指令库/零扩展半字
ZEXT.H

RISC-V ZEXT.H 指令详解

指令手册R-type

半字零扩展

指令语法

zext.h rd, rs

rd、rs 选择 x0–x31;只有一个整数源,没有立即数,编码中的 rs2 固定为 00000。

funct7=0000100、funct3=100;RV32 opcode=0110011,RV64 opcode=0111011。

读取执行前 rs[15:0],高于 bit15 的所有位填零,再按 XLEN 写入 rd;rd=x0 时丢弃写回。

适用于 RV32/RV64 的 Zbb 或 Zbkb;Zbkb 的 RV32 PACK / RV64 PACKW 在 rs2=x0 时就是该指令。

不访问数据内存;rd=rs 合法,使用写回之前的源值。

ZbbZbkb位操作整数运算

指令行为说明

将 rs 的低 16 位零扩展到 XLEN。Zbb 与 Zbkb 都提供该指令;RV32 使用 PACK 的 rs2=x0 编码,RV64 使用 PACKW 的 rs2=x0 编码。

ZEXT.H 指令解析与执行动画

从机器码字段解析开始,依次展示操作数读取、该指令专属语义计算和 ISA 可见状态更新。

rd
rs
zext.h
,
执行环境

本例假定所选 XLEN 下 Zbb 或 Zbkb 已启用,使用下列固定寄存器初值和 PC=0x2000;取指成功且无异步中断。步骤是教学分解。

t1(x6)
0x00000014
31..25
24..20
19..15
14..12
11..7
6..0
0000100
funct7
00000
rs2
00110
rs1
100
funct3
00101
rd
0110011
opcode
执行数据路径
instruction
0x080342B3
opcode
0110011 -> OP
funct3
100 -> ZEXT.H
funct7 / rs2
0000100 / 00000 -> ZEXT.H selector
rd / rs
t0(x5) / t1(x6)=0x00000014
16-bit zero extension
尚未计算
x5
t0(x5) = 0x00003001; pc = 0x00002000
当前步骤

概念步骤:拿到 32-bit 指令编码

机器码按当前指令格式切成字段,动画从 encoding/decode 开始。

encoding: 0x080342B3
syntax : zext.h t0(x5), t1(x6)
结果: 尚未计算
当前架构状态
t0(x5) = 0x00003001; pc = 0x00002000

该动画展示 ISA 可见的解码和状态变化,不表示任何特定 CPU 的流水线、缓存、预测或时序实现。

快速理解与检索要点

将 rs 的低 16 位零扩展到 XLEN。Zbb 与 Zbkb 都提供该指令;RV32 使用 PACK 的 rs2=x0 编码,RV64 使用 PACKW 的 rs2=x0 编码。

只读取 rs1 的低 16 位并零扩展到 XLEN。
它不同于 SEXT.H;bit 15 不会传播到高位。
Zbb 或 Zbkb 均可提供单条指令;RV32 opcode=0110011,RV64 opcode=0111011,funct7=0000100、rs2=00000、funct3=100。

常见使用场景

低 16 位零扩展

RV32/RV64 Zbb 或 Zbkb,x11=0x12348001:zext.h x10, x11 得到 x10=0x8001,高位清零。

使用前检查清单

语法检查
  • rd、rs 选择 x0–x31;只有一个整数源,没有立即数,编码中的 rs2 固定为 00000。
  • funct7=0000100、funct3=100;RV32 opcode=0110011,RV64 opcode=0111011。
语义检查
  • 读取执行前 rs[15:0],高于 bit15 的所有位填零,再按 XLEN 写入 rd;rd=x0 时丢弃写回。
  • 适用于 RV32/RV64 的 Zbb 或 Zbkb;Zbkb 的 RV32 PACK / RV64 PACKW 在 rs2=x0 时就是该指令。
  • 不访问数据内存;rd=rs 合法,使用写回之前的源值。

容易混淆 / 常见误区

仅使用 rs 的低 16 位;bit 15 不会向高位传播。
RV32 使用 OP 编码,RV64 使用 OP-32 编码。

常见问题

ZEXT.H 会访问内存吗?

不会。该操作读取整数源寄存器并写入整数目标寄存器,不进行数据内存访问。

ZEXT.H 的结果宽度是什么?

结果按当前 XLEN 写入 rd:RV32 为 32 位,RV64 为 64 位;两者的高于 bit 15 的位都为零。