在 x86 术语/文档中,“字”是 16 位因为 x86 是从 16 位 8086 发展而来的。随着扩展的添加而改变这个术语的含义只会令人困惑,因为英特尔仍然必须记录 16 位模式和所有内容,以及指令助记符,例如cwd
(符号扩展字到双字)将术语烘焙到 ISA 中。
- x86 字 = 2 字节
- x86 双字 = 4 字节(双字)
- x86 qword = 8 字节(四字)
- x86 double-quad 或 xmmword = 16 字节,例如
movdqa xmm0, [rdi]
.
也在cqo助记符,八字。 (将 RAX 符号扩展为 RDX:RAX,例如之前idiv
)
然后我们有有趣的指导,比如punpcklqdq:将两个 qword 混在一起形成一个 dqword,或者pclmulqdq用于 qword 的无进位乘法,产生 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 个字节(双字),例如米普斯
daddu
是64位整数加法
- qword = 16 字节(四字)(如果支持的话)。
“机器词”并在架构上贴上标签。
“机器字”的整体概念并不真正适用于 x86,其机器代码格式是字节流,并且对多个操作数大小的同等支持,以及大多数不关心自然对齐内容的未对齐加载/存储,仅关心普通可缓存内存的缓存行边界。
即使是“面向字”的 RISC,其寄存器和高速缓存访问的自然大小也可能与其指令宽度或文档中使用的“字”不同。
“字长”的整个概念总体上被高估了,不仅仅是在 x86 上。即使 64 位 RISC ISA 也可以以相同的效率加载/存储对齐的 32 位或 64 位内存,因此请选择对您所做的事情最有用的一个。不要将您的选择建立在确定哪一个是机器的“字大小”的基础上,除非只有一种最大有效大小(例如,某些 32 位 RISC 上的 32 位),然后您可以有效地将其称为字大小。
在我听说过的任何 64 位机器上,“单词”并不意味着 64 位。即使是从头开始设计为 64 位的 DEC Alpha AXP 也使用 32 位指令字。 IIRC,手册上称一个字为32位。
Being able使用单个指令将 64 位加载到整数寄存器中并不意味着“字大小”。位数和字长没有严格的特定技术含义;大多数 CPU 内部都有多种不同的大小。 (例如 64byte自 Haswell 以来,Intel 上的 L2 和 L1d 缓存之间的总线以及 32 字节 SIMD 加载/存储。)
因此,基本上由 CPU 供应商的文档作者来选择“word”(以及 dword / qword)对于其 ISA 的含义。
有趣的事实:SPARC64 谈论“短字”(32 位)与“长字”(64 位),而不是字/双字。我不知道不带任何限定符的“word”在 64 位 SPARC 文档中是否有任何含义。