在 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 文档中是否有意义。