INCSSPD, INCSSPQ

增加阴影 栈指针

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F3 0F AE /5INCSSPD r32R有效有效增量 SSP乘以 4 * r32 [7:0].
F3 REX.W 0F AE /5INCSSPQ r64R有效不可编码增量SSP乘以8 *r64[7:0].

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

R

  1. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

实测开销

正在从 arch-data 加载实测数据...

说明

此指令可用于通过指令时间的操作数大小来递增当前阴影栈指针,即源操作数中以位数7:0指定的无符号8位值. 指令以 源操作数 的 7: 0 位数执行未签名的 8 位值指定范围内阴影堆栈上的第一个和最后一个元素的弹出和丢弃 。

行动

IF CPL = 3
    IF (CR4.CET & IA32_U_CET.SH_STK_EN) = 0
          THEN #UD; FI;

ELSE
    IF (CR4.CET & IA32_S_CET.SH_STK_EN) = 0
          THEN #UD; FI;

FI;

IF (operand size is 64-bit)
    THEN
          Range := R64[7:0];
          shadow_stack_load 8 bytes from SSP;
          IF Range > 0
                THEN shadow_stack_load 8 bytes from SSP + 8 * (Range - 1);
          FI;
          SSP := SSP + Range * 8;
    ELSE
          Range := R32[7:0];
          shadow_stack_load 4 bytes from SSP;
          IF Range > 0
                THEN shadow_stack_load 4 bytes from SSP + 4 * (Range - 1);
          FI;
          SSP := SSP + Range * 4;

FI;

受影响的旗帜

None.

Intel C/C++ 内在编译器

INCSSPD void _incsspd(int);
INCSSPQ void _incsspq(int);

异常

保护模式
#UD如果LOCK前缀被使用。如果CR4.CET= 0. 纵深CPL=3个和IA32_U_CET.SH_STK_EN= 0. 纵深CPL <联合国IA32_S_CET.SH_STK_EN = 0. #PF(fault-code)如果一个页面错误发生。
实地址模式
#UDINCSSP指令在实地址模式中不被识别.
虚拟 8086 模式
#UDINCSSP指令在虚拟 8086 模式中不被识别.
兼容模式
与保护模式中的例外相同.
64 位模式
与保护模式中的例外相同.

来源