现在的位置: 首页 > 综合 > 正文

存储器分段和地址的形成

2014年01月20日 ⁄ 综合 ⁄ 共 2366字 ⁄ 字号 评论关闭
文章目录

从8086开始采用分段的方法管理存储器。只有充分理解存储器分段的概念存储器逻辑地址和物理地址的关系,才能熟练地使用8086/8088汇编语言。

1. 存储单元的地址和内容

* 存储单元的地址是无符号数,n 位二进制数总共能够表示 2n 个存储单元的地址。为了书写方便,存储单元地址常采用十六进制数表示。

* 当以字方式存取字时,处理器自动采用“高高低低”原则。

2. 存储器的分段

* 8086/8088 CPU 有 20 根地址线,可直接寻址的物理地址空间为 1M 字节(=220)。

* 系统存储器由以字节为单位的存储单元组成,存储单元的物理地址长 20 位,范围是 00000H 至 FFFFFH。

* 为什么要分段
8086/8088 微处理器内部数据通路和寄存器皆为 16 位,内部 ALU 只能进行 16 位运算,在程序中也只能使用 16 位地址,寻址范围局限在 216=65536(64K)字节。
通过对存储器分段使用段寄存器的方法,8086/8088 有效地实现了寻址 1M 字节物理空间。

* 根据需要把 1M 字节地址空间划分成若干逻辑段。每个逻辑段必须满足如下两个条件:
第一,逻辑段的开始地址必须是 16 的倍数;
第二,逻辑段的最大长度为 64K。

* 按照这两个条件,1M 字节地址空间最多可划分成 64K 个逻辑段,最少也要划分成 16 个逻辑段。
第一个条件与段寄存器长 16 位有关;(16 位扩展成 20 位,地址按照 {0000,0000,0000,0000,0000} {0000,0000,0000,0001,0000} {0000,0000,0000,0010,0000} 递增)
第二个条件与指针寄存器长 16 位有关。

3. 物理地址的形成

由于段的起始地址必须是 16 的倍数,所以段起始地址有如下形式:
bbbb,bbbb,bbbb,bbbb,0000
用 16 进制可表示成 XXX0。这种 20 位的段起始地址,可压缩表示成 16 位的 XXXX 形式。
我们把 20 位起始地址的高 16 位 XXXX 称为段值。显然,段起始地址等于段值乘 16(即左移 4 位)。

要访问的某一个存储单元总是属于某个段。我们把存储单元的地址与所在段的起始地址的差称为段内偏移,简称为偏移。在一个段内,通过偏移可指定要访问的存储单元,或者说要访问的存储单元可由偏移量来指定。在整个 1M 地址空间中,存储单元的物理地址等于段起始地址加上偏移。

于是,存储单元的逻辑地址由段值和偏移量两部分组成,用如下形式表示:
段值:偏移

根据逻辑地址可方便地得到存储单元的物理地址,计算公式如下:
物理地址=段值×16+偏移
通过移位和算术加可容易地实现上述公式。

采用段值和偏移构成逻辑地址后,段值由段寄存器给出,偏移可由指令指针 IP、堆栈指针 SP 和其他可作为存储器指针使用的寄存器(SI、DI、BX 和 BP)给出,偏移还可直接用 16 位数给出。指令中不使用物理地址,而是使用逻辑地址,由总线接口单元 BIU 按需要根据段值和偏移自动形成 20 位物理地址。

从8086开始采用分段的方法管理存储器。只有充分理解存储器分段的概念存储器逻辑地址和物理地址的关系,才能熟练地使用8086/8088汇编语言。

1. 存储单元的地址和内容

* 存储单元的地址是无符号数,n 位二进制数总共能够表示 2n 个存储单元的地址。为了书写方便,存储单元地址常采用十六进制数表示。

* 当以字方式存取字时,处理器自动采用“高高低低”原则。

2. 存储器的分段

* 8086/8088 CPU 有 20 根地址线,可直接寻址的物理地址空间为 1M 字节(=220)。

* 系统存储器由以字节为单位的存储单元组成,存储单元的物理地址长 20 位,范围是 00000H 至 FFFFFH。

* 为什么要分段
8086/8088 微处理器内部数据通路和寄存器皆为 16 位,内部 ALU 只能进行 16 位运算,在程序中也只能使用 16 位地址,寻址范围局限在 216=65536(64K)字节。
通过对存储器分段使用段寄存器的方法,8086/8088 有效地实现了寻址 1M 字节物理空间。

* 根据需要把 1M 字节地址空间划分成若干逻辑段。每个逻辑段必须满足如下两个条件:
第一,逻辑段的开始地址必须是 16 的倍数;
第二,逻辑段的最大长度为 64K。

* 按照这两个条件,1M 字节地址空间最多可划分成 64K 个逻辑段,最少也要划分成 16 个逻辑段。
第一个条件与段寄存器长 16 位有关;(16 位扩展成 20 位,地址按照 {0000,0000,0000,0000,0000} {0000,0000,0000,0001,0000} {0000,0000,0000,0010,0000} 递增)
第二个条件与指针寄存器长 16 位有关。

3. 物理地址的形成

由于段的起始地址必须是 16 的倍数,所以段起始地址有如下形式:
bbbb,bbbb,bbbb,bbbb,0000
用 16 进制可表示成 XXX0。这种 20 位的段起始地址,可压缩表示成 16 位的 XXXX 形式。
我们把 20 位起始地址的高 16 位 XXXX 称为段值。显然,段起始地址等于段值乘 16(即左移 4 位)。

要访问的某一个存储单元总是属于某个段。我们把存储单元的地址与所在段的起始地址的差称为段内偏移,简称为偏移。在一个段内,通过偏移可指定要访问的存储单元,或者说要访问的存储单元可由偏移量来指定。在整个 1M 地址空间中,存储单元的物理地址等于段起始地址加上偏移。

于是,存储单元的逻辑地址由段值和偏移量两部分组成,用如下形式表示:
段值:偏移

根据逻辑地址可方便地得到存储单元的物理地址,计算公式如下:
物理地址=段值×16+偏移
通过移位和算术加可容易地实现上述公式。

采用段值和偏移构成逻辑地址后,段值由段寄存器给出,偏移可由指令指针 IP、堆栈指针 SP 和其他可作为存储器指针使用的寄存器(SI、DI、BX 和 BP)给出,偏移还可直接用 16 位数给出。指令中不使用物理地址,而是使用逻辑地址,由总线接口单元 BIU 按需要根据段值和偏移自动形成 20 位物理地址。

抱歉!评论已关闭.