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

标签 assembly x86 x86-64 opcode machine-code

在 Intel 64 and IA-32 Architectures Software Developer's Manual 中,Row F table A-4 附录 A.3 Volume 2C(订单号 326018-045US 2013 年 1 月)是独一无二的,因为它有一个前缀子行,用于两个的组合前缀: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 共享操作说明。我认为这就是它查找所有组合的方式:

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

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

Three-byte opcodes that are 4 bytes in length begin with a mandatory prefix (66H, F2H, or F3H) and two escape bytes (0F38H or 0F3AH). The upper and lower four bits of the fourth byte are used to index a particular row and column in Table A-4 or Table A-5.



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

关于assembly - 为什么 ia32/x64 操作码映射文档 0x66 和 0xF2 作为操作码 0x0F38F1 (CRC32) 的双重强制前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16794171/

相关文章:

无法链接程序集和 c

assembly - OP 代码 0x20 和 0x30 处的 Intel 8080 指令

linux - 如何一次取消保护跨越多个页面的内存区域?

c - 结构成员的默认对齐方式

assembly - 初学者 : Can't decode this assembly code

c - 为什么机器代码取决于操作系统类型?

performance - 为什么在某些 CPU 上 SSE 对齐读取 + shuffle 比未对齐读取慢,而在其他 CPU 上则不然?

assembly - `test` 指令有什么作用?

c++ - g++ 优化标志 : -fuse-linker-plugin vs -fwhole-program

linux - 如何重写文件内容? Linux x86_64、汇编、GAS