首页 > 代码库 > 8086的储存器编址

8086的储存器编址

8086的储存器编址 


               值得注意的是JOS是采用8086进行操作系统搭建的!

               本来觉得一无是处的8086,现在觉得真要好好学学了,因为JOS,哈哈


        在操作系统底层常常会遇到"逻辑地址"的概念,各种地址混淆在一起,极易头疼...

http://blog.csdn.net/cinmyheart/article/details/39843857

上面的Link是我对虚拟地址,线性地址,物理地址进行的分析.

----------------------------------------------------------------------------------------------------------------------------------


首先引出一个问题,很多人都知道,段寻址的方式是

segment:offset,比如0x0:0x7c2d

这是8086在实模式下的物理寻址方式.

问题: 你有没有想过,为什么是这样寻址? 根本的原因在哪儿?

这篇blog就试图回答这个问题.


            8086有20根地址线,2^(20) == 1MB的储存器地址空间.这1MB的储存单元按照0x00000~0xFFFFF来编址.

            8086有16根数据线,2^(16) == 64KB.

矛盾就凸显出来了,试问,能用寄存器直接对所有的地址空间进行寻址嘛? 明显不能, 数据线的宽度小于地址线的宽度!

所以,为了对所有1MB的储存器地址空间进行寻址,有人想出了,"一块块寻址"的办法 ---- 分段寻址机制.


想想,整个内存可以达到16个段(2^4).


在为程序分配内存空间的时候,一个程序可以有代码段CS,数据段DS,堆栈段SS和附加段ES


于是就有了段寻址, seg:offset. == (seg << 4) + offset.

这里seg和offset都可以用16位的寄存器存储,进而构造出了20bit的物理地址.

假设我们要对代码段内的某个指令进行寻址,我们可以

CS:IP

如果我们要对数据段内某个数据进行寻址,我们可以

DS:register 这里register可以是IP,甚至可以是BX

如果我们要对堆栈段进行寻址,我们可以

SS:SP 或SS:BP

等等.



接着还有个问题,为什么我们电脑关机之后再重新冷启动,按下启动电源键.

电脑每次都正确无误的启动,是不是按下电源键之后,电脑都进行了"某些相同的动作"?


当然, 每次按下电源键, CPU都会复位, 一切从新开始.

而对于8086来说,复位后,所有寄存器的值都是0,除了CS == 0xFFFF,即代码段(这都是硬件工程师故意设计好的)

接着,这是实模式,于是进行段寻址,

CS:IP == 0xFFFF0

寻址结果显示,复位之后,第一条CPU应该执行的指令在物理地址0xFFFF0处.

于是计算机就开始启动啦~ 每次都从0xFFFF0开始.


我们利用JOS进行验证

技术分享


可以发现,开机后第一条指令,当前地址是0xFFFF0. 在此之前,CS == 0x0000

细心点会发现,第一条语句在段0xF000内 : ) 此时,CS == 0xF000
 







摄于南苑

技术分享

8086的储存器编址