TL:DR:在 NASM 中,在 RESB/RESW/RESD/RESQ 之后有 RESO、RESY 和 RESZ。在指令助记符和 Intel 术语(在手册中使用)中,都使用了 O(八进制)和 DQ(双四进制)。但不使用 DQWORD,只使用 OWORD。
反汇编程序将在 MASM 或 .intel_syntax GNU 语法中将 xmmword ptr [rsi] 用于显式内存操作数大小。 IIRC,没有任何指令表明助记符和/或寄存器尚未暗示该大小。
请注意,此问题是特定于 x86 的,并且与英特尔的术语有关。在大多数其他 ISA(如 ARM 或 MIPS)中,“单词”是 32 位的,但 x86 术语起源于 8086。
指令助记符中的术语
八进制字用于某些 x86-64 指令的助记符。例如CQO 将 rax 符号扩展为 rdx:rax。
CMPXCHG16B 是另一个对 16 字节进行操作的非向量指令,但英特尔在描述中的任何地方都没有使用“oct”。相反,他们将内存位置描述为 m128。该手动输入不使用任何基于“单词”的大小。
SSE/AVX 整数指令通常将元素大小作为助记符的一部分。在这种情况下,使用 DQ(双四),从不使用 O(八进制)。例如,PUNPCKL* 指令将两个源向量中一半的元素交织成一个完整的目标向量:
- PUNPCKLWD: word->dword (16->32)
- PUNPCKLDQ: dword->qword (32->64)
- PUNPCKLQDQ:两个 qwords->完整的 128 位寄存器 (64->128)。
但是,它只是 DQ,而不是 DQWord。双四字听起来有些不自然,但我认为它可能偶尔会在英特尔手册中使用。如果您省略“Word”,听起来会更好,只需说“在此位置存储一个双四边形”。如果你想给它附加“word”,我认为只有 OWord 听起来很自然。
还有用于加载/存储/reg-reg 移动的 MOVDQA。幸运的是,当 AVX 将向量宽度扩展到 256b 时,它们保持了相同的助记符,并没有调用 256b 版本的 VMOVQQA。
一些用于操作 256 位寄存器的 128 位通道的指令在名称中包含 128,例如 VEXTRACTF128,这是 Intel 的新指令(CMPXCHG8B 除外)。
汇编指令:
来自 NASM 手册:
3.2.1 DB and Friends: Declaring Initialized Data
DB、DW、DD、DQ、DT、DO、DY 和 DZ 被使用...(示例表)
DO、DY 和 DZ 不接受数字常量作为操作数。
DT 是一个十字节的 x87 浮点数。 DO 为 16 字节,DY 为 YMMWORD(32 字节),DZ 为 64 字节(AVX512 ZMM)。由于它们不支持数字常量作为初始化器,我猜你只能将它们与字符串文字初始化器一起使用?无论如何,对于 DB/DW/DD/DQ 来说,使用逗号分隔的每个元素初始值设定项列表会更正常。
同样,您可以保留未初始化的空间。
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 位元素粒度进行掩码。
但是,英特尔不会放弃 word=16 位。例如AVX512BW 和 AVX512DQ 将该术语放在名称中。一些内在函数甚至使用它们,以前它总是epi32,而不是d。 (即_mm256_broadcastd_epi32(__m128i)、_mm256_broadcastw_epi16(__m128i)。b/w/d/q 完全是多余的。也许这是一个错误?)
(有没有其他人发现 asm 助记符比烦人的长内部函数更容易记住和键入?你必须知道 asm 助记符才能读取编译器输出,所以如果内部函数只使用助记符而不是第二种命名方案。)