CPU概述
内部总线
一个典型的CPU由运算器,逻辑控制器,寄存器等器件组成,这些器件靠内部总线相连。
内部总线与外部总线的区别
- 内部总线实现CPU内部各个器件之间的联系。
- 外部总线实现CPU和主板其他器件的联系。
寄存器
8086CPU有14个寄存器,他们的名称为:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。
通用寄存器
8086CPU所有的寄存器都是16位的,可以存放两个字节。
AX,BX,CX,DX通常用来存放一般性数据被称之为通用寄存器
下图是AX通用寄存器的寄存器图:
一个16位的寄存器可以存储一个16位的数据
8086上一代CPU中的寄存器都是8位的,为了保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器
- AX可以分为AH和AL
- BX可以分为BH和BL
- CX可以分为CH和CL
- DX可以分为DH和DL
8086CPU的8位寄存器存储逻辑
以AX为例,8086CPU的16位寄存器分为两个8位寄存器的情况:
- AX的低8位构成了AL寄存器,高8位构成了AH寄存器
- AH和AL寄存器是可以独立使用的8位寄存器
8086CPU的数据存储情况
寄存器 | 寄存器中的数据 | 所表示的值 |
AX | 0100111000100000 | 20000(4E20H) |
AH | 01001110 | 78(4EH) |
AL | 00100000 | 32(20H) |
从上表可以看出分成高8位和分成低8位与16位读的数据在逻辑上是有所差异的。
字在寄存器中的存储
- 一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器中和低8位寄存器中。
几条汇编指令
汇编指令不区分大小写
汇编指令 | 控制CPU完成的操作 | 用高级语言的语法描述 |
MOV AX,18 | 将18送入AX中 | AX = 18 |
MOV AH,78 | 将78送入AH | AH = 78 |
ADD AX,8 | 将寄存器AX中的数值加上8 | AX = AX + 8 |
MOV AX,BX | 将寄存器中BX中的数据送入寄存器AX中 | AX = BX |
ADD AX,BX | 将AX和BX中的内容相加,结果存放在AX中 | AX = AX + BX |
检测点2.1
写出每条汇编指令执行后相关寄存器中的值
- MOV AX,62627 AX = F4A3H
- MOV AH,31H AX = 31A3H
- MOV AL,23H AX = 3123H
- ADD AX,AX AX = 6246H
- MOV BX,826CH BX = 826CH
- MOV CX,AX CX = 6246H
- MOV AX,BX AX = 826CH
- ADD AX,BX AX = 04D8H
- MOV AL,BH AX = 0482H
- MOV AH,BL AX = 6C82H
- ADD AH,AH AX = D882H
- ADD AL,6 AX = D888H
- ADD AL,AL AX = D810H
- MOV AX,CX AX = 6246H
**只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方
MOV AX,2
ADD AX,AX
ADD AX,AX
ADD AX,AX
物理地址
- CPU访问内存单元要给出内存单元的地址。所有的内存单元构成的存储空间是一个唯一的线性空间。
- 我们将这个唯一的地址称为物理地址
概括的将,16位结构描述了一个 CPU具有以下几个方面的特征: - 运算器一次性最多可以处理16位的数据
- 寄存器的最大宽度为16位
- 寄存器与运算器之间的通路是16位的
8286有20位地址总线,可传送20位地址,寻址能力为1M,但是8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力只有64K,因此8086CPU必须采用一种机制解决这样的问题,它采取的方法是在内部用两个16位地址合成的方法来形成一个20位的物理地址,下图是合成的方法:
地址加法器合成物理地址的方法:
物理地址 = 段地址*16+偏移地址(乘以16即16进制向左移动一位,二进制数向左移动4位)
下图为合成物理地址的原理
有两点需要注意: - 段地址*16必然是16的倍数,所以一个段地址的起始地址也一定是16的倍数。
- 偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB
总结
- CPU访问内存单元时,必须向内存提供内存单元的物理地址。
- 8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。
- CPU可以用不同的段地址和偏移地址实现同一个物理地址
- 偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64K个内存单元
- 给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH.
- 在8086PC机中,存储单元的地址用两个元素来进行描述:段地址和偏移地址。
- “数据在21F60H内存单元中”。对于8086PC机的两种描述:
- 数据存在2000:1F60单元中
- 数据存在内存的2000段中的1F60H中。
可以根据需要,将地址连续,起始地址为16的倍数的一组内存单元定义为一个段。
检测点2.2
- 给定段地址为001H,仅通过变化偏移地址寻址,CPU的寻址范围为0010H到1000FH.
- 有一组数据放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻址到此单元。则SA应该满足的条件是;最小为:1001H,最大为2000H.
- 物理地址 = SA*16+EA
- 20000h = SA*16+EA
- SA = (20000H-EA)/16 = 2000H-EA/16
- EA取最大值时,SA取最小值,2000H-FFFFH/16 = 1001H
- EA取最小值时,SA取最大值,2000H-0H/16 = 2000H
段寄存器
段寄存器就是提供段地址的,
8086有4个段寄存器:
- CS:代码段寄存器
- DS:数据段寄存器
- SS:堆栈段寄存器
- ES:附加段寄存器
当8086CPU要访问内存时,由这四个段寄存器提供内存单元的段地址。
CS和IP是8086CPU中最关键的寄存器,他们指示可CPU当前要读取指令的地址。 - CS为代码段寄存器
- IP为指令指针寄存器
CPU读取和执行指令的相关部件
具体过程的详细步骤:
- 从CS:IP指向内存单元读取指令,读取的指令进入进入指令缓冲器
- IP = IP + 所读取到的指令的长度,从而指向下一条指令
- 执行指令。转到步骤(1),重复这个过程。
CPU工作过程的简要描述
- 在8086CPU加电启动或复位后(即CPU刚开始工作时),CS和IP被设置为CS = FFFFH,IP= 000H.
- 即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行。
- FFFF0H单元中的指令是8086PC即开机后执行的第一条指令。
- 在任何时候,CPU将CS,IP中的内容当做指令的段地址和偏移地址,用他们合成指令的物理地址,到内存中读取指令码,执行。
- 如果说,内存中的一段信息曾被CPU执行过的话,它所在的内存单元必然被CS:IP指向过。
修改CS、IP的指令
- 在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对于CPU的控制。
- CPU执行指令是由CS,IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
- 8086CPU为CS、IP提供了另外的指令来改变他们的值:转移指令
- 同时修改CS、IP的内容:
- jmp 段地址:偏移地址
- jmp 2AE3:3(最终物理地址:2AE33)
- jmp 3:0B16(最终物理地址:0B46)
- 功能:用指令中给出的段地址修改CS,偏移地址修改IP。
- 仅仅修改IP的内容:
- jmp 某一合法寄存器
- jmp ax (类似于mov IP,ax)
- jmp bx
功能:用寄存器中的值修改IP
代码段
- 对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
- 可以将长度为N(N <= 64kb)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,这一段内存是用来存放代码的,从而定义了一个代码段。
- CPU只认被CS:IP指向的内存单元中的内容为指令,因此要将CS:IP指向所定义的代码段中的第一条指令的首地址。
总结
- 段地址在8086CPU的寄存器中存放。当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有四个段寄存器,其中CS用来存放指令的段地址。
- CS存放指令的段地址,IP存放指令的偏移地址。
- 8086机中,任意时刻时,CPU将CS:IP指向的内容当做指令执行。
- 8086CPU 的工作过程:
- 从CS:IP指向内存单元的读取指令,读取的指令进入指令缓冲器
- IP指向下一条指令
- 执行指令。(转到步骤1,重复这个过程)
检测点2.3
下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP的值是多少?
mov ax,bx
sub ax,ax
jmp ax
一共修改了四次:
第一次:读取了mov ax,bx指令
第二次:读取了sub ax,ax指令
第三步:读取了jmp ax指令
第四步:执行jmp ax修改了IP内容
IP = 0