第二章 寄存器
上次我们学完了第一章,懂了一些基本的知识,今天,小吴带你们学习第二章内容寄存器。
一个典型的CPU由运算器、控制器、寄存器(CPU工作原理)等器件构成,这些器件靠总线连接,我们上一章说过这个问题。前一章说的总线,相对于CPU内部来说是外部总线。内部总线实现CPU各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系。即在CPU中,我们可以这么理解:
- 运算器进行信息处理
- 寄存器进行信息储存
- 控制器控制各种器件进行工作
- 内部总线连接各器件,在它们之间进行数据的传送
对于一个汇编程序员来说,CPU中的主要部件是集训器,我们可以通过指令来进行读写的部件。程序员可以通过改变各种寄存器的内容来实现对CPU的控制。
不同的CPU,寄存器个数、结构是不一样的。例如8086CPU中,有14个寄存器,每个寄存器的名字是唯一的:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。我们暂时不一一介绍,我们本着用到那个寄存器就介绍哪个寄存器的原则进行学习。
2.1 通用寄存器
8086CPU的寄存器都是16位的,即2个字节大小的存储空间。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器。
以AX为例,寄存器的逻辑结构如图所
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
一个16位寄存器可以存储16位二进制数据,存储情况如上图所示。
8086CPU可以将这四个通用寄存器分为两个独立的8位寄存器使用:
- AX可分为AH和AL
- BX可分为BH和BL
- CX可分为CH和CL
- DX可分为DH和DL
下面我们给出实例存储数据,分别用16位寄存器与8位寄存器做例子。
数据:2000
二进制表示:0100 1110 0010 0000
十六进制表示:4E20H
这是AX16位寄存器中存放数据2000的存储情况:
0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
这里,我们可以看出,数据在寄存器中的存放格式以二进制数存放的,之前我们有说过这个问题,现在可以理解之前为什么这么说了吗。
下图是AX寄存器分高8位AH与低8位AL存放数据的情况:
0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
MSB AH LSB MSB AL LSB
从上图我们可以看出,AH高8位寄存器中存放的数据以二进制来说是78,十六进制来说是4EH;AL低8位寄存器中存放的数据以二进制来说是32,十六进制来说是20H。看到这里,有些人人疑惑了,怎么数据不一样了?其实数据时一样的,只是表示方法不一样而已。我们首先要清楚,1个十六进制数是要用4个二进制表示,所以十六进制中最大的数也只是15,即F。为什么呢?4位二进制1111,表示的就是15。所以,上面说到的16位寄存器与两个8位寄存器存放数据的方式不一样,数据是一样的,因为这两个8位寄存器是独立的。
2.2 字在寄存器中的存储
8086CPU,出于兼容性考虑,可以一次性处理两种尺寸的数据。
- 字节:一个字节由8bit组成,可以存在8位寄存器中。
- 字:记为word,一个字由两个字节组成,这两个字节分别称为高位字节和低位字节,如下图所示:
字:0100 1110 0010 0000
左边8位是高位字节(0100 1110),右边8位是低位字节(0010 0000)
今天先到这里,明天继续。