为什么 ia32/x64 操作码将文档 0x66 和 0xF2 映射为操作码 0x0F38F1 (CRC32) 的双重强制前缀?

2023-12-30

在 Intel 64 和 IA-32 架构软件开发人员手册中,表 A-4 附录 A.3 第 2C 卷(订单号 326018-045US,2013 年 1 月)的 F 行是唯一的,因为它有一个前缀子行,用于组合两个前缀:0x66 和 0xF2。

与此相关的唯一操作码是 0x0F38F1 (CRC32)。对于单独的前缀 0xF2,源操作数为 Ey(内存或通用寄存器;32 位或 64 位),对于前缀 0x66 和 0xF2 一起,源操作数为 Ew(内存或通用寄存器;始终为 16 位)

但这些源操作数与 0x66 只是可选操作数大小覆盖前缀而不是两个强制前缀组合中的第一个操作数相同。事实上,0x66 作为可选前缀是 CRC32 指令在第 3.2 卷第 2A 章中的记录方式(隐式:16 位和 32 位源操作数的字节序列相同)。该表似乎可以省略 0x66 和 0xF2 行,并将源操作数记录为 0xF2 行中的 Ev(内存或通用寄存器;16 位或 32 位或 64 位)。

操作码映射以这种独特的方式记录操作码 0x0F38F1 的源操作数是否有原因?

编辑:添加了手册版本


该操作码与 Atom 共享MOVBE操作说明。我think这是所有组合的外观:

0F 38 F1        movbe My, Gy
66 0F 38 F1     movbe Mw, Gw
66 F2 0F 38 F1  crc32 Gd, Ew
F2 0F 38 F1     crc32 Gd, Ey
F2 66 0F 38 F1  crc32 Gd, Ew

EDIT:对于 0F38 和 0F3A 组中的大多数操作码,66 前缀是强制的定义实际指令的前缀,而不是通常的操作数大小前缀:

长度为 4 字节的三字节操作码以强制字符开头 前缀(66H、F2H 或 F3H)和两个转义字节(0F38H 或 0F3AH)。这 第四个字节的高、低四位用于索引a 表 A-4 或表 A​​-5 中的特定行和列。

这就是为什么在操作数大小覆盖的传统作用中使用的附加可选 66 前缀的情况必须单独列出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 ia32/x64 操作码将文档 0x66 和 0xF2 映射为操作码 0x0F38F1 (CRC32) 的双重强制前缀? 的相关文章

随机推荐