【问题标题】:How many bits does a WORD contain in 32/64 bit OS respectively?一个 WORD 在 32/64 位操作系统中分别包含多少位?
【发布时间】:2011-07-14 19:58:33
【问题描述】:

谁有明确的答案?

有人说在 32 位操作系统上 WORD 表示 16 位,对吗?

【问题讨论】:

  • 如果 WORD 是指 Win32 类型,那么在 Win16、Win32 和 Win64 平台上,WORD 始终是 16 位。
  • @compiler 在 what 其他上下文中?或者你真的认为开放式问题有封闭式答案吗?
  • 相关/可能的重复,尤其是关于:“word = 16-bit”的 x86 定义可以追溯到 8086,现在与现代 CPU 架构无关:What's the size of a QWORD on a 64-bit machine?Weird data sizes?

标签: word


【解决方案1】:

“词”的概念有多种含义。问题中包含 3 个含义。

  • 通用术语“处理器字”,在 CPU 架构的上下文中
  • 软件/操作系统的“位大小”与硬件的“位大小”
  • 全大写术语 WORD,表示 16 位值 - 这是 Windows“Win32”C 语言 API 的一部分

在描述 Win32 WORD 类型定义时,也会出现这种情况:

  • “字”、“双字”和“四字”的 Intel/AMD 指令集概念

通用术语“处理器字”,在 CPU 架构的上下文中

在通用/通用用法中,“处理器字”是指处理器寄存器的大小。它也可以指 CPU 指令的大小,或指针的大小(取决于具体的 CPU 架构)。在简单的情况下,32 位处理器将具有 32 位“字”大小(和指针大小)。 64 位处理器将具有 64 位“字”大小(和指针大小)。

a wikipedia article on this "processor word" concept 详细介绍了该术语的所有通用用法,以及几种当前和历史 CPU 架构的大小。

软件/操作系统的“位大小”与硬件的“位大小”

为了运行“64 位”软件,需要“64 位”CPU 和“64 位”操作系统。这可能是显而易见的。

“64 位软件”使用 64 位指令(例如,将 64 位数字相加,或同时将 64 位数据从处理器寄存器复制到 RAM)。它还可以使用 64 位指针大小。这意味着它理论上可以使用大约 170 亿 GB(16 艾字节)的 RAM,而不是只能使用最多 4 GB 的 RAM(如“32 位软件”)。

“64 位”x64/x86 CPU 也可以运行“32 位”(甚至“16 位”)软件。它可以做到这一点,而无需对代码进行任何更改,也无需重新构建软件。这是因为所有旧 CPU 指令仍然存在于新 CPU 上,并且它们是向后兼容的。

这些概念与“处理器字”的通用概念并不完全相同,但密切相关。

注意:当您谈论较旧和更专业的处理器(尤其是较旧的视频游戏系统)时,这个概念开始变得稍微复杂一些,但问题并不是关于这些,所以我不会详细说明。这些往往被称为“64 位”或“8 位”系统,但事实比这要复杂一些。请参阅the "processor word" wiki article I linked above,或有关相关特定系统的文章。

问题的具体上下文 - WORD,全部大写

问题中的大小写和具体大小(WORD 为 16 位,在 32 位操作系统上)暗示与通用术语“处理器字”不同的东西。

在旧版 Windows 编程(Win32 API)中,定义了一个名为 WORD 的宏,其大小为 16 位。当处理器是 16 位时,这是有道理的。但是,即使您为 32 位或 64 位目标编译包含此宏的代码,它仍然是 16 位。 Win32 API 中的DWORD 是 32 位,QWORD 是 64 位。

这是因为微软在他们的 Win32 API 中非常努力地支持向后兼容性,而无需对代码进行任何更改。在大多数情况下,您可以编译 Windows 95 时代的 Win32 示例而无需更改,并且它们在今天仍然可以完全一样地工作。

Microsoft 很可能从 Intel(可能还有 AMD)文档中继承了这种命名方案。

“字”、“双字”等的 Intel/AMD 指令集概念

在英特尔文档中,“字”(Win32 WORD) 是 16 位。 “双字” (Win32 DWORD) 是 32 位。 “四字” (Win32 QWORD) 是 64 位。相关的汇编指令名称也反映了这种命名方案(例如 MMX Add Packed Integers PADD 指令:PADDWPADDDPADDQ)。

对于一些示例,您可以check this wikipedia article on the x86 instruction setthe Intel software development manuals

就“处理器字”的一般概念而言,这种命名方案不一定有意义,因为这些概念仅针对寄存器的一部分。然而,它们在为 x86 程序创建稳定的编程接口方面确实有意义。这就是为什么您可以在“64 位”操作系统之上使用“32 位”(和 16 位)程序的重要原因。

【讨论】:

  • @Qix:如果你想要大小正好为 16 位的整数,是的,这正是你要做的。好吧,<cstdint>according to this answer。如果您“为了速度”尝试与处理器的字长对齐(我猜这是 WORD 宏的初衷),那么您可能想做其他事情,例如 @ 987654346@ 类型。
  • <cstdint> 如果你使用 C++,<stdint.h> 用于 C。另外,哇,从来不知道 int_fastX_t 类型。而且它们符合 c89 :D 谢谢你,更多的阅读要做。
  • 英特尔的software.intel.com/en-us/articles/intel-sdm#three-volume 到处都是。大概在 vol.1 的某个地方,他们实际上定义了word = 16 位。它在指令助记符和大多数 x86 汇编语言的语法中被广泛使用,例如8086 cbw sign-extends from byte to word 从 8 位 AL 到 16 位 AX。 AVX2 vpcmpeqw 对向量寄存器中打包的 16 位“字”元素进行 SIMD 比较。
  • 这些链接是来自 vol.2 指令集手册的 HTML 摘录,其中都使用了“word”/“16-bit word”和“32-bit dword”。无论如何,显然Microsoft's typedef unsigned short WORD 来自x86 asm,其中MS 的汇编程序(MASM)语法foo WORD 1, 2, 3static uint16_t foo[] = {1,2,3} 的asm 实现。对于 MS 的头文件,还有更多不更改的理由:它可能会破坏软件/至少导致 ABI 不兼容。顺便说一句,这不是“遗留”,至少仍然使用 DWORD。
  • 无论如何,x86 asm 助记符和 asm 语法在什么地方都使用“word”来表示 16 位的程度,无论 CPU 处于何种模式,使其完全不切实际。在手册的某个角落里,它并不是什么晦涩难懂的东西,如果你看过 x86 asm,它基本上无处不在。它只是大小的名称,除了 386 之前整数寄存器的原始最大宽度之外,它没有任何“含义”。x86 并没有真正的“字长”;它可以在同一程序中高效地对 8、16、32 或 64 位整数进行操作,并且指令的长度从 1B 到 15B 不等。
【解决方案2】:

没有确定的答案。

传统上,术语“字”是指处理器寄存器和主数据路径的大小。根据该定义,“单词”在 32 位系统上是 32 位,在 64 位系统上是 64 位。

但是,当处理器系列被扩展以添加更广泛的寄存器/操作模式时,这些处理器的制造商和用户有时会继续使用“字”来指代原始处理器的字长。当软件从一个处理器系列移植到另一个处理器系列时,也会发生同样的情况。

英特尔 x86 文档使用术语“字”¹来指代 16 位数量。这种用法渗透到最初为 x86 开发的软件环境中,例如 windows API 和 Borland 风格的 pascal。

另一方面,arm 文档使用术语“单词”² 来指代 32 位数量。

¹ 请参阅https://software.intel.com/sites/default/files/managed/a4/60/253665-sdm-vol-1.pdf 中的第 4.1 节

² 请参阅https://static.docs.arm.com/ddi0487/db/DDI0487D_b_armv8_arm.pdf 中的 A1.4 部分

【讨论】:

    【解决方案3】:

    一个 Word 是 16 位 DWord 的大小(双字)是 32 位在编程中使用的字大小的两倍,但是......

    操作系统中的单词名称是操作系统旁边显示的数字,所以如果它说 64 位,那么在这种情况下,一个单词(存储的地址)是 64 位的

    所以这取决于您从编程或操作系统编号的角度看待它

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 2011-04-17
      • 2012-07-26
      • 1970-01-01
      • 2011-12-18
      相关资源
      最近更新 更多