2.1 简介
一个典型的CPU由运算器,控制器,寄存器等器件组成,这些器件靠内部总线相连。
区别: 内部总线实现CPU内部各个器件之间的联系。
外部总线实现CPU和主板上其他器件的联系。
8086的所有寄存器都是16位的,可以存放两个字节
AX,BX,CX,DX通常用来存放一般数据,叫做通用寄存器,然后我们以AX为例来看一些寄存器的逻辑结构。
20000变成二进制存储进AX如下图。
8086是16位的CPU,为了兼容上一代8位的CPU,所以将AX分为AH和AL,高位和地位存储,AH和AL都是可以独立使用的8位寄存器。
8位CPU存储状况如下图:拆开后就是两个数字,合起来看又是另一个数字哈哈哈哈。
2.2 几条汇编指令
汇编指令不区分大小写
AH和AL寄存器,说到底还是两个不同的寄存器,如果AL中的值溢出了,他不会在AH里面进一位,而是当溢出来算。 如果把AL换成AX,那答案就是158H。
这里的溢出,不是真正的溢出,只是不能在这个8位寄存器中存放,会存放到别的地方。
2.2.1 字在寄存器中的存储
由于一个内存单元可以存放8位数据,CPU中的寄存器又可存放n个8位数据。也就是说,计算机中的数据大多是由N个8位数据构成的。
用16禁止表示数据可以直观的看出这个数据由哪些8位数据构成的。
2.4 物理地址
CPU访问内存单元时要给出内存单元的地址所有的内存单元构成的存储空间是一个线性空间。
我们将这个唯一的地址称为物理地址。
16位结构的CPU
- 运算器一次可以处理16位数据。
- 寄存器最大宽度为16位。
- 寄存器和运算器之间的通路时16位。
CPU提供两个地址,一个段地址和一个偏移地址,传进加法器,出来就是一个物理地址
物理地址 = 段地址*16+偏移地址
比如,从学校走2826到如树冠,这个2826是图书馆的物理地址
从学校走2000到体育馆,再走826到图书馆,
2000就是相对于起点的基础地址
826是相对于基础地址的偏移地址
CPU可以用不同的段地址和偏移地址表示同一个物理地址。
小结
地址表示:数据在21F60内存单元中,对于8086有两种描述:
- 数据存储在2000:1F60中
- 数据存在内存的2000段中的1F60中。
2.5 段寄存器
段寄存器就是提供段地址的
8086有4个段寄存器 CS\DS\SS\ES
CS为代码段寄存器
IP为指令指针寄存器
在工作开始,CPU启动或复位后,CS和IP被设置为CS=FFFFH,IP=0000H。
即在PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行。
FFFF0H单元中的指令是8086PC机开机启动后执行的第一条指令。
2.5.1 修改CS,IP的指令
在CPU中,程序员能够用指令读写的不见只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
CPU从何处执行指令是由CS,IP中的内容来决定的,程序员可以改变寄存器的内容来控制CPU执行目标指令。
如何改变CP,IP的值呢?
MOV指令不能改变CS和IP的值
用JMP指令修改 段地址+偏移地址(同时修改CS,IP)
jmp 2AE3:3 //2AE33
jmp 3:0B16 //B46H
仅修改IP内容
jmp ax
jmp bx
2.5.2 代码段
对于8086PC,编程时,可以根据需要将一组内存单元定义为一个段。就是可以将长度为N(N<=64KB)的一组代码存在一组地址连续,起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。
例如:
这段长度为10个字节的指令,存在123B0H~123B9H中,我们就可以认为这段内存单元是用来存放代码的,是一个代码段,他的段地址为123BH,长度为十个字节。
如何使得代码段中的指令来执行?
讲一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU不认识,不会自动将这个代码段的指令当成指令来执行。CPU只认识被CS:IP指向的内存单元中的内容为指令。
小结
- 段地址在8086CPU中的寄存器存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址。
- CS放指令段地址,IP放指令偏移地址,任意时刻CPU将CS:IP指向的内容当作指令执行。
- 8086CPU的工作过程
- 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器
- IP指向下一条指令
- 执行指令(转到步骤a,重复这个过程)
- 8086CPU提供转移指令修改CS,IP的值。