在 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。
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 字节(双字),例如MIPSdaddu
是 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 的大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章
如果机器有 64 位字,则将两个 129 字数相乘需要多少位?