英特尔MPX,BNDSTX,BNDLDX

时间:2014-06-26 16:45:39

标签: pointers assembly 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中,以下序列将   将“指针值”(缓冲区)和边界存储到a中   使用线性地址转换配置绑定表条目   与由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.

该示例指出ESI包含一些指针,如果是这样,则第一条指令mov ecx,dword ptr [esi]通过间接寻址执行简单的mov并获取任何esi 指向进入ecx,我认为它们的意思是指针值,或者它们是否意味着其他东西?这是什么目的,这与BNDSTX执行的地址转换有什么关系?

第二条指令看起来很直观,它只是想将这个指针存储到缓冲区并复制它。然而,为什么这是严格需要也有点奇怪。 BND0不包含缓冲区的开头吗?它不是简单地复制下限指针吗?而且,这个指针值的确切目的对我来说并不清楚。

1 个答案:

答案 0 :(得分:3)

英特尔的例子措辞非常糟糕。 ESI最初拥有一个指向buf指针的指针。 "指针值"检查,因为非MPX代码可能已修改指针值而不修改边界。如果发生这种情况,BNDLNX指令将使边界无效:

来自https://software.intel.com/sites/default/files/managed/0d/53/319433-022.pdf

  

BNDLDX使用从基址寄存器构造的线性地址和SIB寻址形式的位移   内存操作数(mib)执行地址转换以访问绑定表条目并有条件地加载   BTE到目的地的界限。如果是,则使用BTE中的边界更新目标寄存器   mib的索引寄存器的内容与存储在BTE中的指针值匹配。

     

如果指针值比较失败,则使用INIT边界更新目标(lb = 0x0,ub = 0x0)(注意:as   如前所述,上限用1的补码表示,因此,上限的0x0值   允许访问完整内存)。