这一章主要介绍了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. 一、web自动化快速使用

        1.什么是Selenium? selenium是一款基于web网页的UI自动化测试的框架,用来做web自动化测试 支持多浏览器操作,ie.firefox.chrome.edge.safaria ...

  2. 弹性碰撞问题:Ants+Linear world

    题目一:Ants 传送门 题目描述 输入 输出 样例 样例输入 样例输出 分析 一句话题意:有n只蚂蚁在木棍上爬行,每只蚂蚁的速度都是每秒1单位长度,现在给你所有蚂蚁初始的位置(蚂蚁运动方向未定),蚂 ...

  3. appium移动端自动化测试环境搭建windows-appium-android

    第一步:安装jdk 安装jdk(1.7版本以上) 安装完成设置jdk环境变量(百度查询) cmd命令下键入 java -version命令检查jdk是否安装成功且设置环境变量成功,如下图所示: 第二步 ...

  4. C# DataTable与Excel读取与导出

    /// <summary> /// Excel->DataTable /// </summary> /// <param name="filePath&q ...

  5. FileBeat yml配置文件 -常用参数详解

    #filebeat 5.2.2 #prospector(input)段配置 filebeat.prospectors: #每一个prospectors,起始于一个破折号"-" - ...

  6. 用svg实现一个环形进度条

    svg实现环形进度条需要用到的知识: 1.会使用path的d属性画一个圆环 //用svg的path元素的A命令画圆 <path d=" M cx cy m 0 -r a r r 0 1 ...

  7. Scala 面向对象(十一):特质(接口) 四

    1 扩展类的特质 特质可以继承类,以用来拓展该类的一些功能 所有混入该特质的类,会自动成为那个特质所继承的超类的子类 如果混入该特质的类,已经继承了另一个类(A类),则要求A类是特质超类的子类,否则就 ...

  8. python 并发专题(五):离散事件仿真(事件循环生成器)

    出租车队运营仿真 创建几辆出租车,每辆车会拉几个乘客,然后回家.出租车首先驶离车库,四处徘徊,寻找乘客:拉到乘客后,行程开始:乘客下车后,继续四处徘徊. 程序解释 程序的输出示例: 创建 3 辆出租车 ...

  9. Django之 Views组件

    本节内容 路由系统 models模型 admin views视图 template模板 我们已经学过了基本的view写法 单纯返回字符串 1 2 3 4 5 6 7 8 def current_dat ...

  10. Tomcat的结构

    Tomcat其实就是一个容器,最顶层的容器叫Server,代表整个服务器,Server中包含至少一个Service,用于具体提供服务.Service主要包含两部分:Connector和Containe ...