QWORD 之后是什么?

What comes after QWORD?

如果

16 字节的名字叫什么好?

我不认为这是常用的(尽管 SSE/AVX 有 128 位和 256 位操作数,它们是元素的 向量 不超过 qword 大小),但 "quad" 之后的明显扩展将是 octoword / oword.

TL:DR:在NASM中,在RESB/RESW/RESD/RESQ之后有RESO、RESY和RESZ。在指令助记符和英特尔术语(手册中使用)中,都使用了 O (oct) 和 DQ (double-quad)。但是没有使用 DQWORD,只有 OWORD。

反汇编程序将使用 xmmword ptr [rsi] MASM 或 .intel_syntax GNU 语法中的显式内存操作数大小。 IIRC,助记符 and/or 寄存器没有暗示该大小的指令。


请注意,此问题特定于 x86,并且与英特尔的术语有关。在大多数其他 ISA(如 ARM 或 MIPS)中,一个“字”是 32 位,但 x86 术语起源于 8086。

指令助记符中的术语

Octword 用于某些 x86-64 指令的助记符。例如CQO 将 rax 符号扩展为 rdx:rax.

CMPXCHG16B 是另一个非向量指令,它在 16 个字节上运行,但英特尔在描述中的任何地方都没有使用“oct”。相反,他们将内存位置描述为 m128。该手动输入不使用任何基于“单词”的尺寸。

SSE/AVX 整数指令通常有一个元素大小作为助记符的一部分。在这种情况下,使用 DQ(双四),从不使用 O(八进制)。例如,PUNPCKL* 指令将来自两个源向量的一半的元素交织成一个完整的目标向量:

  • PUNPCKLWD:字->双字 (16->32)
  • PUNPCKLDQ:双字->四字 (32->64)
  • PUNPCKLQDQ:两个 qwords-> 完整的 128 位寄存器 (64->128)。

但是,它只是 DQ,而不是 DQWord。 Double-Quadword 听起来有点不自然,但我认为它可能偶尔会在 Intel 手册中使用。如果您省略“Word”,只说“Store a Double-Quad at this location”,听起来会更好。如果要在上面加上“word”,我觉得只有OWord听起来自然。

load/store/reg-reg 步也有 MOVDQA。幸运的是,当 AVX 将矢量宽度扩展到 256b 时,他们保留了相同的助记符并且没有调用 256b 版本 VMOVQQA。

一些用于操作 256 位寄存器的 128 位通道的指令在名称中有一个 128,例如 VEXTRACTF128,这是英特尔的新指令(CMPXCHG8B 除外)。


汇编指令:

来自 NASM 手册:

3.2.1 DB and Friends: Declaring Initialized Data

DB, DW, DD, DQ, DT, DO, DY and DZ are used ... (table of examples)

DO, DY and DZ do not accept numeric constants as operands.

DT 是一个十字节的 x87 浮点数。 DO是16字节,DY是一个YMMWORD(32字节),DZ是64字节(AVX512 ZMM)。由于它们不支持数字常量作为初始值设定项,我想您只能将它们与字符串文字初始值设定项一起使用吗?无论如何,DB/DW/DD/DQ 使用逗号分隔的每个元素初始值设定项列表会更正常。

同样可以保留未初始化的space.

realarray       resq    10              ; array of ten reals 
ymmval:         resy    1               ; one YMM register 
zmmvals:        resz    32              ; 32 ZMM registers

内在函数和 AVX512 中的术语

正如我在 How can Microsoft say the size of a word in WinAPI is 16 bits? 上的回答中提到的,AVX512 在其他操作期间的逐元素屏蔽使命名变得棘手。 VSHUFF32x4 洗牌 128b 元素,以 32 位元素粒度进行屏蔽。

但是,Intel 不会 放弃 word=16 位。例如AVX512BW 和 AVX512DQ 在名称中使用了该术语。一些内在函数甚至使用它们,以前它总是 epi32,而不是 d。 (即 _mm256_broadcastd_epi32(__m128i)_mm256_broadcastw_epi16(__m128i)。b/w/d/q 完全多余。也许这是一个错误?)

(有没有人发现 asm 助记符比长得烦人的内部函数更容易记住和键入?您必须知道 asm 助记符才能读取编译器输出,所以如果内部函数只是使用助记符就好了第二种命名方案。)