BND RET在x86中的含义

NTA*_*ity 7 x86 assembly return opcode disassembly

突然遇到这个奇怪的指令时,我正在对CRT库(特别是SEH序言)进行一些分解bnd ret。任何人都可以f2c3(ret opcode)之前解释前缀的含义吗?

Wim*_*Wim 5

BND前缀是Intel MPX(内存保护扩展)的一部分,它指示应对照BND0至BND3寄存器中指定的界限检查返回目标(或通常为分支目标,因为BND可以应用于任何控制流指令) ,否则将生成异常-表示潜在的堆栈溢出,编程错误或恶意代码攻击。

在不支持Intel MPX或禁用MPX的处理器上,BND前缀表现为无操作,因此不需要编译两个版本的代码(一个带有BND前缀,一个带有BND前缀)。

请注意,BND前缀的编码与REPNE前缀的编码相同(均为F2),因此不了解MPX的较旧的反汇编程序可能将此指令序列显示为REPNE RET(或REPNE JMP,REPNE CALL,等等。)。此用法与REP RET惯用语无关,在REP RET惯用语中,假定前缀具有无操作行为,并且仅用于解决旧CPU上的性能问题。

  • @Sep:以全大写形式编写指令助记符是代码格式化的有效替代方法。这就是英特尔在自己的手册中所做的。我认为这个答案没有含糊之处;似乎不是一个非常有用的编辑,因为没有任何其他改进要做。(另外,如果我要使用助记符或寄存器名称的代码格式,我倾向于使用小写字母,如“bnd”或“rep ret”)。我发现,全大写对阅读流程的干扰最少,小写的“bnd”有一定程度的干扰,但不如“BND”那么严重。如果我“希望”读者在浏览时注意到助记符,我会使用“ret”。 (2认同)