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

标签 assembly 32bit-64bit cpu-architecture word

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

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

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

最佳答案

在 x86 术语/文档中,“单词”是 16 位 因为 x86 是从 16 位 8086 演变而来的。随着扩展的增加而改变这个术语的含义会让人感到困惑,因为英特尔仍然必须记录 16 位模式和一切,以及像 cwd 这样的指令助记符。 (将单词符号扩展为 dword)将术语放入 ISA。

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

  • 然后我们有有趣的指令,比如 punpcklqdq : 将两个 qwords 混合成一个 dqword,或 pclmulqdq 用于 qwords 的无进位乘法,产生 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 位。即使是从头开始设计为积极的 64 位的 DEC Alpha AXP,也使用 32 位指令字。 IIRC,手册称一个字为 32 位位。
    能够使用单个指令将 64 位加载到整数寄存器中并不能使其成为“字长”。 位数和字长没有硬性的特定技术含义 ;大多数 CPU 内部有多种不同的尺寸。 (例如,自 Haswell 以来,英特尔 L2 和 L1d 缓存之间的 64 字节总线,以及 32 字节 SIMD 加载/存储。)
    因此,基本上由 CPU 供应商的文档作者来选择“word”(以及 dword/qword)对其 ISA 的含义。

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

    关于assembly - QWORD 在 64 位机器上的大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55430725/

    相关文章:

    c - 跳转到 ARM 上的 Naked 函数

    assembly - 6502 带标签的寻址方式

    Python:如何为 64 位 python 导入 32 位模块

    为32位cpu编译Linux内核模块

    cpu - SIMD 是否需要多核 CPU?

    使用 AND、OR、SHR 和 SHL 指令以及数组将循环从 x86 汇编语言转换为 C 语言

    assembly - 如何在Z80 ASM中重复将两个字节写入RAM block

    rename - 当我们可以增加架构中的寄存器数量时,为什么要重命名寄存器?

    c# - 我的程序如何确定它是在 32 位还是 64 位 Windows 上运行?

    assembly - 如果处理器不产生中断,系统软件必须做什么?