Meaning of BND RET in x86
当我突然遇到这个奇怪的指令bnd ret时,我正在对CRT库(特别是SEH序言)进行一些反汇编。 谁能在c3之前解释f2前缀的含义(ret操作码)?
-
@fuz那就是我的想法,但是REPNE RET(F2 C3)用于Intel的MPX扩展,而其通常的REP RET(F3 C3)用于填充RET指令,以避免在较旧的AMD CPU上出现分支预测问题。
-
@罗斯这是有道理的。但是我不明白前缀如何避免分支预测错误。
-
@RossRidge在这种情况下,对不起,让我重新打开问题。
-
@fuz好吧,原始发布者显然同意您的观点,即它是一个重复的副本,那就是社区关闭投票的来源。
-
我认为这个答案太快了。 bnd与rep不同。 bnd用于在启用MPX的代码中确保检查分支(和返回)。由于它不支持MPX,因此始终将其添加到库函数中可避免必须交付两个库版本(带和不带MPX)。
-
@IgorSkochinsky感谢您对此发表看法!
-
这是一个很好的问题,应该打开以便回答。目前尚无适当答案。
-
我还看到了__chkstk实现中的bnd jae(操作码f2 73)。
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上的性能问题。