典型的CPU是由运算器
器件 | 功能 |
---|---|
运算器 | 进行信息处理 |
寄存器 | 进行信息存储 |
控制器 | 控制各种器件进行工作 |
内部总线 | 在以上器件之间进行数据的传送 |
我们可以通过汇编指令改变各种寄存器中的内容来实现对CPU的控制,不同的CPU,寄存器的个数不同
8086是16位机, 字长为16,16位结构,这几种说法描述了一个CPU具有下面几方面的结构特性:
- 运算其器一次最多可以处理16位的数据
- 寄存器的最大宽度为16位
- 寄存器和运算器之间的通路为16位
内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放。8086是16位结构的CPU,这也就是说,在8086内部,能够一次性处理、传输、暂时存放的信息的最大长度是16位的。
8086CPU有20位地址总线,可以传送20位地址,达到1MB的寻址能力,而CPU内部一次性处理、传输、暂时存储的地址为16位,如果将地址简单的从CPU内部发出,那么表现出来的寻址能力只有64KB.
为此,引入段地址。地址加法器采用物理地址=段地址*16+偏移地址的方法合成物理地址,当8086CPU要读写内存时:
- CPU中相关部件提供两个16位的地址,一个称为段地址,另一个成为偏移地址
- 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
- 地址加法器将两个16位地址合成一个20位的物理地址
- 地址加法器通过内部总线将20位物理地址送入输入输出控制电路
- 输入输出控制电路将20位物理地址送上地址总线
- 20位物理地址被地址总线传送到存储器
段地址存放在段寄存器中,存放指令的段地址,8086CPU有4个段寄存器:CS、DS、SS、ES,当8086CPU要访问内存时由这4个段寄存器提供内存单元的段地址。(通用寄存器:AX、BX、CX、DX)
代码段寄存器:CS,指令指针寄存器:IP,假设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始,读取一条指令并执行。在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令
在内存中,指令和数据没有任何区别,都是二进制信息,CPU在工作的时候怎么知道那些是指令那些是数据呢?现在可以确定的是,CPU将CS:IP指向的内存单元中的内容看做指令,因为在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址
如何修改CS、IP的值?我们可以通过mov指令修改通用寄存器的值,但该指令对于CS、IP并不适用,可以使用“jmp 段地址:偏移地址“指令来实现:
jmp 3:0B16,执行后:CS=0003H,IP=0B16H,CPU将从00B46H处读取指令
jmp ax,指令执行前:ax=1000H,CS=2000H,IP=000H
指令执行后:ax=1000H,CS=2000H,IP=1000H
也就是用寄存器中的值修改IP(CS值不变)