zoukankan      html  css  js  c++  java
  • 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中 基地址 存于 段寄存器,偏移地址 存于通用寄存器

  • 相关阅读:
    oracle的分析函数over 及开窗函数
    ASP.NET中分布式事务的使用
    后台实现显示欢迎用户登陆的方法
    AjaxHelper的get和post请求的封装类
    登陆权限验证Session和Cookie用法及BasePage类使用
    四个常用.NET的SqlHelper的方法
    ASP.NET在实际开发中验证码的用法
    SQL Server事务的存储过程
    利用JQuery实现全选和反选的几种方法
    JS中表格的全选和删除要注意的问题
  • 原文地址:https://www.cnblogs.com/LittleRedPoint/p/4009441.html
Copyright © 2011-2022 走看看