6

我正在教我 12 岁的 8086 汇编语言,昨天我们在讨论内存、寻址和分段。我向他展示了如何将段可视化为从 16 字节边界开始的一系列重叠的 64Kb 块,偏移量是段内的 8080 样式指针。然后他问了一个我无法回答的问题:为什么(为了什么,出于什么目的)它们重叠

试图研究这个问题时,我发现了许多 20 位数学的副本,并且一些模糊地提到了这个方案可能允许的一些内存节省。有人可以详细说明节省内存的部分吗?或任何其他方式来实际利用重叠?

4

3 回答 3

6

重叠越少,您对段在物理内存中的起始位置的选择就越少。这会在无用的段之间产生间隙,从而浪费内存。设计选择永远不会产生大于 15 字节的间隙。这可能有点过头了,但 8086 是在一个 1 兆字节对每个人都足够的时代设计的。购买 64 KB 会大大降低您的预算。珍贵到不想浪费在差距上。

于 2012-01-04T14:37:50.593 回答
3

节省内存是完全错误的看待它的方式IMO。该处理器是在 16 位地址空间变得真正成熟的时候问世的紧的。其他 16 位地址空间处理器在事后采用了存储库切换方法。20 位地址空间是一个相当大的认可(24 位或 32 位在当时简直是疯话)。他们没有使用外部存储库切换(编程起来很痛苦),而是使用了寄存器。好吧,你猜怎么着,处理器内部是 16 位的,所以还不如使用 16 位寄存器。现在,从一对 16 位寄存器中取出 20 位是一个有趣的问题。使用段作为基本的段落对齐方式以最灵活的方式为您提供了完整的范围(加上一点超限,但这是一个完全不同的问题)(还记得我提到的银行切换的痛苦吗?这主要是因为无法做到这一点以细粒度的方式)。

于 2012-01-04T17:42:47.920 回答
2

假设您在一条狭长的小巷中拥有代客泊车服务,因此车辆均以平行泊车方式停放。您的一些客户驾驶汽车并且只使用 1 个空间。其他人驾驶加长豪华轿车,需要 2 个空间。一种停放车辆的方法是为每辆车分配 2 个车位,无论大小。您的索赔单上会显示“车辆停在 0 号空间(最大车辆大小为 2 个空间)”或“从 2 号空间开始”或“从 4 号空间开始”等。

这会起作用,但会浪费空间,因为您为只需要 1 个的汽车保留 2 个空间。因此,您将车辆打包在一起,汽车只占用一个空间,而豪华轿车占用两个空间。您的员工知道汽车只占用一个空间,因此如果一张票上写着“从 1 号空间开始(最大车辆大小为 2 个空间)”,他们就知道“汽车在 1 号空间,而 2 号空间属于其他人”。汽车的空间 2 实际上与停在空间 2 和 3 的豪华轿车重叠,但使用它是个坏主意,否则你会弄坏豪华轿车。

于 2012-01-04T14:22:41.010 回答