Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 奔腾III CPU如何处理来自同一组的多个指令前缀?_Assembly_Intel_X86_X86 Emulation - Fatal编程技术网

Assembly 奔腾III CPU如何处理来自同一组的多个指令前缀?

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所示格式的子集。指令包括可选的指令前缀(以任何顺序)、主操作码

英特尔x86规范指出,使用同一组中的多个指令前缀会导致未定义的行为。实际上,Pentium III Coppermine CPU在这种情况下的反应如何?遗憾的是,我没有芯片要测试。

虽然您已经知道这一点,但为了清楚起见,我将首先说明这一点。x86指令最多可以有4个前缀(每个前缀来自不同的组),用于改变处理器对指令的解释。第2.1节:

2.1保护模式、实地址模式和虚拟8086模式的指令格式 英特尔64和IA-32体系结构指令编码是图2-1所示格式的子集。指令包括可选的指令前缀(以任何顺序)、主操作码字节(最多三个字节)、由ModR/M字节(有时包括SIB(比例索引基)字节)组成的寻址形式说明符(如果需要)、位移(如果需要)和立即数据字段(如果需要)


图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地址大小覆盖前缀
锁定前缀(F0H)强制执行一项操作,以确保在多处理器环境中独占使用共享内存。有关此前缀的说明,请参阅第3章“指令集参考,A-L”中的“LOCK Assert LOCK#Signal Prefix”

重复前缀(F2H,F3H)导致对字符串的每个元素重复一条指令。这些前缀仅用于字符串和I/O指令(MOV、CMP、SCA、LOD、STO、INS和OUT)。保留将重复前缀和/或未定义的操作码与其他英特尔64或IA-32指令一起使用;这种使用可能会导致不可预测的行为

一些指令可能使用F2H、F3H作为表示不同功能的强制前缀

分支提示前缀(2EH,3EH)允许程序向处理器提示分支最可能的代码路径。这些前缀只能与条件分支指令(Jcc)一起使用。保留对“英特尔64”或“IA-32”指令的分支提示前缀和/或其他未定义操作码的其他使用;这种使用可能会导致不可预测的行为

操作数大小覆盖前缀允许程序在16位和32位操作数大小之间切换。任何一种大小都可以是默认值;使用前缀将选择非默认大小

一些SSE2/SSE3/SSSE3/SSE4指令和使用主操作码字节的三字节序列的指令可能使用66H作为表示不同功能的强制前缀

保留66H前缀的其他用途;这种使用可能会导致不可预测的行为

地址大小覆盖前缀(67H)允许程序在16位和32位寻址之间切换。任何一种大小都可以是默认值;前缀选择非默认大小。保留指令的操作数不在内存中时使用此前缀和/或其他未定义的操作码;这种使用可能会导致不可预测的行为

请注意,它实际上并没有说来自同一组的多个指令前缀会导致“未定义的行为”,而是说每个组最多包含一个指令前缀是“唯一有用的”。这让事情变得相当不确定

在我看来,从规范中得到的唯一形式保证是某些特定的指令和前缀组合可能导致“不可预测的行为”或异常,并且