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

RISC-V SSAMOSWAP.D 指令详解

指令手册AMO-type

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

指令语法

ssamoswap.d 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.D 从 rs1 指向的影子栈位置原子读取64 位双字值写入 rd,并把 rs2 的对应宽度值写回原地址。它用于影子栈切换、检查点保存等需要保护 ssp 相关数据的场景。该形式仅适用于 RV64。

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

只展示规范定义的编码、条件和架构可见状态;不模拟流水线、缓存一致性或平台策略。

ssamoswap.d a0, a2, (a1)
执行环境
指令编码
31..27
funct5
01001
26
aq
0
25
rl
0
24..20
rs2
a2
19..15
rs1
a1
14..12
funct3
011
11..7
rd
a0
6..0
opcode
0101111 (AMO)
解码固定字段
固定编码字段识别指令和操作数角色。
原子交换: x[a0] <- mem[0x0000000000003000] = 0x1122334455667788; mem <- 0xAABBCCDDEEFF0011.
尚未提交架构状态。

快速理解与检索要点

SSAMOSWAP.D 是 RV64 的 Zicfiss AMO;它原子读取旧双字到 rd,再把 rs2 的双字写至 rs1 指向的影子栈位置。

SSAMOSWAP.W/D 采用 AMO 风格读旧值、写新值,并可使用 aq/rl 一致性语义。
它不使用 Zimop/Zcmop 回退:SSAMOSWAP.W/D 的执行还受 SSE 控制和影子栈内存保护条件约束。

常见使用场景

函数调用与返回

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

操作系统接口

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

特定用途

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

使用前检查清单

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

容易混淆 / 常见误区

SSAMOSWAP.D 不使用 Zimop/Zcmop MOP 兼容 no-op;在非 M 特权级,SSE 访问控制不满足时会产生非法指令或虚拟指令异常;M 特权级访问会触发 store/AMO access-fault。
地址必须指向合法影子栈内存并按操作数宽度自然对齐;不满足时按影子栈内存保护规则异常。
它是 AMO 类操作,支持 aq/rl release-consistency 语义;不要当作普通 load/store。
SSAMOSWAP.W 在 RV64 上把加载的 32 位旧值符号扩展到 rd;.D 仅 RV64。

常见问题

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

SSAMOSWAP.D 不使用 Zimop/Zcmop 回退;其执行遵循 SSE 访问控制和影子栈内存保护规则,并会依特权级与状态触发非法指令、虚拟指令或 store/AMO access-fault 异常。

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

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