CPU与逻辑存储器的联系是通过数据总线、地址总线、控制总线实现的,而这些总线均是从CPU连出来,再连接到相应的位置的,所以这些总线被称为外部总线。CPU通过外部总线进行数据和指令的获取,而CPU对指令的处理和对数据的运算是在CPU内部完成的,自然,CPU内部也需要存放数据的器件,而这些器件则通过内部总线来实现联系。
CPU的内部器件介绍:
- 1. 运算器:进行信息处理;
- 2. 寄存器:存储信息;
- 3. 控制器:控制各器件的工作;
这些器件都通过内部总线联系起来,有内部总线来实现它们之间的数据传送。
寄存器
8086CPU中的所有寄存器均为16位,均可以存放两个字节。
(1)、通用寄存器(ax、bx、cx、dx):
之所以这四个寄存器被称为通用寄存器,是因为它们通常用来存放一般性的数据。
以ax为例:
ax是十六位寄存器,它可以存放16个位的数据(即一个字),ax同样也可以当做两个8位的寄存器(高八位寄存器ah和低八位寄存器al)
以此类推,bx、cx、dx也同样具有这样的特点。并且此后为了方便书写和表达一个十六位的字数据可以用4个16进制的数据来表示(如0000000000000001可已被表示为0001H)
(2)、常用的几条汇编指令:
1) mov:在需要改变寄存器中的数据的时候可以使用这条指令来实现。
具体格式为(mov ax或bx,数据或寄存器)。
2) add:与mov的语法格式相同,所不同的是add ax,bx操作是将ax中的数据加上bx中的数据加得的结果再存入ax中。
(3)、CPU对地址的访问:由于8086CPU中的寄存器、运算器都只能一次性最多处理16位的数据,而CPU与存储器之间相连的地址总线宽度为20(即反映出存储器中存储单元的地址都是20位二进制数,即4位16进制数)所以仅仅依靠16位的数据是无法对存储单元进行访问的。
给出8086CPU访问存储单元的方法:使用某一种算法将两个16位的地址合成一个真正的物理地址。采用段地址(16位)*16+偏移地址(16位)=物理地址(20位)的方法。
段地址*16得到的是逻辑存储器中的一段存储空间的首地址,再通过首地址加上偏移地址的方法来得到存储单元的物理地址。
既然需要通过两个地址(段地址和偏移地址)来获得物理地址,那么这两个地址(16位数据)自然需要两个寄存器来存放它们,而这个操作是由CPU内的段寄存器来实现的。
(4)、代码段寄存器cs和指令指针寄存器ip:cs里存放的是段地址,ip里存放的是偏移地址,CPU对存储器的访问是由cs:ip(=cs*16+ip)来指示的,任意时刻,CPU都是从cs:ip所指向的存储单元来读取指令的。
0 |
1 |
2 |
3 |
4 |
(5)、指令执行的顺序(如右图):
012这三个存储单元里存储的是mov ax,3H(占三个字节)
34这两个存储单元里存放的是mov bx,ax(占两个字节)
假如初始状态cs=0H,ip=0H,那么CPU就会在0地址里面读取
指令。
CPU从0号存储单元中把数据取过来以后,数据会进入指令缓冲器,经过将ip的值加上这条指令所占的字节数,然后再执行指令的操作。第一条指令执行完了的状态下cs=0H,ip=3H正好指向3号存储单元。以备执行下一条指令。
(6)、对cs,ip中值的修改:使用指令jmp,格式为(jmp 改之后cs中的数据:改之后ip中的数据和jmp 寄存器ax或bx(此条只改变ip中的值))。
(7)、代码段:根据需要将一组内存单元定义为一个代码段(这一组内存单元需要满足首地址是16的倍数,大小小于等于64KB(因为偏移地址只有16位))。