F3H可以用作POCNT,LZCNT和ADOX指令以外的指令的强制前缀吗?

时间:2016-07-04 08:08:24

标签: assembly x86

正如Intel 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 2A and 2B: Instruction Set Reference, A-Z

中所述
  

2.1.1指令前缀

     

F3H 也可用作POPCNT,LZCNT和ADOX指令的必填前缀。

但是在

  

2.1.2操作码

     

例如,CVTDQ2PD由以下序列组成: F3 0F E6。第一个字节是强制性前缀(不被视为重复前缀)。

我可以说,如果英特尔手册中的操作码的第一个字节是F3H,那么它是该指令的必需前缀吗?

1 个答案:

答案 0 :(得分:4)

在序列0F E6中,第一个字节0F是一个双字节操作码转义。
另一个字节E6根据附录A(第A.3节)中的表进行翻译,并在此处以简短形式报告

CVTDQ2PD and siblings

上一行是字节的低半字节,第一列是较高的一半。

我们可以看到,如果没有F3字节,序列0F E6就不会对任何指令进行编码。
66 0F E6vcvttpd2dq进行编码 F3 0F E6vcvtdq2pd进行编码 F2 0F E6vcvtpd2dq

进行了编码

是的,F3是强制性的。

不可否认,英特尔所做的是一个怪癖,字节F3是一个真正的rep前缀,但CPU并没有这样解释。
您可以将0F E6视为未命名的说明,例如unm2,这样:

  • unm2表现为ud2
  • rep unm2表现为vcvtdq2pd
  • repne unm2表现为vcvtpd2dq
  • 尺寸覆盖的
  • unm2表现为vcvttpd2dq