💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
![](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)