BNDMK
制造边界
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F3 0F 1B /r | BNDMK bnd, m32 | RM | 不可编码 | 有效 | 从 m32 制作下限和上限,并存储在 bnd 中. |
F3 0F 1B /r | BNDMK bnd, m64 | RM | 有效 | 不可编码 | 从 m64 制作下限和上限,并存储在 bnd 中. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
RM
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 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) | 如果内存地址是非冠状的。 例外与 保护模式 相同 。 |