CPU概述
一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
区别:
内部总线实现CPU内部各个器件之间的联系;
外部总线实现CPU和主板上其他器件的联系。
寄存器概述
8086CPU有14个寄存器,它们的名称为:
AX BX CX DX SI DI SP BP IP CS SS DS ES PSW
2.1 通用寄存器
8086CPU 所有的寄存器都是16位,可存放两个字节。
通用寄存器:AX BX CX DX
一个16位寄存器所能存储的数据的最大值
2
16
2^{16}
216-1.(即0-15位全部为1)
8086CPU上一代CPU
AX分为 AH AL(high low高低位)
2.2字在寄存器中的存储
字(word)
1 word =2 Byte
2.3 几条汇编指令
例:(16位溢出情况)
例(8位溢出情况 AL与AH 无关,CPU在执行这条指令时认为AL与AH是两个不相关的存储器)
CPU并不是真的丢弃这个进位值
指令的两个操作对象的位数应当一致
(1)
F4A3H
31A3H
3123H
6246H
826CH
6246H
826CH
04D8H
0482H
6C82H
D882H
D888H
D810H
6246H
(2)
mov ax 2
add ax ax
add ax ax
add ax ax
2.4 物理地址
2.5 16位结构的CPU
特性:
- 运算器一次最多可以处理16位的数据
- 寄存器的最大宽度为16位
- 寄存器和运算器之间的通路为16位
2.6 8086CPU给出物理地址的方法
8086有20位地址总线,寻址能力为
2
20
2^{20}
220/1024=
2
10
2^{10}
210B,即 1 M。
8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力为
2
6
2^{6}
26K(64K)
如何转换?
地址加法器采用物理地址+段地址*16+偏移地址
二进制移动左移4位,或者说十六进制左移1位即乘以16;
2.8 段的概念
内存并没有分段,段的划分来自于CPU。
在编程时可以根据需要,将地址连续的内存单元看成一个段,用段地址*16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。
注意两点:
CPU可以用不同的段地址和偏移地址形成同一个物理地址。
2.偏移地址16位,变化范围为:0~FFFFH,则若给定一个段地址,可确定CPU的寻址范围。
21F60H 即段为2000H段的1F60单元中。
“数据存在21F60H内存单元中",这句话对于8086PC机有两种表述:
- 数据存在内存2000:1F60单元中
- 数据存在内存的2000H段的1F60H单元中
(1)(0010+0)H,(0010+FFFF)H
即00010H
1000FH
(2)1001,2000
当段地址给定为 1001H 以下和 2000H 以上,CPU无论怎么变化偏移地址都无法寻到20000H单元。
最大易得,最小时,20000-ffff=10001,将1000代入反过来求,20000不在范围之内。故选1001.
2.9 段寄存器
段寄存器就是提供段地址的。
8086CPU有四个段寄存器:CS、DS、ES、SS
2.10CS和IP
CS和IP是8086CPU最关键的寄存器。它们指示了CPU当前要读取指令的地址。
CS为代码段寄存器,IP为指令指针寄存器。
CS存放指令的段地址,IP存放指令的偏移地址
8086CPU的工作过程:
(1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
(2)IP=IP+所读取指令的长度,从而指向下一条指令;
(3)执行指令。转到步骤(1),重复这个过程。
2.11 修改CS、IP的指令
mov指令(传送指令)不能用于设置CS、IP的值。
8086CPU为CS、IP提供了另外的指令来改变它们的值,即转移指令。
jmp指令:
- 同时修改CS、IP的内容,jmp 2AE3:3;,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33处开始读取指令。
- 仅修改IP的内容,jmp ax,即把ax的值赋给IP。(mov IP,ax,并非真的有此mov语句)
2.12 代码段
我们可以将长度为N(N<=64KB)的一组代码,存在一组地址连续,起始地址为16的倍数的内存单元。
一个字节8位,两位数即一个字节,故上述共10个字节长度。
我们编程使用代码段,而CPU只认定义代码段的指令。
CPU将CS:IP指向的内存单元中的内容当作指令执行。
第一次读取 mov ax,bx 后ip+3;
第二次 读取 sub ax,ax 后ip+3;
第三次 读取 jmp ax后ip+2;
第四次 ip=ax;
共四次,ip=0;