编码 x64 VEX 前缀

Encoding the x64 VEX prefix

我正在使用 VEX 前缀指南:http://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix

虽然我不知道如何编码实际的 VEX 指令。 ADDPD 指令(Intel x64 第 459 页)操作码如下所示:VEX.NDS.128.66.0F.WIG 58 /r

嗯什么?? VEX 指南没有提到任何关于 'NDS' 或 'WIG' 的内容。我错过了什么?

您缺少第 3.1.1.2 节 "Opcode Column in the Instruction Summary Table (Instructions with VEX prefix)"(我电脑上的手册第 64 页,其他版本可能略有不同)

对于这个实例,重要的部分是:

  • VEX(显然)意味着有一个 VEX 前缀。
  • NDS,VEX.vvvv字段指定了一个寄存器(不总是,有时不用,必须设置为全1),并且是只读的第一个源操作数。
  • 128很明显,是128bit宽的版本
  • 55,它没有这么说,它说 66 或至少应该这样说。其他选择是 F2、F3 和 "nothing"。指示 VEX.pp 字段的值应该是什么,对应于旧编码中的强制前缀。
  • 0F,opcode map specifier,对应旧编码中的0F前缀(也有0F3A和0F38)
  • WIG(其他选项有W1W0),表示忽略VEX.W字段(W0W1的意思W 位必须分别为 0 或 1)