2

我对位架构有点困惑。我只是找不到回答我问题的好文章,所以我想我会问。

问题一:

当谈到 16 位架构时,是否意味着每个 ram 地址都是 16 位长?因此,如果我在 C++ 中创建一个 int(32 位),该变量会占用 2 个地址吗?

问题2:

在 16 位架构中,RAM 内只有 2^16 (65536) 个地址。为什么他们不能添加更多?这是因为 16 位不能代表更高的值,因此不能引用 65535 以上的地址吗?

4

4 回答 4

2

当谈到 16 位架构时,是否意味着每个 ram 地址都是 16 位长?因此,如果我在 C++ 中创建一个 int(32 位),该变量会占用 2 个地址吗?

您必须问谁在谈论 16 位架构,他们的意思是什么。它们可能意味着地址是 16 位长。它们可能意味着通用 CPU 寄存器的长度为 16 位。他们可能意味着别的东西。但是我们无法知道某个假设的人可能意味着什么。对于什么使某物成为“16 位架构”,没有通用的定义。

例如,8032 是具有 8 位通用寄存器的 8 位架构。但它有一个 16 位指针寄存器,可用于寻址 65,536 字节的存储空间。

不管位数如何,几乎所有系统都使用字节地址。因此,一个 32 位变量将占用任何位数的机器上的 4 个地址。

在 16 位架构中,RAM 内只有 2^16 (65536) 个地址。为什么他们不能添加更多?这是因为 16 位不能代表更高的值,因此不能引用 65535 以上的地址吗?

对于 16 位,只有 65,536 种可能的方式来设置这些位。所以一个 16 位寄存器有 65,536 个可能的值。

于 2012-12-17T18:00:03.243 回答
1

取决于您对 8 位和 16 位架构的定义。

6502 被认为是 8 位 CPU,因为它在 8 位值(寄存器大小)上运行,但具有 16 位地址。

68000 被认为是 16 位 CPU,但具有 32 位寄存器和地址。

对于 x86,通常是地址大小来定义架构。

此外,“64 位”CPU 并不总是具有完整的 64 位外部地址总线。它们可能在内部处理该大小的地址,因此虚拟地址空间可能很大,但这并不意味着它们可以拥有那么多外部存储器。

于 2012-12-17T18:00:44.067 回答
1

来自 Wikipedia 的示例 - 所有内部寄存器以及内部和外部数据总线均为 16 位宽,牢固地确立了 8086 的“16 位微处理器”身份。20 位外部地址总线提供 1 MB 物理地址空间(2^20 = 1,048,576)。这个地址空间是通过内部“分段”解决的。数据总线与地址总线复用,以适应标准的 40 针双列直插式封装。16 位 I/O 地址意味着 64 KB 的独立 I/O 空间 (2^16 = 65,536)。最大线性地址空间被限制为 64 KB,这仅仅是因为内部寄存器只有 16 位宽。超过 64 KB 边界的编程涉及调整段寄存器(见下文),并且一直如此,直到 80386 引入更宽(32 位)的寄存器(和更高级的内存管理硬件)。

所以你可以看到没有固定的规则,一个 16 位架构将只有 16 个地址线。不要把两件事混为一谈,尽管这样相信是很直观的。

于 2013-10-16T12:26:04.133 回答
1
  1. 是的。请注意,尽管int在 16 位架构上通常只有 16 位宽。
    另请注意,说变量“占用”两个地址是没有意义的。正确的说法是 32 位变量在 16 位平台上与两个指针一样宽。 不管是什么架构,它仍然会占用四个字节的空间。

  2. 是的; 这正是 16 位地址的含义。
    请注意,这些地址中的每一个都指向一个内存字节。

于 2012-12-17T17:58:23.553 回答