为什么8086使用额外的寄存器来处理1MB的内存?

时间:2011-08-29 18:36:53

标签: memory-management bit-manipulation cpu-registers

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

为什么这样做?似乎有32个寄存器,这足以解决1MB的内存问题。

5 个答案:

答案 0 :(得分:1)

实际上这与寄存器的数量无关。它的寄存器大小很重要。 16位寄存器最多可以保存2 ^ 16个值,因此可以处理64K字节的存储器。

要解决1M问题,需要20位(2 ^ 20 = 1M),因此需要使用另一个寄存器来获得额外的4位。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

8088(扩展名为8086)是与其祖先8008兼容的指令,包括它使用其寄存器和处理存储器寻址的方式。 8008是一个纯粹的16位架构,实际上无法解决超过64K的内存。在创建8008时,这对于大多数预期用途来说已足够,但到8088设计时,显然需要更多用途。

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

答案 3 :(得分:0)

在8086时,内存非常昂贵,640KB是一些人认为有时不会达到的数量。即使有很多钱,也无法获得大量的RAM。所以不需要使用完整的32位地址。

此外,使用现代技术生产32位CPU并不容易。即便是今天的64位CPU也不能使用所有64位地址线。它需要更多的电线,寄存器,硅胶......以及更多的人力设计,调试...... CPU。 70年代到80年代,技术有限的晶体管尺寸甚至可能无法实现。

答案 4 :(得分:0)

8086没有任何32位整数寄存器。几年后的386年,晶体管的预算大大提高了。

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

段寄存器可能只是8位或移位较大的内容,但是显然,细分的段具有一些优点,其中段的起始地址可以是任何16字节对齐的线性地址。 (根据(seg << 4) + off计算线性地址。)