**段地址\*16+偏移地址=物理地址**
**偏移地址=物理地址-段地址\*16**
段地址是16位表示的,
10进制*16=2进制左移4位=16进制左移一位
如果物理地址为=21F60H,段地址为2000H,段地址*16即左移一位:20000H。
偏移地址=21F60H-20000H=1F60H
段地址为其他的规律同理:(段地址的范围是11F7~21F6)
![](https://img.kancloud.cn/20/9a/209a109ee07ab0ae83ca84f34c8af23f_401x197.png)
## **为什么要分段?**
内存并没有分段,段的划分来自于CPU
8086是16位的,它的寻址范围是2^16-1=65535=64k,所以一个段的长度最大为64KB
但是内存的容量远大于64KB,所以我们需要cpu分段来读写内存,~~所以偏移地址的值不会超过65535(FFFFH)即偏移地址的范围是(0000H~FFFFH)~~
例子:有一个数据存放在内存20000H单元中,现在给定段地址为SA,若想用偏移地址寻到此单元. 则SA应满足的条件是: 最小为? 最大为?
段地址SA
最小为:1001H 此时偏移为:FFF0H
最大为:2000H 此时偏移为:0000H
例子2:
给定段地址为0001H,仅通过变化偏移地址寻址, CPU的寻址范围为?
关键:
* 此题中已经假设地址总线为16位,寻址范围最大为2的16次方,所以偏移地址变化范围是 0 ~ 65535,即 0000H ~ FFFFH
* 基础地址(段地址\[SA\] X 16)+ 偏移地址\[EA\] = 物理地址
```
物理地址=SA*16+EA
EA的变化范围为0h~ffffh
物理地址范围为(SA*16+0h)~(SA*16+ffffh)
现在SA=0001h,那么寻址范围为
(0001h*16+0h)~(0001h*16+ffffh)=0010h~1000fh
```
## **同一段地址,不同的分配方案**
例子:10000H~100FFH这一段地址
方案1:
10000H~100FFH单元可以组成一个段
起始地址(基础地址)为10000H,他的段地址1000H 除以16即右移一位(10000H段地址取值最大1000H最小1H),大小为100H
方案2:
10000H~1007FH单元可以组成一个段
1008FH~100FFH单元可以组成一个段
起始地址为10000H和10080H,段地址为1000H和1008H,大小均为80H
开始的偏移都是0,后面的偏移分别都是7F
10000H的偏移地址=10000H-1000H\*16=10000H-10000H=0H
1007FH的偏移地址=1007FH-1000H\*16=1007FH-10000H=7FH
10080H的偏移地址=10080H-1008H\*16=10080H-10080H=0H
100FFH的偏移地址=100FFH-1008H\*16=100FFH-10080H=7FH
![](https://img.kancloud.cn/44/37/4437030f3f488a0e9c10bfc3e30243c3_827x357.png)
乘以16必然是16的倍数,所以段地址的起始地址一定也是16的倍数
偏移地址位16位,16位地址的寻址能力为64k,所以一个段的长度为2^16=64k
在8086pc机中存储单元的地址用两个元素拉描述,即段地址和偏移地址
数据在21F60H内存单元中,对于8086pc机的描述:
* 数据存在内存2000:1F60单元中
* 数据存在内存的2000段中的1F60H单元中