8086系统中的存储器是一个最多 1MB(220B) 的序列,即可寻址的存储空间为 1MB ,系统为每字节分配一个20位的物理地址,对应的十六进制数地址范围为 00000H~FFFFFH 。
字
字:一个字 = 两字节 = 16bit,在存储器中任何两个相邻的字节被定义为一个字。
在一个字中,每字节都有地址,两个字节地址中较小的被用来作为该字的地址。
较高存储器地址的字节存放该字的高8位,较低存储器的字节存放该字的低8位。
存储器的组成
8086系统中,存储器采用分体结构,1MB 的存储空间被分成两个 512KB 的存储体,一个存储体中包含偶数地址,一个存储体中包含奇数地址,两个存储体采用字节交叉编址方式:
对于任何一个存储体,只需要A19 ~ A1 即可。
地址A0 用以区分当前访问的是哪一个存储体:
- A0 = 0,表示访问偶地址存储体;
- A0 = 1,表示访问奇地址存储体。
但是访问一个字节时,需要同时访问两个存储体,各取出 1 字节的信息。此时A0 控制读写操作就不行了。
8086系统新增了一个总线高位有效控制信息 BHE ‾ \overline{\text{BHE}} BHE。 BHE ‾ \overline{\text{BHE}} BHE作奇地址存储体片选信号。
- BHE ‾ \overline{\text{BHE}} BHE = 1,选中奇
- BHE ‾ \overline{\text{BHE}} BHE = -,补选中奇
偶地址存储体固定与低8位数据总线(D7 ~ D0)相连,称为低字节存储体
奇地址存储体固定与高8位数据总线(D15 ~ D8)相连,称为高字节存储体
存储器的分段
8086CPU中所有的寄存器都是16位寄存器,如果仅仅是一个16位寄存器,只能寻址64KB。
而8086CPU的寻址空间为1MB,是怎么做到的呢?
8086系统采用分段并附以地址偏移量的办法形成20位的物理地址,得到对1MB的内存空间的寻址。
逻辑段:被划分的存储器段称为逻辑段。
各个逻辑段之间可以紧密相连,可以中间有间隔,也可以相互重叠(部分重叠甚至完全重叠)。
逻辑地址与物理地址
采用分段结构的存储器中,任何一个逻辑地址都由段基址和偏移地址两部分构成,都是无符号的 16 位二进制数,程序设计时采用逻辑地址。
物理地址指存储器的绝对地址(00000H ~ FFFFFH),是CPU访问存储器的实际寻址地址,即一个存储单元对应一个20位的物理地址。
16位的段基址左移4位(相当于在段基址最低位后加“0000”),然后与偏移地址相加得物理地址:
物理地址 = 段基址 + 偏移地址
- 取指令时,CPU选择代码段寄存器CS,在和指令指针IP形成指令所在的20位物理地址
- 进行堆栈操作时,SS + SP/BP =》20位堆栈指针
- 往内存中写一个数据或从内存中读一个数据时,DS + SI/DI/BX = 20位物理地址
堆栈段的使用