CPU结构及段地址偏移地址的概念

原文地址:http://blog.csdn.net/yihuiworld/article/details/7533335#comments

程序如何执行:

     CPU先找到程序在内存中的入口地址 -- 地址总线

          (8086有20根地址总线,每一根可以某一时传0或1,

            20位的二进制数字可以表示的不同的数字的个数是2^20=1048576

           1048576 byte/1024=1024 KB    (注:8bit(位)=1Byte(字节) 1024Byte(字节)=1KB 1MB=1024kb=1024x1024b)

           1024KB/1024=1 MB

           所以寻址范围为2的20次方byte=1M

          )

          因此有多少根地址总线(总线宽度)决定了CPU内存寻址的范围

          以上也可以理解为:CPU是多少位的寻址就是2的位的次方,ex:32位CPU寻址范围就是2的32次方=4G

          即使此刻内存容量有8G,CPU也只能够利用当中的低4G中的内存地址,高4G地址无法寻址到

     然后通过一定的途径将程序输送给CPU存于CPU的对应的寄存器中,再去执行 -- 数据总线

     如果CPU需要控制外围设备、是加是减、或是读是写内存等 -- 控制总线

     CPU对数据的+-/*等运算 -- 运算器    

     总结:CPU的组成=寄存器+运算器+控制器+内部总线(连接各种器件在它们之间传送数据)

      寄存器          控制器

          |                    |

     -------------------------------------------  内部总线

              |                          |

         运算器              运算器                                      CPU结构图

什么是CPU的寄存器:

    寄存器分为通用寄存器、段寄存器...

    寄存器用于存放CPU要执行的数据或指令

    例如:8086CPU的AX通用寄存器结构如下:

    

物理地址的表示方法:

    问题:8086主板地址线20根,所以进行寻址操作一次需要传送20位的二进制数据

                但是CPU最大一次只能够传送16位的二进制数据,那如何处理呢?

    例子:如何将 两个3位的数 进化为 一个4位数

               ex:    234             and         23        -->         xxxx

                        234 ×10       +           23        -->         xxxx

                          ↑                                ↑                       ↑

                       基地址                    偏移地址   -->    物理地址

     以上的类似实现在CPU中通过地址加法器实现:

     实际内存地址=基地址:偏移地址

     实际内存地址=基地址×16(×16进位,类似10进制中的×10进位) + 偏移地址

     demo:1402:100

                    1402H (16进制数 4*4=16位的二进制数)  ×  16    + 0100

             即   14020H       --基地址×16

                +    0100H       --偏移地址

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

                    14120H       --实际物理地址

计算机中是不是这么表示的呢?

WIN+R --> cmd,进入Widows环境下的命令行下  输入debug命令  

[plain] view plaincopy
 
  1. C:Documents and SettingsAdministrator>debug  

debug工具是DOS/Widows提供的实模式程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。

它可以用于逐指令执行某个程序以验证程序运行的正确性,

也可以追踪执行过程、比较一个指令执行前后的值以及比较与移动内存中数据的范围,读写文件与磁盘扇区等

输入d命令查看寄存器的内容:

[plain] view plaincopy
 
  1. -d  
  2. 0B5D:0100  02 00 EB 0E 50 B0 03 B4-FF E8 9E 00 58 EB 03 E8   ....P.......X...  
  3. 0B5D:0110  1D 01 58 C3 F9 C3 55 51-26 8A 4F 08 34 00 4C 0B   ..X...UQ&.O.4.L.  
  4. 0B5D:0120  74 0D 8D 6F 09 E8 19 04-73 08 E8 0E 00 E2 F6 F9   t..o....s.......  
  5. 0B5D:0130  EB 06 2E 89 2E 5D 91 F8-59 5D C3 26 80 7E 00 00   .....]..Y].&.~..  
  6. 0B5D:0140  74 03 45 EB F6 45 C3 2E-80 0E 56 91 10 E8 C6 FF   t.E..E....V.....  
  7. 0B5D:0150  72 4A 2E 80 26 56 91 EF-50 2E A1 59 91 2B C6 2E   rJ..&V..P..Y.+..  
  8. 0B5D:0160  01 06 57 91 58 2E 8B 36-59 91 2E 80 3C 00 75 26   ..W.X..6Y...<.u&  
  9. 0B5D:0170  2E 80 7C FF 3A 75 09 2E-C7 06 4A 91 09 00 EB 1F   ..|.:u....J.....  

 可以看到物理地址的表示方法都是基地址:偏移地址 ex:0B5D:0100

在CPU中 基地址 存于 段寄存器,偏移地址 存于通用寄存器

原文地址:https://www.cnblogs.com/LittleRedPoint/p/4009441.html