MENU

存储器的结构 | 汇编语言

February 26, 2019 • 我爱学习

    本篇文章主要详细讲解了存储器的组织结构,包括存储器构成,段基址和段基值,逻辑地址和物理地址等

一、存储器的组成

1. 存储器由若干个存储单元构成,存储单元的数量就表示了存储器的数量。

2. 每个存储器中存放着相同长度的二进制数,一个存储单元的长度一般为 8 位二进制数,即一个字节。

3. 每个存储单元有一个唯一的编号 —— 地址,
  8086CPU 有 20 根地址线即它可以产生 20 位的地址码,他的存储器寻址能力为 2^20, 即一兆字节空间。

  而且为了书写方便在源程序中常用 5 位十六进制数或一个符号来表示一个存储单元的地址

4. 任何两个相邻字节单元就构成一个字单元。
  一个字存储单元(WORD)的长度为 16 位二进制数,即两个字节。字单元的地址为两个字节单元中较小的字节单元的地址。

  一个 16 位长的数据存放规则是:
    所谓的 “低对低,高对高”,即低八位存放在较低地址字节单元中,高八位存放在较高地址单元中 。

    例如,将数据 3456H 放在地址为 09235H 的字单元中时的存储分配:
    其中第八位为 56,高八位为 34。即低八位 56 存放在地址 09235H 中,高八位 34 存放在 09236H 中。

5. 在定义一个地址时必须要指出是字节或者是字类型属性。


二、存储器的段结构

    由于 8086CPU 的可寻址空间为 1MB,则需要提供 20 位长的地址码。但是,CPU 内部的寄存器长度只有 16 位,意味着其能够访问的最大地址空间仅仅是 2^16^ 即 64KB。

1.8086CPU 将 1MB 的存储空间划分为若干个分段,每个段的最大长度为 64K(65536)个字节单元组成。
    在 8086 的汇编的源程序中,用户可以根据自己的需求来设定分段的个数、每个段的长度、还有用途。并且代码和数据可以存放在段内的任意单元中。

2. 每个段的基址(段基址)必须是一个小节的首址
    段基址 —— 一个段的起始地址
  在存储器中规定从 0 地址开始,每 16 个字节单元就称为一个小节. 因此,1MB 内存就可划分为 64K 个小节。(2^20^ / 2^4^ 2^16^ 64K)

  由图可以看出,每个小节的首地址最低位必为0(16进制数表示时)。因此段基址只能是上述小节的首址之一。

3. 逻辑段是指在汇编语言程序中设置的段
    在物理存储器中的位置关系有四种情况,分别是:邻接的、间隔的、部分重叠的、完全重叠的。
    内存中的物理存储单元可以映像到一个或多个逻辑段中

    其中:段 1 和段 2 是邻接的;段 3 和段 5 是间隔的;段 3 和段 4 是完全重叠的;段 2 和段 3 是部分重叠的;

4. 在任一时刻,一个程序只能访问 4 个当前段中的内容
    因为段寄存器只有四个( ̄﹃ ̄ 真实)
    四个段寄存器中分别保存了它们段基址的高 16 位地址,称为段基值,段基址的最第四位为 0.(因为小节首址的最第四位全为 0)


三、逻辑地址和我离地址的关系

1. 物理地址
    由 20 位地址线确定的地址,由 20 个 bit 表示的地址。

8086的物理地址范围: 00000H ~ FFFFFH

2. 逻辑地址
    设计程序时为了方便,从而设计的地址。
    一个逻辑地址包括两个部分:段基值和偏移量
    段基值:段基址的高 16 位,存放在段寄存器中。
    偏移量:某个存储单元与它所在段的段基址之间的字节距离。

    逻辑地址的表示方法:' 段基值:偏移量'
    例如:'3267H: 0A0H'

3. 逻辑地址转化为物理地址
    将逻辑地址的段基值左移四位(二进制),形成 20 位的段基址(低位为零),然后与 16 位的偏移量相加。

4. 逻辑地址的来源
    操作类型不同,来源也不同。

    说明:
        (1)允许替代的来源叫做段超越(和杨超越没有关系)。
        (2)有效地址 EA:通过某种指令所采用的寻址方式(之后会学到)计算得到的偏移量。

Last Modified: September 8, 2021