我听说 8086 有 16 位寄存器,它只能寻址 64K 的内存。然而,它仍然能够处理需要 20 位寄存器的 1MB 内存。它通过使用另一个寄存器来保存另一个 16 位,然后将 16 位寄存器中的值与另一个寄存器中的值相加,从而能够生成可寻址高达 1MB 内存的数字。那正确吗?
为什么这样做?似乎有 32 位寄存器,这足以解决 1MB 的内存。
我听说 8086 有 16 位寄存器,它只能寻址 64K 的内存。然而,它仍然能够处理需要 20 位寄存器的 1MB 内存。它通过使用另一个寄存器来保存另一个 16 位,然后将 16 位寄存器中的值与另一个寄存器中的值相加,从而能够生成可寻址高达 1MB 内存的数字。那正确吗?
为什么这样做?似乎有 32 位寄存器,这足以解决 1MB 的内存。
the 8088 (and by extension, 8086) is instruction compatible with its ancestor, the 8008, including the way it uses its registers and handles memory addressing. the 8008 was a purely 16 bit architecture, which really couldn't address more than 64K of ram. At the time the 8008 was created, that was adequate for most of its intended uses, but by the time the 8088 was being designed, it was clear that more was needed.
Instead of making a new way for addressing more ram, intel chose to keep the 8088 as similar as possible to the 8008, and that included using 16 bit addressing. To allow newer programs to take advantage of more ram, intel devised a scheme using some additional registers that were not present on the 8008 that would be combined with the normal registers. these "segment" registers would not affect programs that were targeted at the 8008; they just wouldn't use those extra registers, and would only 'see' 16 addres bits, the 64k of ram. Applications targeting the newer 8088 could instead 'see' 20 address bits, which gave them access to 1MB of ram
8086 中的段寄存器也是 16 位宽。但是,段号在添加到基地址之前会左移四位。这给了你 20 位。
实际上这与寄存器的数量无关。重要的是寄存器的大小。一个 16 位寄存器最多可以保存 2^16 个值,因此它可以寻址 64K 字节的内存。
要寻址 1M,您需要 20 位 (2^20 = 1M),因此您需要为额外的 4 位使用另一个寄存器。
我听说 8086 有 16 个寄存器,只能寻址 64K 的内存。然而,它仍然能够处理需要 20 个寄存器的 1MB 内存。
您误解了寄存器的数量和寄存器的宽度。8086 有八个16 位“通用”寄存器(可用于寻址)和四个段寄存器。16位寻址意味着它只能支持2 16 B = 64 KB的内存。通过从段寄存器中再获得 4 位,我们将有 20 位可用于寻址总共 2 4 *64KB = 1MB 的内存
为什么这样做?看起来有 32 个寄存器,对于 1MB 的内存来说已经绰绰有余了。
如前所述,8086 没有 32 个寄存器。即使是现在的 x86-64 也没有 32 个通用寄存器。寄存器的数量与机器可以处理多少内存无关。只有地址总线宽度决定了可寻址内存的数量
在 8086 的时候,内存非常昂贵,640 KB 是一个巨大的数字,人们认为在不久的将来不会达到。即使有很多钱,也可能无法获得如此大量的 RAM。所以没有必要使用完整的 32 位地址
此外,用现代技术生产 32 位 CPU 也并非易事。即使是今天的 64 位 CPU,也并非设计为使用所有 64 位地址线
这将需要更多的电线、寄存器、硅……以及更多的人力来设计、调试……具有更宽地址空间的 CPU。由于 70 至 80 年代技术的晶体管尺寸有限,这甚至可能无法实现。
8086 没有任何 32 位整数寄存器;几年后,在晶体管预算高得多的 386 中出现了这种情况。
8086 的分段设计对于希望能够使用 20 位线性地址的仅 16 位 CPU 来说是有意义的。
段寄存器可能只有 8 位或具有更大移位的东西,但显然细粒度分段有一些优势,其中段起始地址可以是任何 16 字节对齐的线性地址。(线性地址是从 计算的(seg << 4) + off
。)