BNDMK

制造边界

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F3 0F 1B /rBNDMK bnd, m32RM不可编码有效从 m32 制作下限和上限,并存储在 bnd 中.
F3 0F 1B /rBNDMK bnd, m64RM有效不可编码从 m64 制作下限和上限,并存储在 bnd 中.

操作数编码

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

RM

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

实测开销

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

说明

从第二个 操作数 开始设定界限,并将下限和上限存储在绑定注册 bnd 中。 第二个操作数必须是内存操作数. 内存操作数的基寄寄存器内容存储在下限bnd.LB. 有效地址m32/m64的1'补充被存储在上绑定b.UB. M32/m64的计算行为与LEA相同.

此指令不会导致任何内存访问,也不会读写任何旗帜.

如果指令没有指定基准寄存器,则下限为零。 本指令的reg-reg形式保留了遗留行为(NOP).

该指令如果在64位模式下以RIP-relative地址执行,则导致无效-操作码例外(#UD).

行动

BND.LB := SRCMEM.base;
IF 64-bit mode Then

    BND.UB := NOT(LEA.64_bits(SRCMEM));
ELSE

    BND.UB := Zero_Extend.64_bits(NOT(LEA.32_bits(SRCMEM)));
FI;

Intel C/C++ 内在编译器

BNDMKvoid * _bnd_set_ptr_bounds(const void * q, size_t size);

受影响的旗帜

None.

异常

保护模式
#UD如果使用 LOCK 前缀 。 如果启用 Intel MPX 时, ModRM.r/ m 编码 BND4- BND7 。 如果使用 67H 前缀和 CS.D=0. 如果使用 67H 前缀和 CS.D=1.
实地址模式
#UD如果使用 LOCK 前缀。 如果启用 Intel MPX 时, ModRM.r/ m 编码 BND4- BND7 。 如果使用 16 位地址 。
虚拟 8086 模式
#UD如果使用 LOCK 前缀。 如果启用 Intel MPX 时, ModRM.r/ m 编码 BND4- BND7 。 如果使用 16 位地址 。
兼容模式
与保护模式中的例外相同.
64 位模式
#UD如果使用 LOCK 前缀。如果启用 Intel MPX 时, ModRM.r/m 和 REX 编码为 BND4- BND15 。如果使用 RIP 相对地址 。
#SS(0)如果引用SS部分的内存地址是非冠状的.
#GP(0)如果内存地址是非冠状的。 例外与 保护模式 相同 。

来源