Assembly 奔腾III CPU如何处理来自同一组的多个指令前缀?
英特尔x86规范指出,使用同一组中的多个指令前缀会导致未定义的行为。实际上,Pentium III Coppermine CPU在这种情况下的反应如何?遗憾的是,我没有芯片要测试。虽然您已经知道这一点,但为了清楚起见,我将首先说明这一点。x86指令最多可以有4个前缀(每个前缀来自不同的组),用于改变处理器对指令的解释。第2.1节: 2.1保护模式、实地址模式和虚拟8086模式的指令格式 英特尔64和IA-32体系结构指令编码是图2-1所示格式的子集。指令包括可选的指令前缀(以任何顺序)、主操作码字节(最多三个字节)、由ModR/M字节(有时包括SIB(比例索引基)字节)组成的寻址形式说明符(如果需要)、位移(如果需要)和立即数据字段(如果需要)Assembly 奔腾III CPU如何处理来自同一组的多个指令前缀?,assembly,intel,x86,x86-emulation,Assembly,Intel,X86,X86 Emulation,英特尔x86规范指出,使用同一组中的多个指令前缀会导致未定义的行为。实际上,Pentium III Coppermine CPU在这种情况下的反应如何?遗憾的是,我没有芯片要测试。虽然您已经知道这一点,但为了清楚起见,我将首先说明这一点。x86指令最多可以有4个前缀(每个前缀来自不同的组),用于改变处理器对指令的解释。第2.1节: 2.1保护模式、实地址模式和虚拟8086模式的指令格式 英特尔64和IA-32体系结构指令编码是图2-1所示格式的子集。指令包括可选的指令前缀(以任何顺序)、主操作码
图2-1。英特尔64和IA-32体系结构指令格式 2.1.1指令前缀 指令前缀分为四组,每组都有一组允许的前缀代码。对于每一条指令,仅在四个组(组1、2、3、4)中的每一组中包含最多一个前缀代码才有用。第1组至第4组可按相互之间的任何顺序排列
- 第一组
- 锁定并重复前缀:
- 锁前缀使用F0H编码
- REPNE/REPNZ前缀使用F2H编码。重复非零前缀仅适用于字符串和 输入/输出指令。(对于某些指令,F2H也用作强制前缀。)
- REP或REPE/REPZ使用F3H编码。重复前缀仅适用于字符串和输入/输出指令。F3H还用作POPCNT、LZCNT和ADOX指令的强制前缀
- 如果满足以下条件,则使用F2H对绑定前缀进行编码:
- CPUID。(EAX=07H,ECX=0):设置EBX.MPX[位14]
- 设置了BNDCFGU.EN和/或IA32_BNDCFGS.EN
- 当F2前缀位于near调用、near RET、near JMP或near Jcc指令之前时(请参阅《英特尔64和IA-32体系结构软件开发人员手册》第1卷第17章“英特尔MPX”)
- 锁定并重复前缀:
- 第2组
- 段覆盖前缀:
- 2EH-CS段覆盖(保留与任何分支指令一起使用)
- 36H-SS段覆盖前缀(保留与任何分支指令一起使用)
- 3EH-DS段覆盖前缀(保留与任何分支指令一起使用)
- 26H-ES段覆盖前缀(保留与任何分支指令一起使用)
- 64H-FS段覆盖前缀(保留与任何分支指令一起使用)
- 65H-GS段覆盖前缀(保留与任何分支指令一起使用)
- 分支提示(不再使用;保留):
- 2EH未执行分支(仅与Jcc指令一起使用)
- 采用3EH分支(仅与Jcc指令一起使用)
- 段覆盖前缀:
- 第3组
- 操作数大小重写前缀使用66H编码(66H也用作某些操作数的强制前缀) 说明)
- 第4组
- 67H地址大小覆盖前缀