【问题标题】:Why does the 8086 use an extra register to address 1MB of memory?为什么 8086 使用额外的寄存器来寻址 1MB 的内存?
【发布时间】:2011-11-06 06:05:27
【问题描述】:

我听说 8086 有 16 位寄存器,它只能寻址 64K 的内存。然而,它仍然能够处理需要 20 位寄存器的 1MB 内存。它通过使用另一个寄存器来保存另外 16 位,然后将 16 位寄存器中的值与另一个寄存器中的值相加,从而能够生成可寻址高达 1MB 内存的数字。对吗?

为什么会这样?好像有 32 位的寄存器,对于 1MB 的内存来说已经绰绰有余了。

【问题讨论】:

    标签: memory-management x86-16 memory-address cpu-registers memory-segmentation


    【解决方案1】:

    其实这与寄存器的数量无关。重要的是寄存器的大小。一个 16 位寄存器最多可以保存 2^16 个值,因此它可以寻址 64K 字节的内存。

    要寻址 1M,您需要 20 位 (2^20 = 1M),因此您需要为额外的 4 位使用另一个寄存器。

    【讨论】:

    • 如果只需要4位,那为什么段寄存器是16位而不是4位呢?
    【解决方案2】:

    8086 中的段寄存器也是 16 位宽。但是,段号在添加到基地址之前会左移四位。这给了你 20 位。

    【讨论】:

    • 为什么不使用段寄存器中的 4 位,而不是移位和相加?
    • 它使用段寄存器中的所有 16 位:DS:[AX] 使用 (DS
    【解决方案3】:

    8088(以及扩展为 8086)与其祖先 8008 指令兼容,包括它使用寄存器和处理内存寻址的方式。 8008 是一个纯粹的 16 位架构,它真的无法处理超过 64K 的内存。在创建 8008 时,这足以满足其大部分预期用途,但在设计 8088 时,显然还需要更多。

    英特尔没有采用新方法来寻址更多内存,而是选择使 8088 与 8008 尽可能相似,其中包括使用 16 位寻址。为了让较新的程序能够利用更多的内存,英特尔设计了一个方案,使用一些 8008 上不存在的额外寄存器,这些寄存器将与普通寄存器结合使用。这些“段”寄存器不会影响针对 8008 的程序;他们只是不会使用那些额外的寄存器,并且只会“看到” 16 个地址位,即 64k 的 ram。以较新的 8088 为目标的应用程序可以改为“看到”20 个地址位,这使它们能够访问 1MB 的内存

    【讨论】:

    • 为什么不直接使用段寄存器的 4 个附加位?使用所有 16 位然后将它们加在一起以创建 20 位值似乎很浪费。
    • 从 80386 开始,这正是“虚幻模式”中发生的情况。早期处理器上“实模式”的 16
    【解决方案4】:

    我听说 8086 有 16 个寄存器,只能寻址 64K 的内存。然而它仍然能够处理需要 20 个寄存器的 1MB 内存。

    您误解了寄存器的数量和寄存器的宽度。 8086 具有 八个 16 位“通用”寄存器(可用于寻址)以及 四个段寄存器。 16 位寻址意味着它只能支持 216 B = 64 KB 的内存。通过从段寄存器中再获得 4 位,我们将有 20 位可用于寻址总共 24*64KB = 1MB 的内存

    为什么会这样?看起来有 32 个寄存器,对于 1MB 的内存来说已经绰绰有余了。

    如前所述,8086 没有 32 个寄存器。即使是现在的 x86-64 也没有 32 个通用寄存器。寄存器的数量与机器可以处理多少内存无关。只有地址总线宽度决定了可寻址内存的数量

    在 8086 时代,内存非常昂贵,640 KB 是一个巨大的数字,人们认为在不久的将来不会达到。即使有很多钱,也可能无法获得如此大量的 RAM。所以没有必要使用完整的 32 位地址

    此外,用现代技术生产 32 位 CPU 并不容易。即使是今天的 64 位 CPU,也并非设计为使用所有 64 位地址线

    这将需要更多的电线、寄存器、硅片...以及更多的人力来设计、调试...一个具有更宽地址空间的 CPU。由于 70 至 80 年代技术的晶体管尺寸有限,甚至可能无法实现。

    【讨论】:

    • 我很确定 OP 的意思是 16 位、20 位和 32 位。这个问题是有道理的,而误解是 8086 没有 32 位寄存器,这是后来出现的。如果他们认为 20 是一个计数,那么他们说 20 个寄存器可以让您寻址 1MB 是没有意义的。 (除非他们在模仿他们完全误解的东西?)
    【解决方案5】:

    8086 没有任何 32 位整数寄存器;几年后,386 的晶体管预算要高得多。

    8086 的分段设计对于希望能够使用 20 位线性地址的 16 位 CPU 来说是有意义的。

    段寄存器可能只有 8 位或具有更大移位的东西,但显然细粒度分段有一些优势,其中段起始地址可以是任何 16 字节对齐的线性地址。 (线性地址是从(seg << 4) + off 计算出来的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 2018-01-16
      相关资源
      最近更新 更多