2016-04-06 27 views

回答

3

首先,汇编不是一种单一的语言,也不是一个单一的东西。你必须说出你正在谈论哪个架构,以便任何人给出正确的答案。

其次,段寄存器不总是乘以10。我甚至会说他们从来没有乘以10,因为10对二进制系统来说不是一个自然数。如果你问为什么,例如在x86架构中得到一个物理地址,CPU将segment寄存器乘以0x10(十进制数),并增加一个偏移量,答案是:因为设计者选择了这样的值。

接下来你会问为什么他们选择这个。一个16位的段寄存器可以保存从0到65535的值。乘以16将得到0到1048575之间的地址,即1MB。 1MB是一个很好的访问内存。

其他体系结构可能有不同的乘数,即使是非常数乘数也是如此。但他们很可能永远是2的幂。

2

为了理解设计决定,我们需要回到1974年。
那时我们没有现在的小型化,在一个包装中制造的很小。

1974年是英特尔刚刚推出8080芯片的一年,该芯片拥有16位地址总线,这意味着至多64 KiB内存是可寻址的。然而,8080主要有8位寄存器,所以程序员通常需要将两个寄存器配对以形成一个16位地址。

同时在1976年开始设计新芯片8086。设计人员意识到64 KiB内存太低,因此他们决定增加专用于内存寻址的引脚数量,但是芯片封装的引脚数量仍然存在很大的限制。
对于这款新芯片,他们解决了20位地址,或1 MiB的可寻址内存。
在考虑为什么20位我们进入的原因,影响的周期,我们需要考虑,其中包括,两个重要因素:

  1. 的引脚数量。它必须尽可能低。
  2. 寄存器的大小。你如何用16位数字编码20位数字?

16位是不够的,所以他们需要更多的位,最简单的解决方案将使用32位,配对两个寄存器。
但32位太过分了!
下一个明显的选择是24,16 + 8,因为它是8的倍数(一个字节)。
然而24位仍然太多。 根据Intel 8008 to 8086 by Stephen P. Morse et a, Pag. 17他们考虑了这个假设,但被拒绝。
如果他们不能有8的大小倍数,他们可能至少有4的倍数(半字节)。
所以他们解决了20位。

现在出现了一个问题:你如何使用16位数做20位数? 英特尔设计人员选择了众所周知的分段机制:其中一个数字(段)向左移4(乘以16或10h),然后再将它们相加在一起

更直接的方法是直接从段寄存器的低半字节中取出地址的额外4位。
他们可能拒绝这个出于各种原因,例如:一个)它浪费)段B的12位)也许它不能重用任何ALU部件Ç它不允许地址别名。

这样或那样的选择,因此每个x86兼容的CPU都需要实现这种分段模型,这是历史遗留问题。
此模型自80286以来已经扩展,并且实际上已弃用x64处理器。

相关问题