QWORD 在 64 位机器上的大小是多少?

jso*_*net 7 assembly cpu-architecture cpu-word 32bit-64bit

我目前正在寻找上述问题的答案。到目前为止,我发现有人说,字长是指处理器寄存器的大小,这表明在 64 位机器上,字长为 64 位,因此 QWORD(4 * 字)的大小为 256 位。

但在另一方面,我发现像源说的大小将是128个比特(64个比特为32位和加倍此对64位),而即使这样其他建议的大小将是64个比特。但最后一个与 Microsoft 有某种关系,它通过将单词的大小定义为 16 位来混淆每个人,从而使情况变得更糟。

也许有人可以解决我的困惑并在这个主题上启发我。

Pet*_*des 17

在 x86 术语/文档中,“字”是 16 位,因为 x86 是从 16 位 8086 演变而来的。随着扩展的添加而改变术语的含义只会令人困惑,因为英特尔仍然必须记录 16 位模式和一切,以及指令助记符cwd(符号扩展字到双字)将术语烘焙到 ISA 中。

  • x86 字 = 2 字节
  • x86 双字 = 4 字节(双字)
  • x86 qword = 8 字节(四字)
  • x86 double-quad 或 xmmword = 16 字节,例如movdqa xmm0, [rdi].
    同样在cqo助记符中,oct-word。(将 RAX 符号扩展为 RDX:RAX,例如之前idiv

然后我们有有趣的指令,例如punpcklqdq:将两个 qwords 混洗成一个 dqword,或者pclmulqdq用于qwords 的无进位乘法,产生一个 dq 完整结果。但除此之外,SIMD 助记符往往是 AVXvextracti128或 AVX512(带有可选的每个元素屏蔽)vextractf64x4来提取 ZMM 寄存器的高 256 位。

更不用说像 "tbyte" = 10 字节 x87 扩展精度浮点数之类的东西;x86 很奇怪,并不是所有的东西都是 2 的幂。还有保护模式下的 48 位 seg:off 16:32 远指针。(基本上没用过,只是 32 位偏移部分。)


大多数其他 64 位 ISA 都是从 32 位 ISA(AArch64、MIPS64、PowerPC64 等)演变而来的,或者从一开始就是 64 位(Alpha),因此“字”在这种情况下表示 32 位。

  • 32 位字 = 4 字节
  • dword = 8 字节(双字),例如 MIPSdaddu是 64 位整数加法
  • qword = 16 字节(四字),如果支持的话。

“机器词”并在架构上贴上标签。

“机器字”的整个概念并不真正适用于 x86,其机器代码格式是字节流,并且对多个操作数大小的同等支持,以及大多数不关心自然对齐的未对齐加载/存储东西,只有普通可缓存内存的缓存线边界。

甚至“面向字”的 RISC 的寄存器和缓存访问的自然大小也可能与其指令宽度或其文档用作“字”的宽度不同。

“字大小”的整个概念通常被高估,而不仅仅是在 x86 上。即使是 64 位 RISC ISA 也可以以相同的效率加载/存储对齐的 32 位或 64 位内存,因此请选择对您正在做的事情最有用的那个。不要根据确定哪一个是机器的“字长”来做出选择,除非只有一种最大有效的大小(例如,某些 32 位 RISC 上的 32 位),那么您可以有用地将其称为字长。


“单词”并不意味着我听说过的任何 64 位机器上的 64 位。即使是从头开始设计为积极的 64 位的 DEC Alpha AXP,也使用 32 位指令字。IIRC,手册称一个字为 32 位位。

能够以64位加载到整数寄存器与单个指令不会使该“字大小”。 Bitness 和 word size 没有硬性特定的技术含义;大多数 CPU 内部有多种不同的尺寸。(例如,自 Haswell 以来,英特尔 L2 和 L1d 缓存之间的64字节总线,以及 32 字节 SIMD 加载/存储。)

因此,基本上由 CPU 供应商的文档作者来选择“word”(以及 dword / qword)对其 ISA 的含义。


有趣的事实:SPARC64 谈论“短字”(32 位)与“长字”(64 位),而不是字/双字。我不知道在 64 位 SPARC 文档中,没有任何限定符的“单词”是否有任何意义。

  • Sun 的 Sparc-64 文档谈到了“短字”(32 位)和“长字”(64 位)。因此,术语“字”可能是 32 位或 64 位字。 (2认同)