0%

寄存器(数据存储)

总线

看操作系统的书发现需要补一补汇编的知识,于是上网找了一本好评度很高的汇编语言教科书,抽空恶补。

  • 汇编语言是机器指令的助记符,同机器指令一一对应。
  • 每一种CPU都有自己的汇编指令集。
  • CPU可以直接使用的信息在存储器中存放。
  • 在存储器中指令与数据没有任何区别,都是二进制信息。
  • 存储单元从零开始顺序编号。

每一个CPU芯片都有许多管脚,这些管脚与总线相连。也就是说,这些管脚引出总线。一个CPU可以引出3种总线的宽度标志着这个CPU不同方面的性能:
地址总线: 地址总线的宽度决定CPU的寻址能力;
数据总线: 数据总线的宽度决定CPU与其他器件传送时的一次数据传送量;
控制总线: 控制总线的宽度决定CPU对系统中其他器件的控制能力。

各类存储器芯片

  • 随机存储器
  • 装有BIOS的ROM
  • 接口卡上的RAM

PC机中各类存储器的逻辑连接
PC机中各类存储器的逻辑连接

内存地址空间

上述存储器在物理上是独立的器件,但是有两点是相同的:

  • 都与CPU的总线连接
  • CPU对它们进行读或写的时候都通过控制线发出内存读写命令

将各类存储器看做一个逻辑存储器:
将各类存储器看做一个逻辑存储器

上图中,所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器,每个物理存储单元在这个逻辑存储器中占有一个地址段,即一段地址空间。CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。

不同的计算机系统内存地址空间的分配情况是不同的,对于8086PC 机,其内存地址空间分配如下图所示:

8086PC其内存地址空间分配

从图中可知,从地址0~9FFFF的内存单元中读取数据,实际上就是在读取主随机存储器中的数据;向地址A0000~BFFFF的内存单元写数据,就是向显卡中写入数据,这些数据会被显示卡输出到显示器上;向地址C0000~FFFFF的内存单元写入数据是无效的,因为这等于改写只读存储器中的内容。

寄存器

不同的CPU,寄存器的个数,结构是不相同的。8086 CPU有14个寄存器,每个寄存器都有一个名称,这些寄存器是:AX BX CX DX SI DI SP BP IP CS SS DS ES PSW。

8086 CPU的所有寄存器都是16位的,可以存储两个字节。AX BX CX DX 这四个寄存器通常用来存放一般性数据,被称为通用寄存器。

8086 为了兼容上一代8位寄存器,使AX BX CX DX 这四个寄存器都可以分为两个可独立使用的8位寄存器来使用:

  • AX可分为AH和AL;
  • BX可分为BH和BL;
  • CX可分为CH和CL;
  • DX可分为DH和DL;

其结构如图所示:
AX可分为AH和AL

数据在其中的存储情况:
数据在其中的存储情况

几条基本汇编指令

汇编指令举例

8086CPU给出物理地址的方法

8086CPU给出物理地址的方法

如图所示,8086CPU要读写内存时:

  • CPU中的相关部件提供两个16位的地址,一个称谓段地址,一个称为偏移地址;
  • 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
  • 机制加法器将两个16位地址合成一个20位的物理地址;
  • 20位物理地址被送入输入输出控制电路;
  • 输入输出控制电路将20位物理地址送上地址总线;
  • 20位物理地址被地址总线传送到存储器。

地址加法器采用物理地址 = 段地址×16 + 偏移地址的方法合成物理地址。

段的概念

内存中并没有分段,段的划分来自于CPU。
分段

注意: 段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数,偏移地址也是16位,16位的寻址能力是64KB,所以一个段的长度最大为64KB。

CS和IP

CS和IP是8086CPU中两个最关键的寄存器,他们指示了CPU当前要读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器。在任何时刻,CPU将CS:IP指向的内容当做指令执行。

每读取一条指令,IP值自动加1,以使CPU可以读取下一条指令。

8086CPU的工作过程可以简要概述如下:

    1. 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
    1. IP = IP + 所读取指令的长度,从而指向下一条指令;
    1. 执行指令,转到步骤1,重复这个过程。

8086CPU的工作过程

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

修改CS、IP中的指令
jump 段地址:偏移地址 : 用指令中给出的段地址修改CS,偏移地址修改IP。
若想只修改IP的值,可用形如: jmp 某一合法寄存器的指令来完成。

jmp ax == mov IP,ax