【问题标题】:Intel 8086: Why 4 memory segmentsIntel 8086:为什么是 4 个内存段
【发布时间】:2016-10-23 14:45:49
【问题描述】:

据我了解,8086处理器有4个内存段:堆栈段、代码段、数据段和额外段,以及对应的段寄存器(SS,CS,DS,ES )

问题是:“为什么?”
为什么不合并数据和代码段?
为什么我们需要 Extra Segment?
为什么是 4?

我知道这个问题可能听起来很枯燥,但我在去年在我的大学举办的“微处理器架构”考试中发现了这个问题。

提前致谢。

【问题讨论】:

  • 在 386+ 上还有更多。但是由于分段架构,如果您正在从一个段复制到另一个段或需要临时访问 DS 之外的段(例如视频内存),则 ES 非常方便)。如果您在默认情况下将 CS 和 DS 组合在一起,您将被限制为 CS=DS(并且两者都在同一个 64kb 段中)。通过拆分 CS 和 DS,您可以轻松地创建一个程序,其中 CS 在一个 64kb 段中,DS 在另一个段中。在 286+ 上,这些段在保护模式下具有不同的含义。
  • 一条指令特别是movs (b/w/l) 允许从一个段复制到另一个段(或同一个段)。默认情况下,源在 DS:SI 中,目标地址在 ES:DI 中。

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


【解决方案1】:

首先,让我们假设我们已经决定使用分段架构(事实上,首先存在分段)。该决定的“原因”将超出范围。

你拥有的段寄存器越多,电路就越复杂,它在芯片上占用的空间就越大,价格也就越贵;因此,如果它们大部分时间都处于闲置状态,您不一定要添加几十个1。你需要多少?

代码需要一个,那就是 CS。

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

您可以将这两个中的一个用于堆栈吗?是的,但又要付出高昂的代价。使用 DS 严重限制了程序使用超过 64kb 数据的能力。堆栈段(通常)对程序来说是全局的,所以如果它位于 DS 上,你不能在不丢失堆栈的情况下更改 DS,并且在你回到“主“DS。使用 CS 也有类似的问题。你不能做 FAR CALLs,即有更多的代码段,因为它们会破坏堆栈。所以,你需要一个专用的SS。请注意,您还可以决定将堆栈固定在某个硬编码的内存位置,并且您不需要显式的 SS。这是有道理的,我相信有些架构会这样做,但是当一个大堆栈会浪费时,你会失去分配较小堆栈的灵活性,甚至会失去使用多个堆栈等更高级的技术。

仅凭这三个,您就可以完成很多工作。但是,在某些时候,您将不得不在两个段之间复制或比较数据,并且您需要一种方便的方法来执行此操作,不需要将一个字加载到通用寄存器、更改段、加载另一个字、更改段返回...拥有一个额外的数据段使代码更加紧凑和高效。所以我们有了 ES,这就是我们的四个段寄存器。

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2013-06-13
    • 2013-12-14
    • 1970-01-01
    • 2012-09-19
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多