![](https://img.kancloud.cn/d2/0b/d20b6fe29fc4bb4fc27b3dc9cd4bbf70_984x527.png)
我们知道, CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址。
16位结构(16位机、字长为16位等常见说法,与16位结构的含义相同)描述了一个CPU具有下面几方面的结构特性。
* 运算器一次最多可以处理16位的数据
* 寄存器的最大宽度为16位:
* 寄存器和运算器之间的通路为16位。
8086是16位结构的CPU,这也就是说,在8086内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位的。内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位CPU,能一次性处理、传输、暂时存储16位的地址。
![](https://img.kancloud.cn/5d/23/5d23bf16c5ce161c78be52ac265748dd_983x506.png)
CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不同的CPU可以有不同的形成物理地址的方式。我们现在讨论8086CPU是如何在内部形成内存单元的物理地址的。
8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。从8086CPU的内部结构来看,如果将地址从内部简单地发出,那么它只能送出16位的地址,表现出的寻址能力只有64KB.8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
![](https://img.kancloud.cn/f9/48/f9484a08ca60aadb5417372bcc5ab537_979x652.png)
| | | | | | |
| --- | --- |--- | --- |--- |--- |
| | 1 | 2 | 3 | 0 | |
| | 0 | 0 | c | 8 | |
| 16进制左移一位 | | | | | |
| 1 | 2 | 3 | 0 | | |
| | 0 | 0 | c | 8 | |
16进制左移一位相当于二进制左移4位
1230=~~000~~1001000110000
00c8=~~00000000~~11001000
| | | | | | |
| --- | --- |--- | --- |--- |--- |
| | 0001 | 0010 | 0011 | 0000 | |
| | 0000 | 0000 | 1100 | 1000 | |
| 二进制左移四位 | | | | | |
| 0001 | 0010 | 0011 | 0000 | <span style="color:red">0000</span> | |
| | ~~0000~~ | ~~0000~~ | 1100 | 1000 | |
| 0001 | 0010 | 0011 | 1100 | 1000 | |
1 0010 0011 1100 1000=123c8
段地址就是基地址
二进制向左移4位就是乘以16(左移一位*2,左移2位*4,左移3位*8,左移4位*16)
下图为2在其二进制(10B)下位移后的数值变化
![](https://img.kancloud.cn/28/d3/28d3b7120d50b660726b5e898dc05e6e_620x352.png)
一个数据的m进制形式左移1位,相当于该数据乘以m
16进制的段地址\*16左移1位,概念和10进制某个数\*10左移一位一个道理
一个数据的二进制形式左移一位,相当于该数据乘以2
一个数据的二进制形式左移n位,相当于该数据乘以2^n
段地址*16必然是16的倍数,所以一个段的的起始地址也一定是16的倍数
偏移地址为16位,16位地址的寻址能力位64k,所以一个段的长度最大为2^16=64k
cpu访问内存单元时,必须向内存提供内存单元的物理地址
具象例子:比如说传纸条,信息是2826,一张纸条只能容纳3个数字,必须填满纸条,一次可传两张:
在第一张纸上写上200(段地址),在第二张纸上写上826(偏移地址)。假设我们事前对,这种情况又有过相关的约定:你得到这两张纸后,做这样的运算: 200(段地址)x10+826(偏移地址-2826(物理地址)。8086CPU就是这样一个只能提供两张3位数据纸条的CPU.
8086cpu在内部用段地址和偏移地址移位相加的方法形成最终的物理地址
![](https://img.kancloud.cn/36/8a/368aa71ce5d79ea287b3edb978a90518_772x529.png)
![](https://img.kancloud.cn/c2/84/c284f2f834906059f1bc46503955b29c_585x414.png)
![](https://img.kancloud.cn/d8/fd/d8fd3ce5b4dd7ce79400996dfb17acbc_602x414.png)
![](https://img.kancloud.cn/f5/80/f580d90ccfadfbf41ef89b6a6fab41be_591x425.png)
![](https://img.kancloud.cn/9f/bf/9fbfe0bf2cf715c6d38e8a919280e4eb_578x417.png)
### **8086合成物理地址的过程**
我们说8086CPU的上一代CPU(8080, 8085)等是8位机,而8086是16位机,也可以说8086是16位结构的CPU,那么什么是16位结构的CPU呢?
概括地讲, 16位结构(16位机、字长为16位等常见说法,与16位结构的含义相同)描述了一个CPU具有下面几方面的结构特性。运算器一次最多可以处理16位的数据;寄存器的最大宽度为16位;寄存器和运算器之间的通路为16位。
8086是16位结构的CPU,这也就是说,在8086内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位的。内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位CPU,能一次性处理、传输、暂时存储16位的地址。
8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。从8086CPU的内部结构来看,如果将地址从内部简单地发出,那么它只能送出16位的地址,表现出的寻址能h只有64KB.
解决办法:8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
![](https://img.kancloud.cn/77/26/772625c7ac94aef00839ab2c3fa41f6e_975x519.png)
如图所示,当8086CPU要读写内存时:
(1) CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
(2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
(3)地址加法器将两个16位地址合成为一个20位的物理地址;
(4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
(5)输入输出控制电路将20位物理地址送上地址总线;
(6) 20位物理地址被地址总线传送到存储器。
![](https://img.kancloud.cn/aa/78/aa781ec4df5b6eb92a18545d4524c685_614x218.png)
![](https://img.kancloud.cn/13/ba/13baa20672c80c0db8fda14064b9eebc_293x194.png)
![](https://img.kancloud.cn/bf/c9/bfc90c2919688eb2d6781a8f26374d70_276x160.png)
![](https://img.kancloud.cn/0f/69/0f69c60370fd18decadd6117de59a4d7_927x548.png)
cpu可以用不同的段地址和偏移地址形成同一个物理地址
![](https://img.kancloud.cn/ab/6a/ab6a007da0c2729b41ed6bd60de4a31e_637x483.png)
![](https://img.kancloud.cn/15/cb/15cbc145cecb32c0ce955b5406c54d76_463x154.png)
如果给定一个段地址,仅通过变化偏移地址来寻址,最多可以定位多少内存单元?
偏移地址16位变化范围为0~FFFFH(2^16-1),仅通过变化偏移地址来寻址,最多可以定位2^16=64k内存单元
比如给定段地址1000H,用偏移地址寻址,cpu的寻址范围为10000H~1FFFFH
段地址*16:相当于16进制向左移1位即10000H,范围就是(0+10000H,FFFFH+10000H)
1000转换为十进制(4096)\*16+偏移地址范围(2^16-1)
65536+65535=131071(转换成16进制后为1ffff)
(0+SA,FFFFH+SA)=20000H
在8086pc机中存储单元的地址用两个元素拉描述,即段地址和偏移地址
数据在21F60H内存单元中,对于8086pc机的描述:
* 数据存在内存2000:1F60单元中
* 数据存在内存的2000段中的1F60H单元中
可更具需要将地址连续、起始地址为16的倍数的一组内存单元定义为1个段
例子:
有一数据存放在内存20000H单元中,现给定段地址为SA,若想要偏移地址寻到此单元,则SA满足的条件是:最大?(2000H)最小?(1001H)提示,当段地址给定对少cpu无 论怎么变化偏移地址都无法寻到20000H单元
结果:当段地址给定为 1001H 以下和 2000H 以上,CPU无论怎么变化偏移地址都无法寻到20000H单元。
解题过程:
物理地址=SA\*16+EA
20000h=SA\*16+EA
SA=(20000h-EA)/16=20000h/16-EA/16=2000h-EA/16
EA取最大值时,SA=2000h-ffffh/16=2000H-fffH=1001h,SA为最小值
EA取最小值时,SA=2000h-0h/16=2000h,SA为最大值
延伸:(不知道对不对)
例子:
有一数据存放在内存21F60H单元中,现给定段地址为SA,若想要偏移地址寻到此单元,则SA满足的条件是:最大?最小?
解题过程:
物理地址=SA\*16+EA
21F60H=SA\*16+EA
SA=(21F60h-EA)/16=21F60/16-EA/16=21F6h-EA/16
EA取最大值时,SA=21F60h-ffffh/16=21F6H-fffH=11F7H,SA(段地址)为最小值11F7H
EA取最小值时,SA=21f6h-0h/16=21F6h,SA(段地址)为最大值21F6h
注意:可分段的必须是16的整数,如:
21f00
...
21f70
21f80
21f90
可知一个物理地址的段地址取值范围是(舍去右边一位的xxxxx~舍去右边一位的xxxxx-fff)