【问题标题】:What comes after QWORD?QWORD之后是什么?
【发布时间】:2017-01-31 09:18:26
【问题描述】:

如果

  • 8位是一个字节

  • 两个字节就是一个字

  • 四个字节是一个双字

  • 8字节是一个qword

16 字节的好名字是什么?

【问题讨论】:

  • xword?不能真正使用“hexword”,因为这有点模棱两可
  • 八字,当然 4 位是 nybble
  • 16 个字节是一个段落。很久以前在dos编程手册中找到的。我不知道为什么。但是真的有人再用了吗?

标签: assembly x86 intel terminology


【解决方案1】:

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 是另一个对 1​​6 字节进行操作的非向量指令,但英特尔在描述中的任何地方都没有使用“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 助记符才能读取编译器输出,所以如果内部函数只使用助记符而不是第二种命名方案。)

【讨论】:

【解决方案2】:

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

【讨论】:

  • 现在我想到它确实会混淆超过 64 位。也许 mbyte(x)/mword(x)/mdword(x)/mqword(x) 会减少太多名称的混淆。例如多基元。我可以想象人们难以记住 oword+ 中有多少字节的错误。
  • @Dmitry 我一开始就不喜欢 word/dword/qword 这个东西,我认为出于同样的原因它会让人困惑。最初只有“字节”和“字”,这没关系,但一旦“dword”出现,它就是一个糟糕的系统:)
  • @hobbs 问题是在 dword 出现之前花了相当长的时间...... ;)
  • 1.一开始有字,字有两个字节,没有别的。 2. 上帝把 1 和 0 分开,结果很好。 3. 上帝说,要有数据:有数据
  • 我一点也不觉得它令人困惑,除非我查看英特尔术语之外的任何内容。例如gdb 的 x 命令将 16 位元素称为半字。 ARM 甚至有 64 位的 d(双)寄存器和 128 位的 q 寄存器。现在那令人困惑,但原因很明显(当然,ARM 字是 32 位的)。
猜你喜欢
  • 1970-01-01
  • 2015-09-21
  • 1970-01-01
  • 2012-08-15
  • 2017-12-05
  • 1970-01-01
相关资源
最近更新 更多