2.2 内存地址组织及存放次序
内存用于存放正在运行的程序及数据,而CPU是根据内存单元的位置信息即内存地址决定从内存的何处取得指令或数据。若内存地址使用n位二进制编码,地址总数(也称寻址能力)可达2n个,地址范围为0~(2n-1)。例如,用10位二进制数,寻址能力可达1 K,地址范围为0~1111111111 B(0~3FFH)。微机的内存基本单位是字节,用B(Byte)表示,1B=8b(bit),1K=1024,1M=1024K,1G=1024M,1T=1024G。
2.2.1 8086/88 系统的内存组织
8086/88 CPU系统的内存组织是采用分段结构组织的。其原因主要有以下三点。
(1) 8086/88 CPU中的寄存器只有16位,如果采用直接寻址,则寻址能力势必限制在64KB范围内,而采用分段组织可以较好地实现扩展CPU的寻址能力,每段的大小可达64KB,不同段的组合则可寻址更大的范围。
(2)使程序与数据相对独立,不同存取方式的数据也相对独立。
(3)便于程序和数据的动态装配,从一个地方挪到另外一个地方只要更改一下段寄存器的值即可,段内偏移可以不用改变。
其主要缺点是增加了地址计算的复杂度,降低了CPU的执行效率。
2.2.2 内存物理地址的计算方法
内存分段组织后,用段地址及段内偏移地址来表示真正的内存地址(物理地址、绝对地址)。段地址及偏移地址一般称为相对地址或逻辑地址,同一物理地址可以有多个不同的段地址与偏移地址与其对应。
8086/88 系统内采用20位的物理地址(Physics Address,PA)。系统内规定段的起始地址必须是16的倍数,即低4位二进制一定为0,同时,由于系统内用于存放段地址的寄存器只有16位,无法存放20位的段起始地址信息,既然段的起始地址低4位一定为0,所以干脆就不予保存,也就是说段寄存器中保存的段地址为该段的段起始地址的高16位,反之段的起始地址则为段地址×16。段内偏移地址也叫有效地址EA(Effect Address)。
乘以16即相当于二进制左移4位或十六进制左移1位。
分段组织的物理地址的计算方法如图2.4所示。
图2.4 分段组织的物理地址的计算方法
例2.4 DS=1234H,相对于DS的EA=5678H
则物理地址=1234H×10H+5678H=12340H+5678H=179B8H
例2.5 已知DS=2000H,相对于DS偏移EA1为5000H,相对于ES偏移EA2为0800H,则指向同一物理地址的ES为多少?
图2.5 例2.5示意图
解:如图2.5所示。
DS×10H+EA1=ES×10H+EA2
2.2.3 内存单元数据的存放次序
内存的物理地址是按字节单元编址的,若仅仅访问字节单元则无所谓数据的存放次序,可是1字节的数据表示范围是很小的(无符号数为0~255,有符号数为-128~+127),所以经常要用多个字节存放一个数据。一个数据占用多字节,必然存在存放次序的问题。在PC系列微机中,数据的存放次序是低地址为低字节,高地址为高字节。例如,(10000H)=12H,(10001H)=34H,(10002H)=56H,(10003H)=78H,按字读则(10000H)=3412H,按双字读则(10000H)=78563412H。