实模式下的地址分段
实模式下的地址分段
在程序里我们可能要操作一些位于内存中的数据,如何找到这些数据呢?当然是通过地址。
程序在执行之前需要加载到内存中,数据也是如此。如果我们直接把需要操作的数据的地址写死在程序代码中,若程序和数据加载的地址发生了变化,那么代码中写死的地址就无效了。
为了解决这个问题,我们引入了分段机制。简单来说就是把物理地址分成若干逻辑段,用于存放指令和数据。每个段的起始地址就是段地址,代码中的地址是段内偏移地址。真实的物理地址由段地址加上偏移地址得到。段地址是程序加载时就写入段寄存器中的。
CS和DS寄存器就分别用于存放代码段地址和数据段地址。ES为附加段地址寄存器,SS为堆栈段地址寄存器。
在8086处理器中,段寄存器是16位的,但是该处理器却有20条地址总线。如何利用16位的段寄存表示20位的地址呢?为此,真实的物理段地址需要右移四位,也就是除以16,这样就得到了16位的逻辑段地址。这就要求段地址必须是16的整数倍。当需要形成物理地址的时候,段寄存器中的段地址就乘以16,再加上代码中的偏移地址就可以得到真实的物理地址。形成物理地址的工作是由一个叫总线接口部件的部件完成的。
16位的段寄存器最多可以表示2的16次方个段地址,20位地址总线最多可以访问1MB个地址。也就是说,每个段的最大是64KB。由此也可以算得每个段最小的大小和最大段数量。