总线
看操作系统的书发现需要补一补汇编的知识,于是上网找了一本好评度很高的汇编语言教科书,抽空恶补。
- 汇编语言是机器指令的助记符,同机器指令一一对应。
- 每一种CPU都有自己的汇编指令集。
- CPU可以直接使用的信息在存储器中存放。
- 在存储器中指令与数据没有任何区别,都是二进制信息。
- 存储单元从零开始顺序编号。
每一个CPU芯片都有许多管脚,这些管脚与总线相连。也就是说,这些管脚引出总线。一个CPU可以引出3种总线的宽度标志着这个CPU不同方面的性能:
地址总线
: 地址总线的宽度决定CPU的寻址能力;数据总线
: 数据总线的宽度决定CPU与其他器件传送时的一次数据传送量;控制总线
: 控制总线的宽度决定CPU对系统中其他器件的控制能力。
各类存储器芯片
- 随机存储器
- 装有BIOS的ROM
- 接口卡上的RAM
PC机中各类存储器的逻辑连接
内存地址空间
上述存储器在物理上是独立的器件,但是有两点是相同的:
- 都与CPU的总线连接
- CPU对它们进行读或写的时候都通过控制线发出内存读写命令
将各类存储器看做一个逻辑存储器:
上图中,所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器,每个物理存储单元在这个逻辑存储器中占有一个地址段,即一段地址空间。CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。
不同的计算机系统内存地址空间的分配情况是不同的,对于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;
其结构如图所示:
数据在其中的存储情况:
几条基本汇编指令
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的工作过程可以简要概述如下:
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
- IP = IP + 所读取指令的长度,从而指向下一条指令;
- 执行指令,转到步骤1,重复这个过程。
在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