如果
8位是一个字节
两个字节是一个单词
四个字节是dword
8个字节是qword
16个字节有什么好名字?
答案 0 :(得分:5)
TL:DR :在NASM中,在RESB / RESW / RESD / RESQ之后, RESO,RESY和RESZ 。在指令助记符和英特尔术语(用于手册)中,使用O(oct)和DQ(双四元组)。但DQWORD并没有被使用,只有OWORD。
反汇编程序将使用xmmword ptr [rsi]
作为MASM中的内存操作数显式大小或.intel_syntax
GNU语法。 IIRC,没有说明这些尺寸是否已经由助记符和/或寄存器暗示。
请注意,此问题是特定于x86的,并且与英特尔的术语有关。在大多数其他ISA(如ARM或MIPS)中,一个"字"是32位,但x86术语起源于8086。
Octword用于某些x86-64指令的助记符。例如CQO将rax扩展为rdx:rax。
CMPXCHG16B是另一个非向量指令,可以在16个字节上运行,但英特尔并没有使用" oct"描述中的任何地方。相反,他们将内存位置描述为 m128 。该手册输入并未使用任何基于#34;字的大小。
SSE / AVX整数指令通常具有元素大小作为助记符的一部分。在该上下文中,使用DQ(双四元组),而不是O(oct)。例如,PUNPCKL*指令将两个源向量中的一半的元素交织成完整的目标向量:
但是,它只有DQ,而不是DQWord 。 Double-Quadword听起来有点不自然,但我认为偶尔可能会在Intel手册中使用它。如果你省略" Word"听起来更好,只需说"在这个位置存储双四元组"。如果你想附上" word"对它来说,我认为只有OWord听起来很自然。
还有用于加载/存储/注册移动的MOVDQA。幸运的是,当AVX将矢量宽度扩展到256b时,它们保持相同的助记符并且没有调用256b版本的VMOVQQA。
操作256位256位寄存器的一些指令名称中有128
,如VEXTRACTF128,这是英特尔的新功能(CMPXCHG8B除外)。
来自NASM手册:
3.2.1 DB and Friends: Declaring Initialized Data
使用DB,DW,DD,DQ,DT,DO,DY和DZ ......(示例表)
DO,DY和DZ不接受数字常量作为操作数。
DT
是一个10字节的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
正如我在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助记符来读取编译器输出,所以如果内在函数只使用助记符而不是一个助记符会很好第二个命名方案。)
答案 1 :(得分:4)