第二章 第3小节 8086存储器组织
2.3 8086存储器组织
一、存储器地址的分段
1、存储器地址的分段

8086有20条地址总线,直接寻址能力为2 20 =1 M 字节
矛盾:存储器地址空间1MB,20bit地址线;内部各寄存器和数据总线均为16****bit。
解决方法:为整个存储器规划多个逻辑块,并确保每个块内的寻址宽度为16bit;该设计即可支持的最大地址空间为64KB。相邻的各块之间可以是连续的(如图所示)。此外还支持分离或相互重叠的情况。
存储器地址分段:
IBMPC机对** _段的起始地址字段_存在限制,并规定段必须从特定的内存区域开始:具体而言,在约定段的起始地址字段中最低有效位必须为零(或者能够被十六进制十六整除)。
内存地址为十六位。每一个区段的容量为64\text{KB};或可以根据需求设定区段大小,在64\text{K}范围内任意选择。
两个定义:
段地址(段基址):一个段的起始地址的高16位。 1MB空间可有216个段地址。
_段内偏移位置(有效地址EA):_该值表示相对于段起始位置的位置偏移量,并采用16位二进制数进行编码表示。因此每个段的最大容量为64KB。
**结论:**存储器段与段之间可互相覆盖。
根据定义1MB空间可有216个段地址**,相邻两段地址相距16个存储单元。**
在16进制表示的地址中,最低位为0H**(即20位地址的低4位为0000****B)。**段首地址为:
段地址 ~~~~ 00000****H
00010H
…
41230H
41240H
…
FFFE0H
****FFFF0H

程序执行前,分别对相应的段寄存器CS,DS,SS,ES置“段基值”。
2. 20位物理地址的形成
定义:
逻辑地址: 在程序设计中所指的内存使用位置。对于任意指定的一个存储单元来说,则包含两个16位的无符号二进制数字段以标识其完整的位置信息:
第一个字段表示该存储单元所在的字节偏移量;第二个字段则用于区分同一字节偏移量下的多个物理存储位置。
段基址(段地址)——由CS,DS,SS,ES决定。
**段内偏移量(****段内有效地址)——**该单元相对于段基址的距离。
物理地址: 物理地址字段(20位长度);该字段用于表示存储器的实际内存起始位置并覆盖范围从十六进制的** ** ** **到十六进制 **(FFFFFH),当CPU执行访问操作时通过地址总线发送出相应的内存地址。
例8000:0100H——80100H
*** 每个存储单元仅有一个物理地址。然而它们可能由多种段地址和偏移地址构成 ***
物理地址计算方法:
把段地址左移4位再加上偏移地址值形成物理地址。
物理地址= 16d*段地址+偏移地址。

**例:已知CS=2000H,IP=003AH,**求物理地址?
20000****H+003AH = 2003AH
归纳:

注意:
**(**1)由操作系统负责各段在存储器中的分配
通常情况下,在内存中各个程序段是由操作系统的规划来完成的分配。每个程序段单独地占据64K存储区空间,并且可以在运行时被多个程序共享使用的同时进行处理,在这种情况下必须注意避免出现内存冲突问题。
**(2)**在程序的首部设定各段寄存器的值
程序员要在程序的首部设定各段寄存器的值。
(3**)以8086为CPU的IBMPC****系统中,存储器首尾地址的用途固定,**用户不能占用。
00000H~003FFH共1K内存单元用于存放中断向量。
FFFF0H~FFFFFH****是存储器底部的16个单元。
系统加电复位时,会自动转到FFFF0H单元执行,
在FFFF0H处存放一条无条件转移指令,转向系统初始化程序。
二、8086存储器的分体结构
1. 问题的提出:
**微控制器(MCS-51、8086/8096系列)**中的通用寄存器用于临时存放程序运行过程中的中间结果或操作数
其数据总线宽度设定为16位,并且在单个操作周期内除能完成单个字节的数据传输外还需具备双倍宽度的操作能力
l 计算机对内存的读/写操作
CPU 发出地址信号,选中相应的内存单元。
读操作**,CPU发出内存读控制信号,内存单元内容经数据总线送入****CPU。**
The write operation involves the CPU sending a write control signal to the memory unit, which enables the CPU to write desired data via the data bus to the memory.

8086存储单元地址:按照字节编址
该微处理器能够直接寻址1兆字节(MB)的存储空间,并为每个内存单元分配一个唯一的地址码。
字(16位)数据的存放:
一个存储单元占用两个连续的存储位置,并将其中低地址字段用于存放低位字节数据、高地址字段用于存放高位字节数据。
字单元的地址采用它的低地址来表示。例:
**字单元: (**00004H)=1234H,
**字节单元:(**00004H)=34H
同一地址既可以被视为字节单元地址也可以被视为字单元地址应根据具体应用背景进行判定
*****字单元地址:可以是偶数也可以是奇数。
2. 8086****系统的存储器结构
(1)将1M的存储空间分成两个存储体:偶地址和奇地址存储体。

该系统采用分时多级别的多级保护策略,在此过程中实现了对主变电站母线系统的全方位保护功能
(3)用地址线A0和BHE信号选择存储体。


如何利用8086CPU16位数据总线,完成字数据的读/写操作?
(a)操作数存放在偶地址开始两个存储单元或两个I/O端口中

此时可在一个总线周期内完成16位数据传送。
(b)操作数存放在奇地址开始两个存储单元或两个I/O端口****中
操作数放置于奇地址处开始的两个存储设备或I/O端口中执行数据传输过程,在8086系统中所需的时间为两个总线周期。
字的地址为偶地址——对准存放,或称规则字**。**
字的地址为奇地址——未对准好的非规则字。
3. 8086的I/O****端口
8086系统与外部设备之间都通过I/O接口电路进行连接,** I/O**接口内部通常包含一个或多个插槽. 系统会为每个插槽给予指定地址,称为端口地址.
在接口内部通常会设置一个或多个寄存器用于存储各种信息并被称为I/O寄存器或I/O输出端口。根据存储的内容不同它们可划分为状态端口数据端口以及控制端口等类型
CPU 对 I/O 端口的读/写操作 : (与 内存的读/写操作相类似)
- CPU发送地址指令,并激活对应的所有I/O端口。
- 当执行读操作时, CPU发送给选定的某个特定的 I/O 端口一个读控制信号。
- 在进行写操作时, CPU向指定的某个特定的 I/O 端口发送一个写控制信号,并将待写的字节经过数据总线传输至目标的指定位置;如果该 I/O 端口未被选择,则通过三态门电路实现断开连接。
8086CPU通过其地址总线下16位作为连接到8位I/O端口的寻址线段,在理论上可支持最大连接数为2^{16}个端口(即约2^{20}个端口)。
**----**端口地址不需要分段管理(端口不是逻辑地址)
当一个8位I/O设备连接至数据总线的低8位端口时,则每个端口的地址都将为偶数值(A₀=0);若将一个8位I/O设备连接至数据总线的高8位端口位置,则每个端口的地址都将为奇数值(A₀=1)。
**----**端口访问仍存在分体问题
IBM-PC系统仅用了A9至A0共10条地址线作为I/O端口的寻址线,并因此最多可寻址1024(即1KB)个端口。
存储器需要分段分体
I/O不需要分段需要分体
三、堆栈的概念
堆栈是一种基于用户定义的一个特定区域(位于RAM区内)来临时存储数据或地址的存储区。 堆栈段是由一段特定的指令在内存空间内所定义的一个独立部分。
堆栈遵循先进先出的组织原则,在操作过程中通过入栈(PUSH)和退栈(POP)来完成数据的存取。
栈底**——**固定的最高地址。
栈顶**——栈顶不断改变,是堆栈区的最低地址,用堆栈指针SP****指示**
执行一条PUSH指令,SP=(SP)-2,向堆栈压入16bit数据。
**执行一条POP指令,从堆栈弹出16bit数据,**SP=(SP)+2。

