首页/指令库/SSAMOSWAP-W
SSAMOSWAP.W

RISC-V SSAMOSWAP.W 指令详解

指令手册AMO-type

SSAMOSWAP.W 对影子栈内存执行 AMO 风格交换,返回旧值并写入新值。

指令语法

ssamoswap.w rd, rs2, (rs1)
操作数说明
rd:接收原子读取的旧内存值;对 AMOCAS,执行前的 rd 同时提供比较值。
rs1:直接提供原子内存访问地址;AMO 汇编语法没有 offset 立即数字段。
rs2:提供 AMO 的源数据;对 AMOCAS,它是在比较相等时写入的交换值。
AMO-type 是本站对 AMO 专用 R-type 字段布局的展示标签:funct5、aq、rl、rs2、rs1、funct3、rd 和 AMO opcode 共同编码该操作。
Zicfiss安全机制

指令行为说明

入门理解:SSAMOSWAP.W 从 rs1 指向的影子栈位置原子读取 32 位字值写入 rd,并把 rs2 的低 32 位写回原地址。它用于影子栈切换、检查点保存等需要保护 ssp 相关数据的场景。在 RV64 上读出的 32 位值会符号扩展到 rd。

SSAMOSWAP.W 指令解析与执行动画

只显示规范定义的编码、条件和架构可见状态。

ssamoswap.w a0, a1, (a2)
执行环境
指令编码
31..27
funct5
01001
26/25
aq/rl
00
24..20
rs2
a1
19..15
rs1
a2
14..12
funct3
010
11..7
rd
a0
6..0
opcode
0101111 AMO
解码固定字段
x[a2]=0x0000000000002000, x[a1]=0x0000000012345678, mem[address]=0x89ABCDEF
x[a0] <- 0xFFFFFFFF89ABCDEF; mem[0x0000000000002000] <- 0x12345678
尚未提交架构状态。

快速理解与检索要点

SSAMOSWAP.W 是 Zicfiss 的影子栈 AMO 指令;其 SSE 访问条件由当前特权环境控制。

SSAMOSWAP.W/D 采用 AMO 风格读旧值、写新值,并可使用 aq/rl 一致性语义。
SSAMOSWAP.W/D 不是 MOP 编码;SSE 条件不满足时进入其规定的异常路径。

常见使用场景

函数调用与返回

使用 jal ra, label 或 jalr ra, rs, imm。

操作系统接口

结合 «ssamoswap.w t0, t1, (t2)» 等实际代码理解该场景。

特定用途

结合 «ssamoswap.w t0, t1, (t2)» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 AMO-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

SSAMOSWAP.W 不是 Zimop/Zcmop MOP 兼容 no-op;手册列出的 SSE 或 S-mode 条件不满足时会产生非法指令或虚拟指令异常,M 特权级的内存访问会产生 store/AMO access-fault。
Zicfiss 依赖 Zicsr、Zimop 和 Zaamo 扩展。
在 M 特权级不支持激活 Zicfiss;U 特权级使用则要求实现 S 特权级。
SSAMOSWAP.W 的 rs1 地址必须按 word 的 4 字节宽度自然对齐;未自然对齐时适用 A 扩展 AMO 的同一异常选项。
它是 AMO 类操作,支持 aq/rl release-consistency 语义;不要当作普通 load/store。
访问内存必须是幂等的;若内存非幂等或 PMP 未提供读写权限,会产生 store/AMO access-fault。SSAMOSWAP.W 还要求 PMA 提供 AMOSwap 级别支持。
SSAMOSWAP.W 在 RV64 上把加载的 32 位旧值符号扩展到 rd;.D 仅 RV64。

常见问题

SSAMOSWAP.W 未启用相关 CFI 时会怎样?

SSAMOSWAP.W 是 AMO 编码而非 Zimop/Zcmop MOP;若 SSE 访问控制或 S-mode 条件不满足,它会进入规定的非法指令或虚拟指令异常路径。

SSAMOSWAP.W 的官方来源是什么?

RISC-V 非特权 ISA 的 Control-flow Integrity 章节定义 LPAD、SSPUSH、SSPOPCHK、SSRDP 和 SSAMOSWAP。