本章讲的是CPU的内部结构,CPU由运算器、控制器、寄存器组成,这三种器件由CPU内部总线连接。
运算器进行信息处理,控制器进行控制器件工作,寄存器进行信息存储。
名称中带有X的寄存器,据说这个X是mix的意思,即,混合。从A到D总共有4个通用寄存器,即A(accumulator)X(累加寄存器)、B(base)X(基址寄存器)、C(count)X(计数寄存器)、D(data)X(数据寄存器)。
寄存器是有位数的,而且有高低位之分,高位在寄存器左边,低位在右边。
X之所以是mix的意思是指X=H+L,而H代表high,L代表low,H和L都可以单独当成8位寄存器来使用,L在H的右边也就是低位。
比如说AX=AH+AL,AH和AL都可以单独使用。
因此16位的通用寄存器可以存储的最大值是216-1,而8位的H或L能存储的最大值是28-1。
MOV
DES SOU:把SOU中的数据送入DES中,即,DES=SOU。
ADD
DES SOU:把SOU所代表的数据加到DES上,即,DES+=SOU。
由ADD指令所得的结果如果超出了寄存器所能保存的数值,那么超出的高位将被丢弃。
计算只能在同类型的寄存器中计算,比如说都是X或者都是H等。并且操作数不能大于寄存器所能表示的最大值。
16位的CPU是啥意思?
1、运算器一次最多处理16bit数据;
2、寄存器宽度为16bit;
3、寄存器与运算器之间的通路是16bit。
8086CPU就是这样的CPU。
8086CPU地址总线有20位,即寻址能力为220=2M,但是8086CPU是16位CPU如果不采取措施该CPU的寻址能力就是216=64K,这发挥不了CPU的全部能力。
于是8086CPU采用把两个16位地址合成20位地址的办法给出物理地址。
物理地址=段地址×16+偏移地址
CPU给出的一个16位地址为段地址,另一个16位地址为偏移地址,并把它俩放到地址加法器中按照上述公式进行16进制加法运算得到20位物理地址。具体过程可以参考P30。
本质就是基础地址+偏移地址=物理地址,其中段地址就是基础地址。
这里所说的段并不是程序在内存中的地址空间,更跟进程,线程啥的没关系。它是对内存的一种划分,是一种形象的称谓。
根据公式“物理地址=段地址×16+偏移地址”可知段的起址必定是16的倍数,由偏移地址是16位推出段的最大长度是216=64K。
段地址:SA(Segment Address)
偏移地址:EA(Excursion Address)
所以,原来的公式可以表示为:SA×16+EA=PA(Physical Address)。
段寄存器是最后一个缩写字母是S的寄存器,因为S代表Segment。在8086CPU中有4个段寄存器,它们是CS(Code Segment)、DS(Data
Segment)、ES(Extra Segment)、SS(Stack Segment)。
CS就是代码段寄存器,这个不用再解释了。
这里的IP不是Internet Protocol,而是Instruction
Pointer的缩写,代表指令指针寄存器。
联系上节加以说明的话,CS(Code Segment)就是SA(Segment Address),IP(Instruction Pointer)就是EA(Excursion
Address)。
因此公式SA×16+EA=PA可以变形为CS×16+IP=PA(Physical Address)。8086CPU就是执行CS×16+IP=PA处的指令。
取指令和执行指令的过程如下:
1、把CS提供的段地址和IP提供的偏移地址送入地址加法器进行计算得出物理地址PA;
2、把PA送入输入输出控制电路,输入输出控制电路把PA送入地址总线;
3、把PA处存储的汇编指令通过数据总线送入CPU;
4、输入输出控制电路将汇编指令送入指令缓冲寄存器;
5、IP值根据已经读入的汇编指令字节数N进行IP+=N运算以指向下一条汇编指令处;
6、把缓冲寄存器中的汇编指令送入执行控制器执行;
7、CPU从内存中IP所指处继续读取汇编指令。
CS和IP的初始态为CS=0x0000(书上写的错了),IP=0xFFFF,初始态的意思就是初始和复位时的状态,根据CS×16+IP=PA,CPU最先取的指令是0xFFFF0处的指令,该指令一定很特殊。
本节可以得出一个推论——凡是被CS:IP指过的信息都是指令,同时它也是个判定——没有被CS:IP指过的信息都不是指令。
在CPU中程序员能通过指令修改的只有寄存器。
MOV被称为传送指令。
转移指令:能够修改CS、IP内容的指令,JMP指令是其中之一,其用法如下所示:
JMP段地址偏移地址
JMP指令中的参数能直接修改CS和IP中的信息。另外,JMP也可以只带一个参数,其用法如下:
JMP某一合法寄存器
该用法用这一合法寄存器中的值去重置IP中的值。