zoukankan      html  css  js  c++  java
  • 第2章 寄存器(CPU工作原理)(下)

    2.4  物理地址

    CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。

    每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。

    2.5     16位结构的CPU

    概括的将,16位结构描述了一个CPU具有以下几个方面特征:

    1、运算器一次最多可以处理16位的数据

    2、寄存器的最大宽度为16位

    3、寄存器和运算器之间的通路是16位的。

    2.6    8086CPU给出物理地址的方法

    8086有20位地址总线,可传送20位地址,寻址能力为1M。

    8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。

     

    8086CPU采用一种在内部用两个16位地址合成的方法来形容一个20位的物理地址。

    地址加法器合成物理地址的方法:

    物理地址=段地址  x  16+偏移地址

     观察移位次数和各种形式数据的关系:

    1)一个数据的二进制形式左移1位,相当于该数据乘以2;

    2)一个数据的二进制形式左移N位,相当于该数据乘以2的N次方

    3)地址加法器如何完成段地址x16的运算?

      以二进制形式存放的段地址左移4位。

    基础地址+偏移地址=物理地址

    段地址x16+偏移地址=物理地址

    2.8   段的概念

    错误认识:

    内存被划分成了一个一个的段,每一个段有一个段地址。

    其实:

    内存并没有分段,段的划分来自于CPU,由于8086CPU用   段地址x16+偏移地址=物理地址   的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。

     我们可以认为:地址10000H~100FFH的内存单元组成一个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H

     我们也可以认为地址10000H~1007FH、10080H~100FFH的内存单元组成两个段,他们的起始地址(基础地址)为10000H和10080H,段地址为:1000H和1008H,大小都为80H。

    以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址x16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。

    监测点2.2

     

     2.9   段寄存器

    段寄存器就是提供段地址地。

    8086CPU有4个段寄存器

    CS、DS、SS、ES

    当8086CPU要访问内存时,由这4个段寄存器提供内存单元地段地址。

     

    2.10  CS和IP

    CS和IP是8086CPU中最关键的寄存器,他们指示了CPU当前要读取指令的地址。

    CS为代码段寄存器

    IP为指令指针寄存器

    8086PC工作过程的简要描述

    1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;

    2)IP=IP+所读取指令的长度,从而指向下一条指令;

    3)执行指令。转到步骤(1),重复这个过程。

    在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。

    内存中指令和数据没有任何区别,都是二进制信息,CPU在工作的时候把有的信息看作指令,有的信息看作数据。

    CPU根据什么将内存中的信息看作指令?

    CPU将CS:IP指向的内存单元中的内容看作指令。

    在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用他们合成的物理地址,到内存中读取指令码,执行。

    如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。

     

    2.11  修改CS、IP的指令

    在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。

    CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。

    8086CPU必须提供相应的指令

    mov指令不能用于设置CS、IP的值,8086CPU没有提供这样的功能。

    8086CPU为CS、IP提供了另外的指令来改变他们的值:转移指令

    同时修改CS、IP的内容:

    jmp   段地址:偏移地址

      jmp  2AE3:3

      jmp  3:0B16

    功能:用指令中给出的段地址修改CS,偏移地址修改IP。

    仅修改IP的内容:

    jmp  某一合法寄存器

      jmp    ax(类似于  mov   IP,  ax)

      jmp    bx

    功能:用寄存器中的值修改IP。

     2.12  代码段

    对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。

    可以将长度为N(N≤64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。

    例如:

    这段长度为10字节的字节的指令,存在从123B0H~123B9H的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存单元是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10字节。

    如何使得代码段中的指令被执行呢?

    将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就自动地将我们定义得代码段中得指令当作指令来执行。

    CPU只认被CS:IP指向得内存单元中的内容为指令。

    所以要将CS:IP指向所定义的代码段中的第一条指令的首地址。

    CS=123BH,IP=0000H。

    小结:

    1、段地址在8086CPU的寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址。

    2、CS存放指令的段地址,IP存放指令的偏移地址。

    8086机种,任意时刻,CPU将CS:IP指向的内容当作指令执行。

    3、8086CPU的工作过程:

    1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;

    2)IP指向下一条指令;

    3)执行指令。(转到步骤1,重复这个过程)

    4、8086CPU提供转移指令修改CS、IP的内容。

  • 相关阅读:
    基于OWin的Web服务器Katana发布版本3
    如何在.NET上处理二维码
    .NET开源OpenID和OAuth解决方案Thinktecture IdentityServer
    ASP.NET Identity V2
    Azure Redis Cache
    CentOS 7 安装RabbitMQ 3.3
    ASP.Net MVC 5 in Xamarin Studio 5.2
    Centos 7.0 安装Mono 3.4 和 Jexus 5.6
    CentOS下GPT分区(转)
    CentOS下使用LVM进行分区(转)
  • 原文地址:https://www.cnblogs.com/fate-/p/12843063.html
Copyright © 2011-2022 走看看