首页 文章

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

提问于
浏览
5

在英特尔64和IA-32架构软件开发人员手册中,行F表A-4附录A.3卷2C(订单号326018-045US 2013年1月)的独特之处在于它具有前缀子行,用于两个组合前缀:0x66和0xF2 .

与此相关的唯一操作码是0x0F38F1(CRC32) . 对于前缀0xF2,源操作数是Ey(存储器或通用寄存器; 32位或64位),对于前缀0x66和0xF2,源操作数是Ew(存储器或通用寄存器;总是16位)

但是,如果0x66只是可选的操作数大小覆盖前缀而不是两个强制前缀的组合中的第一个,那么这些源操作数与它们将是相同的 . 实际上,作为可选前缀的0x66是第3.2章第2A卷中CRC32指令的记录(隐式地:16位和32位源操作数的相同字节序列) . 看起来该表可能省略了0x66和0xF2行,并将源操作数记录为0xF2行中的Ev(存储器或通用寄存器; 16位或32位或64位) .

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

编辑:增加了手册版本

1 回答

  • 5

    此操作码与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
    

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

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

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

相关问题