我听说8086有16个寄存器,只允许64K内存。然而它仍然能够处理1MB的内存,这需要20个寄存器。它通过使用另一个寄存器来保持另外16位,然后将16个寄存器中的值添加到另一个寄存器中的值,以便能够生成可以寻址高达1MB内存的数字。是吗?
为什么这样做?似乎有32个寄存器,这足以解决1MB的内存问题。
答案 0 :(得分:1)
实际上这与寄存器的数量无关。它的寄存器大小很重要。 16位寄存器最多可以保存2 ^ 16个值,因此可以处理64K字节的存储器。
要解决1M问题,需要20位(2 ^ 20 = 1M),因此需要使用另一个寄存器来获得额外的4位。
答案 1 :(得分:1)
8086中的段寄存器也是16位宽。但是,在添加到基址之前,段号向左移位4位。这给你20位。
答案 2 :(得分:1)
英特尔没有采用新的方式来解决更多内存问题,而是选择让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
计算线性地址。)