Dmi*_*try 6 x86 assembly terminology intel
如果
8位是一个字节
两个字节是一个单词
四个字节是双字节
8个字节是一个qword
什么是16字节的好名字?
TL:DR:在NASM中,在RESB/RESW/RESD/RESQ之后有RESO,RESY和RESZ.在指令助记符和英特尔术语(用于手册)中,使用O(oct)和DQ(双四元组).但DQWORD没有使用,只有OWORD.
反汇编程序将xmmword ptr [rsi]用于MASM或.intel_syntaxGNU语法中的内存操作数显式大小.IIRC,没有说明,助记符和/或注册表中没有暗示该大小.
请注意,此问题是特定于x86的,并且与英特尔的术语有关.在大多数其他ISA(如ARM或MIPS)中,"字"是32位,但x86术语起源于8086.
对于某些x86-64指令,Octword用于助记符.例如,CQO将rax扩展为rdx:rax.
CMPXCHG16B是另一个在16个字节上运行的非向量指令,但英特尔在描述中的任何地方都不使用"oct".相反,他们将内存位置描述为m128.该手动输入不使用任何基于"单词"的大小.
SSE/AVX整数指令通常具有元素大小作为助记符的一部分.在该上下文中,使用DQ(双四元组),而不是O(oct).例如,PUNPCKL*指令将来自两个源向量的一半的元素交织成完整的目标向量:
然而,它只是DQ,而不是DQWord.Double-Quadword听起来有点不自然,但我认为偶尔可能会在Intel手册中使用它.如果你省略"Word",并且只是说"在这个位置存储一个双四元组",这听起来会更好.如果你想附加"单词",我认为只有OWord听起来很自然.
还有用于加载/存储/注册移动的MOVDQA.幸运的是,当AVX将矢量宽度扩展到256b时,它们保持相同的助记符并且没有调用256b版本的VMOVQQA.
一些用于操作256位256位寄存器的指令128在名称中有一个名称,如VEXTRACTF128,这是Intel的新功能(CMPXCHG8B除外).
从NASM手册:
使用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以逗号分隔的每元素初始化器列表更为正常.
同样,您可以保留未初始化的空间.
Run Code Online (Sandbox Code Playgroud)realarray resq 10 ; array of ten reals ymmval: resy 1 ; one YMM register zmmvals: resz 32 ; 32 ZMM registers
正如我在回答中提到的,微软如何说WinAPI中单词的大小是16位?,AVX512在其他操作期间的每个元素屏蔽使命名变得棘手.VSHUFF32x4对128b元素进行混洗,屏蔽为32位元素粒度.
但是,英特尔并没有退出word = 16位.例如AVX512BW和AVX512DQ将该术语放在名称中.一些内在函数甚至使用它们,以前它总是使用它们,而epi32不是d.(即_mm256_broadcastd_epi32(__m128i),_mm256_broadcastw_epi16(__m128i).b/w/d/q完全是多余的.也许这是一个错误?)
(有没有其他人发现asm助记符比烦人长的内在函数更容易记忆和输入?你必须知道asm助记符来读取编译器输出,所以如果内在函数只是使用助记符而不是第二个命名方案那就太好了.)