这一章主要介绍了CPU中的重要器件——寄存器,整个系列通篇是以8086CPU作为探讨对象,其它更高级的CPU都是在此基础之上进行的升级。
 
1、一个典型的CPU是由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
     区别:内部总线实现CPU内部各个器件之间的联系。
                外部总线实现CPU和主板上其它器件的联系。
 
2、8086CPU有14个寄存器,有8个通用寄存器
     AX、BX、 CX、 DX、 SI、 DI、 SP、 BP、 IP、 CS 、SS、 DS、 ES、 PSW
     8086CPU所有的寄存器都是16位的,可以存放两个字节。
     AX、BX、CX、DX通常用来存放一般性数据,被称为通用寄存器。
 
3、16位寄存器的逻辑结构
      如下图所示:
    所以16位数据在寄存器中的存放情况如下图所示:
 
4、一个16位寄存器可以存储一个16位的数据,那么这个16位寄存器所能存储的数据的最大值为2^16-1。
 
5、8086上一代CPU(8088等)中的寄存器都是8位的,为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。
     因此,AX可以分为AH和AL,高8位和低8位(这样做是为了兼容低版本的CPU);
     BX分为BH和BL,CX分为CH和CL,DX分为DH和DL
     以AX为例,8086CPU16位寄存器分为两个8位寄存器的情况:
   AX的低8位(0-7位)构成了AL寄存器,高8位(8-15位)构成了AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器。
     8086CPU的8位寄存器数据存储情况:
     高八位和低八位分别可以代表不一样的数字,但是二者结合在一起又会是另一个数字。
 
6、字在寄存器中的存储
     一个字可以存储在一个16位寄存器中,这个字的高位字节和低位字节自然就存储在这个寄存器的高8位和低8位寄存器中。
 
7、几条汇编指令
 
8、物理地址
     CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。
     我们将这个唯一的地址称为物理地址。
 
9、16位结构的CPU
     概括的讲,16位结构描述了一个CPU具有以下几个方面的特征:
     (1)运算器一次可以处理16位的数据。
     (2)寄存器的最大宽度为16位。
     (3)寄存器和运算器之间的通路是16位的。
 
10、8086CPU给出的物理地址的方法
     8086有20位地址总线,可传送20位地址,寻址能力为1M。(外部)
     8086内部为16位结构,只能传送16位的地址,表现出的寻址能力却只有64K。(内部)
     这样内外部就会产生冲突,那么工程师是如何解决这样的冲突的呢?
     如图所示:
 
     8086CPU读写内存时:(1)CPU中的相关部件提供两个16位的地址,一个为段地址,一个为偏移地址;
                                          (2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
                                          (3)地址加法器将两个16位地址合并成一个20位的地址;
     地址加法器合成物理地址的方法:
                                           物理地址=段地址*16+偏移地址(很重要,这个公式!)
 
      首先CPU会将地址(段地址和偏移地址)通过内部总线传送到地址加法器中,然后将段地址左移1位(16进制的数乘以16),再加上偏移地址,最后就得出了最终想要的物理地址。
      打个比方,我要从学校去图书馆,之间有一个体育馆,学校到图书馆的距离是2286m,学校到体育馆的距离是2000m,体育馆到图书馆的距离是286m,那么学校到体育馆之间的距离就可以看做是段地址,体育馆到图书馆的距离就是偏移地址。假设我要将这个距离写在一张只有3个数字匡的纸条上的话,我就需要先写上段地址200,再乘上10,再加上偏移地址286,这样就得到了最终的结果。
 
 
11、段的概念
     错误认识:内存被划分为一个个的段,每一个段都有一个段地址。
     其实,内存并没有分段,段的划分来自于CPU,由于8086CPU用“(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
     因此,在以后的编程中,我们可以根据实际需要,将若干个地址连续的内存单元看做 一个段,用段地址*16来定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
     段地址*16必然是16位的倍数,偏移地址为16位,16位地址的寻址能力为64k,所以一个段的最大长度为64k。
 
12、内存单元地址小结
     CPU访问内存单元时,必须向内存提供内存单元的物理地址;
     8086CPU在内部用段地址和偏移地址移位想家的方法形成最终的物理地址。
     21F60H这个物理地址,可以有很多种不同的基地址左移一个16位+偏移地址构成。
      因此,8086CPU的寻址能力最大也就是64KB个内存单元。比如给定一个段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H----1FFFFH。
 
 
13、段寄存器
     段寄存器就是提供段地址的,8086CPU有4个段寄存器:CS、DS、SS、ES
     当8086CPU访问内存时,由4个段寄存器提供内存单元的段地址。
 
14、CS和IP
     CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
     CS为代码段寄存器,ip为指令指针寄存器 
     CS:ip指向内存单元执行过程如下所示:
          (1)从CS:ip中指向的内存单元中读取指令,读取的指令进入指令缓冲区。在此之前,CS:IP要经过地址加法器,然后将算好的20位地址通过内部总线传送到输入输出控制                    电路中。再通过20位的地址总线,传送到内存当中,找到物理地址所指向的内存单元。然后将内存单元中的指令通过数据总线传送到指令缓冲区中,执行控制器进行指                      令的执行,将结果传到其他部件当中。
          (2)执行完一条指令后,ip的值自动增加,具体增加多少就要看指令的长度是多少,三位的指令的话,就在原有基础上增加三位的长度,此时CS:IP发生变化,再重复(1)                    中的过程。
 
15、修改CS、IP的指令
     在CPU中,程序猿能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
     CPU从何处执行指令,是由CS、IP的内容来决定的,因此对CPU进行控制,也就是对CS、IP的内容进行修改罢了,改变CPU执行的目标而已。
     那么我们应该如何改变CS、IP的值呢?
     在此之前,我们可以回顾一下如何改变AX(通用寄存器)中的值。通过mov ax 1532H这条mov指令即可改变AX中的值,但是这样的传送指令能用于CS这样的代码寄存器中吗?        答案是不能,因为8086CPU没有提供这样的功能。8086CPU为CS、IP提供了另外的指令来改变它们的值:转移指令
  (1)同时修改CS、IP的内容:jmp 段地址:偏移地址
                jmp 2AE3:3     这里意思就是指示CPU跳到2AE33这个物理地址上,用段地址2AE3修改原来的CS,偏移地址3修改原来的ip。
       (2)仅修改ip的内容:
              jmp 某合法寄存器     jmp ax(类似于传送指令mov一样的效果,mov IP,AX)     
                这里就是用寄存器中的值来修改IP。
 
16、代码段
     对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
     可以将长度为N(N<=64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。
     如何使得代码段中的指令被执行呢?就是将CPU指向这个代码段,该代码段中的指令就会被执行。CPU只认被CS:IP指向的内存单元中的 内容为指令。
     所以要将CS:IP指向所定义的代码段的第一条指令的地址。
 
17、段寄存器小结
     段地址存放在8086CPU的寄存器中,段寄存器提供内存单元的段地址,给CPU去访问内存空间。8086CPU有4个段寄存器,其中CS用来存放指令的段地址。
     IP是用来存放指令的偏移地址,在8086PC机中,CPU在任意时刻,都将CS:IP指向的内容当做指令来执行。
     8086CPU为CS、IP提供了另外的指令来改变它们的值:转移指令(jmp)。
 
    既然内存单元的访问地址可以干预,那么我们就可以把木马程序的初始访问地址写在杀毒软件的内存访问初始地址之前,这样就可以做到不被杀毒软件给查杀了吧(不知道这样的     想法有没有错误,欢迎大牛不吝赐教!)。

小甲鱼零基础汇编语言学习笔记第二章之寄存器(CPU工作原理,CPU内部通讯)的更多相关文章

  1. 小甲鱼零基础汇编语言学习笔记第五章之[BX]和loop指令

         这一章主要介绍什么是[BX]以及loop(循环)指令怎么使用,loop和[BX]又怎么样相结合,段前缀又是什么鬼,以及如何使用段前缀.   1.[BX]的概念      [BX]和[0]类似 ...

  2. 小甲鱼零基础入门学习python--课后作业

    [小甲鱼零基础入门学习python--课后作业] 小甲鱼零基础入门学习python--课后作业 本章内容: 1.基础部分的作业 2.函数部分的作业 3.字典.集合.文件部分作业 4.异常 5.Easy ...

  3. 小甲鱼零基础学python第25讲课后习题动手练习--通讯录

    小甲鱼零基础学python第25讲课后习题动手练习---通讯录 **************************通讯录要求******************************* 输入指令: ...

  4. The Road to learn React书籍学习笔记(第二章)

    The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...

  5. 《DOM Scripting》学习笔记-——第二章 js语法

    <Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...

  6. [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”

    [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...

  7. 改进我们的小游戏 - 零基础入门学习Python004

    改进我们的小游戏 让编程改变世界 Change the world by program 改进我们的小游戏 很多鱼油对改善这个游戏提出了建议,小甲鱼做了一下总结,大概有以下几个方面需要改进: 猜错的时 ...

  8. 小甲鱼零基础python课后题 P22 021函数:递归是神马

    0.递归在编程上的形式是如何表现的呢? 答:在编程上,递归表现为函数调用本身这么一个行为. 1.递归必须满足哪两个基本条件? 答:1函数调用自己. 2有正确的返回条件 2.思考一下,按照递归的特性,在 ...

  9. 零基础入门学习python--第二章 用Python设计第一个游戏

    知识点汇总1. 什么是BIF? BIF(Built-in Functions)内置函数,共68个,可直接调用,方便程序员快速编写脚本程序.输入dir(__builtins__)即可查看所有内置函数,h ...

随机推荐

  1. SpringMVC+Spring+Hibernate个人家庭财务管理系统

    项目描述 Hi,大家好,今天分享的项目是<个人家庭财务管理系统>,本系统是针对个人家庭内部的财务管理而开发的,大体功能模块如下: 系统管理模块 验证用户登录功能:该功能主要是验证用户登录时 ...

  2. MySQL的数据类型 及注意事项

    MySQL的数据类型 注意   选择合适的数据类型,能节省储存空间,提升计算性能.(1)在符合应用要求(取值范围.精度)的前提下,尽量使用“短”数据类型(2)数据类型越简单越好.(3)在MySQL中, ...

  3. html中map area 热区自适应的原生js实现方案

    在做自适应网页的时候,如果在图片中使用了热区map.图片可以通过样式实现:图片大小随页面变化,但是MAP中每个area的坐标并不能通过css直接实现自适应.这篇文章就介绍通过原生js来实现:MAP中每 ...

  4. 一起来看 HTML 5.2 中新的原生元素 <dialog>

    不到一个月前,HTML 5.2 正式成为 W3C 的推荐标准(REC),其中,推出了一个新的原生模态对话框元素 <dialog>,乍一看,可能感觉它就是一个新增的元素,然而,作者最近在玩的 ...

  5. Esp8266 网络结构体

    Esp8266建立网络连接相关结构体如下: 结构体头文件espconn.h /** Protocol family and type of the espconn */ enum espconn_ty ...

  6. 03 flask源码剖析之threading.local和高级

    03 threading.local和高级 目录 03 threading.local和高级 1.python之threading.local 2. 线程唯一标识 3. 自定义threading.lo ...

  7. C#程序安装为windows服务的方式

    项目开发中,需要将采集程序以windows服务的形式进行部署,可分为定时采集程序以及监控采集程序. 1.定时采集程序 采用Quartz.net框架实现定时任务,针对该种情形,可采用批处理文件的形式进行 ...

  8. bzoj1661[Usaco2006 Nov]Big Square 巨大正方形*

    bzoj1661[Usaco2006 Nov]Big Square 巨大正方形 题意: n*n的图中有一些J点,一些B点和一些空白点,问在空白点添加一个J点所能得到的有4个J点组成最大正方形面积.n≤ ...

  9. bzoj3211花神游历各国&&bzoj3038上帝造题的七分钟2*

    bzoj3211花神游历各国 题意: n个数的序列,m个操作,操作两种:区间开根(向下取整)和区间求和.n≤100000,m≤200000,序列中的数非负且≤109. 题解: 一个≤109的数开6次根 ...

  10. java 正则提取字符串中的电话号码

    public static void test2() { String str = "张三:13539558064,李四:15626829748,赵六:13718952204"; ...