这一章主要介绍了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. 在具体的前端工作中通常HTML页面乱码怎么解决?

    HTML文件乱码一般是因为编码格式不匹配造成的,比如:不同编码内容混杂.浏览器不能自动检测网页编码等等:但无论是哪种情况造成乱码,在HTML文件头中设置网页编码,匹配好编码格式就可. 下面是一个中文乱 ...

  2. 使用@AutoConfigureBefore、After、Order调整Spring Boot自动配置顺序

    前言 Spring Boot是Spring家族具有划时代意义的一款产品,它发展自Spring Framework却又高于它,这种高于主要表现在其最重要的三大特性,而相较于这三大特性中更为重要的便是Sp ...

  3. Linux多任务编程之七:Linux守护进程及其基础实验(转)

    来源:CSDN  作者:王文松  转自Linux公社 ------------------------------------------------------------------------- ...

  4. 终于理解Python中的迭代器和生成器了!

    迭代器和生成器 目录 迭代器和生成器 可迭代对象和迭代器 基础概念 判断 for循环本质 不想用for循环迭代了,如何使用迭代器? 列表推导式 生成器Generator 概念 如何实现和使用? 生成器 ...

  5. scrapy 源码解析 (一):启动流程源码分析(一)命令行启动

    前言 虽然爬虫的入门级编写并不难,但要让爬虫真正稳定可靠的运行起来,真不是一件容易的事.首先,要用到scrapy,就必须要读懂scrapy这个爬虫框架,如果连这个框架的执行逻辑都搞不懂,那么爬虫也很难 ...

  6. Mysql and ORM

    本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 外键 增删改查表 权限 事务 索引 python 操作mysql ORM sql ...

  7. Python基础点记录1

    1 变量:一个变量就是一个单词,只有一个单一的值 1 Python里面的数据类型 interage , floats , booleans , String等 2 Python是一个区分大小写的语言 ...

  8. MVC + EFCore 项目实战 - 数仓管理系统6 – 数据源管理上--使用view component完成卡片列表

    上次课程我们完成了菜单的配置和开发里程碑的划定. 按照计划,我们先来开发数据仓库管理中的数据源管理(对应菜单为:数据仓库管理 / 数据源),首批支持的数据源是SQL SERVER数据库. 一.数据源管 ...

  9. 加班两个星期做的一个小系统~(winform)

    不管怎么样~加班两个星期,单独一人,努力将公司需要用的系统给做出来了,也感谢提供技术帮助的可爱人儿~ 首先,系统有个检测版本的功能,若版本不是最新的,则会自动更新(公司要求,必须强制更新)~ 更新界面 ...

  10. Linux 终端最全推荐(建议收藏)

    本文来自网络整理,如有侵权,则可删除. 如果你跟我一样,整天要花大量的时间使用Linux命令行,而且正在寻找一些可替代系统自带的老旧且乏味的终端软件,那你真是找对了文章.我这里搜集了一些非常有趣的终端 ...