【问题标题】:Relation between size of address bus and memory size; memory Segmentation in 8086地址总线大小与内存大小的关系; 8086中的内存分段
【发布时间】:2020-06-14 12:07:34
【问题描述】:
我的问题与8086中的内存分割有关。我了解到,
8086 有一个 20 位地址总线。因此它可以处理 2^20 个不同的地址。这意味着它的内存大小为 2^20,即 1MB。
我有几个疑问:
我从 8086 有 20 位地址总线这一事实了解到,它可以有 2^20 种不同的 0 和 1 组合,每个组合代表一个物理地址。我不明白的是,2^20 个不同的地址位置如何意味着 1 MB 的可寻址内存?不同地址位置的总数与内存大小(以兆字节为单位)有何关系?
另外,如果我错了,请纠正我,8086 中的 16 位段寄存器保存内存中不同段的起始地址(代码、堆栈、数据、额外)。我的问题是,不是t 20 位内存中的地址?那么 16 位寄存器如何保存 20 位地址呢?如果它包含 20 位地址的高 16 位,处理器如何确定它必须指向的确切地址位置?
P.S:我是微处理器的初学者,完全依赖自学,如果我的问题看起来有点傻,请原谅。
提前致谢。
【问题讨论】:
标签:
cpu
cpu-registers
processor
microprocessors
memory-segmentation
【解决方案1】:
对于这个问题,重要的是要记住可能的内存地址数量与系统中安装的实际内存 (RAM) 数量之间存在差异。对于 8086,内存地址是 20 位长,这意味着有 2^20 个可能的内存地址(大小正好是 1 MiB,因为 1 MiB 是 1024 或 2^10 KiB 而 1 KiB 是 1024 或2^10 字节)。这并不意味着系统必须有 1 MiB 的 RAM,它很可能更少,但 8086 可能寻址的最多地址是 1 MiB;因此,如果地址空间中只有 RAM,则它可能拥有的最大 RAM 为 1 MiB。通常,您可能在地址空间中存在未填充任何内容的空白,一些地址空间用于 ROM 或其他外围设备。因此,地址空间的大小为 1 MiB,但这并不意味着系统中有 1 MiB 的 RAM/内存。
正确,8086 的段寄存器都是 16 位的。通过将适当的段寄存器与参数组合来创建内存地址(参数是指令使用的任何寻址模式的结果) 通过将参数添加到段寄存器的值移位 4 位。因此,例如,如果ss 是0x1111,sp 在0x2222 并且您执行push ax 指令,则将值推送到的20 位地址是(ss << 4) + sp 或0x11110 + 0x02222 = 0x13332 .更多信息可以在 Wikipedia 上的 Real Mode 部分找到:https://en.wikipedia.org/wiki/X86_memory_segmentation