3-浅谈8086CPU的内存分段机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35733751/article/details/84947591

1. 内存分段

在上一篇我们知道8086CPU在访问内存使用了分段机制,即通过“(段地址×16)+偏移地址=物理地址”的方式来确定内存单元的物理地址,需要明白的是内存空间是一个连续的线性空间,对于内存本身来说并没有划分段,这其实是CPU为了方便寻址而使用了内存分段机制。

简单一句话理解就是内存本身并不分段,而是CPU为了方便寻址对内存进行了分段(对于这种说法,可能会对初学者产生一种误解,误认为内存好像分成了一个一个段,每一个段都有一个段地址,但是我们需要明确这种说法只是针对CPU的,而不是内存本身)。CPU对内存分段的目的是为了方便管理,降低程序开发难度,为设计功能更可靠,规模更大的程序奠定基础。 

 

 

同一段内存,多种分段方案如下:

10000H到100FFH组成一个段,起始地址( 基础地址,向左移4位) 为10000H,段地址为1000H, 偏移的大小为100H。当这段内存分成两个段后,起始地址( 基础地址 )为10000H和10080H,段地址为1000H和1008H, 大小均为80H。

 

我们知道当段地址向左移4位,实际上就是乘以16,换句话说一个段的起始地址也一定是16的倍数。

偏移地址为16位,16 位地址的寻址能力为64K,所以一个段的长度最大为64K。

 

现在有一个物理地址为21F60H,段地址为2000H,把段地址向左移4位后就是20000H,再用物理地址减去段地址,那么就很容易推出偏移地址为1F60H。

 

在8086PC机中存储单元地址是怎样表示的呢?如果数据在21F60H内存单元中,段地址是2000H,地址表示如下:

  1. 数据存在内存2000:1F60单元中
  2. 数据存在内存的2000H段中的1F60H单元中

另外,段地址和数据都是重要的,因此处理器至少需要提供两个段寄存器,分别是代码段寄存器(Code Segment,CS)和数据段寄存器(Data Segment,DS)。对CS内容的改变将导致处理器从新的代码段开始执行。同样的,在开始访问内存中的数据之前,也必须让DS寄存器指向数据段。

通常情况下,段地址的选择取决于内存中哪些区域是空闲的,例如从物理地址00000H开始,到82215H之间的内存都被其他程序占用了,那么可以从82215H后面的空闲的内存区域开始加载程序。

 

2. 代码段和数据段

程序的本质上是一个机器指令的集合,这一堆指令会放到内存中的某个位置。处理器是自动化器件,在给出了起始地之后,就从这个地址开始自动的取出每一条指令并执行,这意味着程序的所有指令都必须集中在一起,形成一个段,而这个段就叫代码段。

CPU执行指令的时候,总是会需要使用一些数据进行运算,这些数据也会集中放在内存的某个位置,形成一个段,叫数据段。前面我们也说过,内存是不存在分段的,所以无论是代码段,还是数据段,这些都是我们抽象出来的,实际上并没有改变内存的物理性质。

对于CPU来说,它根本不理解什么代码段和数据段,CPU只是受到程序员的控制,从哪里获取指令,从哪里获取数据,做什么运算处理等。如果下一次执行程序时,代码段和数据段在内存的位置发生了变化,那么只要把它们的段地址传到DS和CS寄存器中,那么CPU就能够从DS和CS寄存器知道数据段的段地址和代码段的段地址,从而正确的执行程序。

猜你喜欢

转载自blog.csdn.net/qq_35733751/article/details/84947591
今日推荐