英特尔8086:为什么有4个内存段

时间:2016-06-21 21:22:57

标签: cpu-registers x86-16 cpu-architecture

据我所知,8086处理器有4个内存段:堆栈段,代码段,数据段和额外段,以及相应的段寄存器(SSCS,{{1 }},DS

问题是:"为什么?"
为什么不组合数据和代码段?
为什么我们需要额外细分? 为什么4?

我知道这个问题可能听起来很沉闷,但我在其中一个微处理器架构中找到了这个问题'去年在我大学里的考试。

提前致谢。

1 个答案:

答案 0 :(得分:3)

首先,让我们假设我们决定使用分段架构(事实上首先存在细分市场)。 "为什么"该决定将超出范围。

您拥有的段寄存器越多,电路越复杂,芯片占用的空间越多,获得的成本就越高;因此,如果他们大部分时间都在闲置,那么你一定不想扔掉几十个 1 。你需要多少?

你需要一个代码和那个CS。

您可以对代码和数据使用相同的段寄存器,但这严重阻碍了您拥有超过64kb代码+数据的能力。你不能暂时"改变CS"访问内存另一部分的数据,因为CS是代码运行的地方。只有一个寄存器,没有程序能够访问距离代码超过64kb的内存(实际上要少得多)。您肯定需要至少一个数据段(DS)

你能用这两个中的一个作为堆栈吗?是的,但又是高成本的。使用DS会严重限制程序使用64kb以上数据的能力。堆栈段(通常)是程序的全局,因此如果它位于DS上,则无法在不丢失堆栈的情况下更改DS,并且在返回之前您将无法进行CALL到#34;主要" DS。使用CS也有类似的问题。你不可能进行FAR CALL,因为它们会破坏堆栈。所以,你需要一个专用的SS。请注意,您还可以决定将堆栈修复为某个硬编码内存位置,并且您不需要显式SS。这是有效的,我相信有些架构可以做到这一点,但是当大型堆栈浪费时,或者甚至使用多个堆栈等更高级的技术时,您将失去分配较小堆栈的灵活性。

只有这三个人你才能完成很多。但是,在某些时候,您将不得不在两个段之间复制或比较数据,并且您需要一种方便的方法来执行它,不需要将一个字加载到通用寄存器,更改段,加载另一个字,改变段...有一个额外的数据段使代码更紧凑和有效。所以我们有ES,那就是我们的四段寄存器。

更多的段寄存器是可能的,它们可以更方便地同时处理两个以上的数据段,但它们是奢侈品,不再是必需品。从80386开始,x86架构确实获得了一对额外的补充寄存器(FS和GS),它们的用途与ES相同。

1 段寄存器不是通用寄存器,因此通常的RISC参数不一定适用;此外,在x86架构设计之后,RISC也很顺利。