一个典型的CPU(此处讨论的不是某一具体的CPU)由运算器、控制器、寄存器(CPU工作原理)等器件构成,这些器件靠内部总线相连。
前一章所说的总线,相对于CPU内部来说是外部总线。内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系。简单地说,在CPU中:
* 运算器进行信息处理;
* 寄存器进行信息存储;
* 控制器控制各种器件进行工作;
* 内部总线连接各种器件,在它们之间进行数据的传送。
对于一个汇编程序员来说, CPU中的主要部件是寄存器。寄存器是CPU中程序员可以用指令读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制。不同的CPU,寄存器的个数、结构是不相同的。8086CPU有14个寄存器,每个寄存器有一个名称
寄存器(缓存) cpu内部信息存储单元(简单的讲是cpu中可以存储数据的器件)
一个cpu中有多个寄存器,如:8086cpu有14个寄存器
* **通用寄存器**(存放一般性数据):AX、BX、CX、DX
* **变址寄存器**:SI、DI
* **指针寄存器**:SP(栈顶指针寄存器)、BP
* **指令指针寄存器**:IP
* **段寄存器**():CS(代码段寄存器)、SS(栈段寄存器)、DS(数据段寄存器)、ES(附加段寄存器)
* **标志寄存器**:PSW
![](https://img.kancloud.cn/78/63/78634e2b463ea8650744683ff84fc4d7_513x461.png)
![](https://img.kancloud.cn/f6/60/f66099de73d6bbe889f3e70470dabcb7_579x454.png)
共性:
8086cpu所有的寄存器都是16位的,可以存放两个字节
一个16位的寄存器存储一个16位的数据
他存储的最大值为2^16-1即65536-1进制为FFFFH(H表示16进制)
例子1:
在AX中存储18D(D表示10进制)
换成16进制为12H
换成2进制为10010B(B表示2进制)
![](https://img.kancloud.cn/0a/fd/0afda877c955a94a0ea83cd6e50c9b7f_690x326.png)
例子2:
在AX中存储20000
换成16进制为4E20H
换成2进制为0100111000100000B
![](https://img.kancloud.cn/f5/a0/f5a0241fff423feadd40634320f0bd6c_557x84.png)
问题:8086上一代cpu中的寄存器都是8位的,如何保证程序的兼容性?
方案:通用的寄存器均可以分为两个独立的8位寄存器使用(细化:AX可以分为高八位AH和低八位AL)
AX的低8位(0位-7位)构成了AL寄存器,高8位(8位-15位)构成了AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器。下图展示了16位寄存器及它所分成的,两个8位寄存器的数据存储的情况。
![](https://img.kancloud.cn/14/11/141141e9106dd709434965c70337d873_545x268.png)
转成16位后4E保存在高八位,20保存在低八位
![](https://img.kancloud.cn/1a/e6/1ae6d17993d42536eb25728e2b3aeee6_568x180.png)
想一想,一个8位寄存器所能存储的数据的最大值为多少?2^8-1=255
由AX可以分为AH和AL
同理:
BX可以分为BH和BL
CX可以分为CH和CL
DX可以分为DH和DL
8086是16位cpu
8086的字长为16bit
80386的字长为32bit
![](https://img.kancloud.cn/d2/0b/d20b6fe29fc4bb4fc27b3dc9cd4bbf70_984x527.png)
![](https://img.kancloud.cn/5f/09/5f096ba7ccb9655f0cb269f03da0f6f1_676x314.png)
## **用法举例**
### **es附加段寄存器**
```
assume cs:code
code segment
mov ax,0ffffH
mov ds,ax # (ds)=ffffH
mov ax,0020H
mov es,ax # 附加段寄存器(es)=0020H
mov bx,0
mov cx,12
s:mov dl,[bx] #(ffff:0)=(dl)=EAH即(dx)=00EAH
mov es:[bx],dl #(0020:0)=00EAH
inc bx #bx累加
loop s
mov ax,4c00H
int 21H
code ends
end
```