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

Posted

技术标签:

【中文标题】在 64 位机器上 QWORD 的大小是多少?【英文标题】:What's the size of a QWORD on a 64-bit machine? 【发布时间】:2019-08-21 04:18:25 【问题描述】:

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

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

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

【问题讨论】:

也相关:What comes after QWORD? 【参考方案1】:

在 x86 术语/文档中,“单词”是 16 位,因为 x86 是从 16 位 8086 演变而来的。在添加扩展时更改术语的含义会令人困惑,因为英特尔仍然需要记录 16 位模式和所有内容,并且像 cwd(符号扩展字到 dword)这样的指令助记符将术语写入 ISA。

x86 字 = 2 个字节 x86 dword = 4 字节(双字) x86 qword = 8 字节(四字) x86 双四进制或 xmmword = 16 字节,例如movdqa xmm0, [rdi]. 同样在cqo mnemonic,八进制字。 (将 RAX 签名扩展为 RDX:RAX,例如在 idiv 之前)

然后我们有有趣的指令,如punpcklqdq:将两个 qword 混洗成一个 dqword,或 pclmulqdq 用于 qword 的无进位乘法,产生 dq 完整结果。但除此之外,SIMD 助记符往往是 AVX vextracti128 或 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 字节(双字),例如MIPS daddu 是 64 位整数加法 qword = 16 字节(四字),如果完全支持的话。

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

“机器字”doesn't really apply to x86 的整个概念,其机器码格式是字节流,并且同等支持多种操作数大小,以及大多不关心自然对齐内容的未对齐加载/存储, 仅适用于普通可缓存内存的缓存行边界。

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

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


“单词”并不意味着我听说过的任何 64 位机器上的 64 位。甚至 DEC Alpha AXP,从一开始就被设计为积极的 64 位,使用 32 位指令字。 IIRC,手册中调用了一个word 32-bit bits。

能够通过一条指令将 64 位加载到整数寄存器中,这并不意味着“字长”。 位数和字长没有硬性的具体技术含义;大多数 CPU 在内部都有多种不同的尺寸。 (例如,自 Haswell 以来,英特尔 L2 和 L1d 缓存之间的 64 个 byte 总线,以及 32 字节 SIMD 加载/存储。)

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


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

【讨论】:

Sun 的 Sparc-64 文档谈到“短字”(32 位)和“长字”(64 位)。因此,术语“单词”可能是 32 位或 64 位单词。 请注意,xmmword 用于 x86 16 字节值,至少在当前版本的 MASM 中(例如 Visual Studio 中的版本)。

以上是关于在 64 位机器上 QWORD 的大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章

32位机器可以访问多少内存?

如果机器有 64 位字,则将两个 129 字数相乘需要多少位?

32 位和 64 位版本的 windows 操作系统的页面大小是多少?

Linux系统最大支持多少的内存?

一个电脑最多能开启多少个线程

C++ 标准规定 int、long 类型的大小是多少?