🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
一个典型的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 ```