正如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。第一个字节是强制性前缀(不视为重复前缀)。

我可以说如果intel's手册中操作码的第一个字节是F3H,它是该指令的必需前缀吗?

最佳答案

是。

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

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

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

我们可以看到,没有F3字节,序列0F E6不会编码任何指令。
66 0F E6编码vcvttpd2dq
F3 0F E6编码vcvtdq2pd
F2 0F E6编码vcvtpd2dq

是的,F3是强制性的。



诚然,英特尔所做的只是一个怪癖,字节F3是真实的rep前缀,但CPU并没有这样解释。
您可以将0F E6视为未命名的指令,例如unm2,这样:


unm2的行为与ud2
rep unm2的行为与vcvtdq2pd
repne unm2的行为与vcvtpd2dq
大小覆盖的unm2行为与vcvttpd2dq

08-16 10:11