为什么要在段寄存器地址末尾添加 4 个“零”位(0000)来获取物理内存中的段地址?

为什么要在段寄存器地址末尾添加 4 个“零”位(0000)来获取物理内存中的段地址?

为什么我们必须在内存中找到一个有 20 位可用空间的地址,其中有 16 位用于段寄存器和 4 个“零”位?

例如,如果CS寄存器是346AH,则主存储器中的代码段将是346A0H,即20位。我们为什么要这样做?

内存段为 64Kbytes (?),除了那 20 位之外,其余空间会怎样?

抱歉,我不太擅长计算机架构!

答案1

例如,如果CS寄存器是346AH,则主存储器中的代码段将是346A0H,即20位。我们为什么要这样做?

显然你指的是x86 分段,最初用于 Intel 8086/88 CPU。这种“段”不是通用的。还有其他内存定义““。

从历史角度来看,你需要意识到硅和(铁氧体)内存曾经非常昂贵。为了对抗昂贵的大型计算机,小型计算机20 世纪 70 年代出现了一种低成本计算机。这种低成本的重点通常意味着 16 位地址总线(例如 DEC PDP、Data General Nova、HP 21xx)和高达 64KB 的内存。但随着系统要求的增长,通常需要更多的内存。

设计了内存方案,这些方案仍可使用现有的 16 位地址,但可以访问更多内存。
使用 16 位地址扩展 64KB 内存容量的最常见技术是使用内存组,即有效内存地址的实际高位由内存组寄存器指定。使用内存组的主要优势在于它可以在内存子系统中实现(即 CPU 外部),因此可以改装到任何 CPU。
随着微处理器的出现,使用 16 位寻址的系统(例如 Intel 8051、Zilog Z80)倾向于以类似的方式发展,即采用内存组。

Intel x86(以及我所知道的至少一个其他系统)使用的段寻址与处理器集成在一起,因此更加通用。
内存组只能占用原始内存空间中的固定区域,而 x86 段使用 16 位偏移量结合段寄存器规范来访问扩展的 20 位地址空间。

x86 段地址实际上是截断为仅 16 个地址位的 20 位地址。
该段可以从任何段落开始(地址模 16 为零)。
因此需要附加四个截断的零位,以获得 20 位内存空间中 x86 段的实际起始位置。
取决于x86 内存模型,x86 软件可以主要使用 16 位“地址”(就像旧的软件一样),但可以访问比旧的 16 位地址软件更有效的内存。

换句话说,x86 段是一种将硬件扩展为 20 位地址总线的方法,但允许软件主要使用 16 位“地址”,而不需要 20 位算术(即 20 位宽的寄存器和数据)。

相关内容