Att*_*eld 6 assembly pointers intel
英特尔MPX,在以下文档中描述了新手:https://software.intel.com/sites/default/files/managed/68/8b/319433-019.pdf
我不确定我理解BNDLDX和BNDSTX是如何工作的.以BNDSTX为例.
从文档(第855页):
"BNDSTX用于通过使用两级结构的地址转换将与缓冲区关联的边界和指向该缓冲区的指针的"指针值"存储到绑定表条目中,请参见第9.3.8节.例如,软件有一个存储在BND0中的边界的缓冲区,指向缓冲区的指针在ESI中,以下序列将"指针值"(缓冲区)和边界存储到已配置的绑定表条目中,使用与相关的线性地址的地址转换由基址寄存器和索引寄存器组成的SIB寻址形式的基础:"
MOV ECX, Dword ptr [ESI] ; store the pointer value in the index register ECX
MOV EAX, ESI ; store the pointer in the base register EAX
BNDSTX Dword ptr [EAX+ECX], BND0 ; perform address translation from the linear address of the base EAX and store bounds and pointer value ECX onto a bound table entry.
Run Code Online (Sandbox Code Playgroud)
该示例说明ESI包含一些指针,如果是这样,那么第一条指令mov ecx,dword ptr [esi]通过间接寻址执行一个简单的mov并获取任何esi 指向 ecx 的dword ,这就是我所假设的用"指针值"表示,或者它们是否代表其他东西?这是什么目的,这与BNDSTX执行的地址转换有何关系?
第二条指令似乎足够直观,它只是想将这个指针存储到缓冲区并复制它.然而,为什么这是严格需要也有点奇怪.BND0不包含缓冲区的开头吗?它不是简单地复制下限指针吗?而且,这个"指针值"的用途到底是什么目的还不清楚.
英特尔的例子措辞非常糟糕。ESI 最初保存一个指向 buf 的指针。检查“指针值”是因为非 MPX 代码可能在不修改边界的情况下修改了指针值。如果发生这种情况,BNDLNX 指令将取消边界:
来自https://software.intel.com/sites/default/files/management/0d/53/319433-022.pdf:
BNLDX 使用由基址寄存器构造的线性地址和内存操作数 (mib) 的 SIB 寻址形式的位移来执行地址转换以访问绑定表条目,并有条件地将 BTE 中的边界加载到目标。如果 mib 索引寄存器的内容与 BTE 中存储的指针值匹配,则目标寄存器将根据 BTE 中的边界进行更新。
如果指针值比较失败,则使用 INIT 边界 (lb = 0x0, ub = 0x0) 更新目标(注意:如前所述,上限使用 1 的补码表示,因此,上限的 0x0 值允许访问到满内存)。