[关闭]
@guoxs 2016-03-26T16:57:56.000000Z 字数 1845 阅读 4834

寄存器(数据存储)

汇编语言


总线

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

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

各类存储器芯片

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

内存地址空间

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

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

上图中,所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器,每个物理存储单元在这个逻辑存储器中占有一个地址段,即一段地址空间。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

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

几条基本汇编指令

汇编指令举例

8086CPU给出物理地址的方法

8086CPU给出物理地址的方法

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

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

段的概念

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

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

CS和IP

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

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

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

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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注