带NP标识与无NP标识x86指令的66/F2/F3前缀使用规则差异问询
两类指令66/F2/F3前缀使用规则核心差异
首先明确英特尔架构手册卷2对NP标识的官方定义:
NP用于标识指令禁止使用不属于自身操作码组成部分的66/F2/F3前缀,违规使用要么会触发无效操作码异常#UD,要么会被编码为其他指令。
第一类:标注NP标识的指令(示例:ADDPS、ANDPS、ANDNPS、BNDLDX、BNDSTX等)
- 前缀使用有绝对硬性约束:所有不属于该指令原生操作码组成部分的66/F2/F3前缀,完全禁止附加
- 违规后果:只要添加了非原生的上述三类前缀,要么直接触发#UD无效操作码异常,要么CPU会将整段编码识别为另一条完全不同的指令,不会执行你预期的NP标注指令
- 补充说明:如果某条NP指令的操作码本身就原生包含66/F2/F3中的某一个(比如部分SSE变种指令的操作码默认带F2/F3前缀),仅这个原生前缀是合法的,剩余两类非原生前缀依然不允许添加
第二类:无NP标识、且原生编码不含66/F2/F3前缀的指令(示例:ADD、AAD、AAM、AAS、ADC等)
- 前缀使用约束宽松:66/F2/F3前缀只要符合架构定义的合法使用场景,就可以正常附加,不会被判定为非法
- 常见合法使用场景举例:
- 给工作在32位模式下的
ADD指令添加66前缀,可以切换操作数大小为16位 - 给字符串操作类指令添加F3前缀,可以实现REP重复执行效果
- 给工作在32位模式下的
- 违规后果:只要前缀使用符合架构规范,就会正常执行预期的指令功能,不会触发#UD异常,也不会被识别为其他指令
内容的提问来源于stack exchange,提问作者Belloc
相关产品推荐
相关产品推荐

