3. 寄存器
寄存器
一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。相对于CPU内部来说是外部总线。内部总线是实现CPU内部各个器件址线的联系。
- 简单地说,在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这4个寄存器通常来存放一般性的数据,被称为通用寄存器。
- 以AX为例,寄存器的逻辑结构如下图:
- 为了保证与上一代CPU中的寄存器(8位)兼容,8086CPU的AX、BX、CX、DX这4个寄存器都可以分为两个可独立使用的8位寄存器来用:
在寄存器中的存储:8086CPU可以一次性处理以下两种尺寸的数据
字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中
字:记为word,一个字由两个字节组成,分别称为字的高位字节和地位字节
如下图所示的一个字型数据20000,存在AX寄存器中,在AH中存储了高8位,在AL中存储了低8位。这个数据既可以看作是一个字型数据,也可以看作是两个字节型数据,它们的大小分别是78和32。
- 常用的汇编指令及语法描述:在写一条汇编指令或一个寄存器的名称时不区分大小写
- 例如下图所述的讲BX中的数据送入AX中的时候,BX中的值不会清空。
现在如果AX寄存器中的值为8226H,BX为8226H,add ax,bx那么ax中的值为?
相加后的值为1044CH,但是ax为16位寄存器,只能存放4位十六进制的数据,所以最高位的1不能放在ax中保存,ax中的数据为:044CH
寄存器运算
执行mov ax,001AH & mov bx,0026H
执行 add al,bl那么此时ax寄存器的值为?
- 首先al和bl是指ax和bx寄存器中的低位字节,也就是16位长度的后8位,那么1AH和26H转换成二进制也不过8位,其实就是计算1AH+26H=40H
接着执行 add ah,bl 那么此时ax寄存器中的值为?
- 语法的意思是,把bx中的低位bl加到ax中的高位中:bl = 26H ah = 0H,相加ah = 26H,那么ax = ‘ah’ + ‘al’ = 2640H
续执行 add bh,al 那么此时bx寄存器中的值为?
- 把ax低位值加到bh高位值:al = 40H bh = 00H,那么相加得bh = 40H,bx = 2640H
- 问题:在ax低位al字节加上93H的话,相加所得的值为:158H,但是al为8位寄存器,只能存放两位十六进制的数据,所以最高位的1丢失,ax中的数据为:0058H。这里所谓的丢失是指进制位值不能在8位寄存器中保存,但CPU并不是真正丢弃这个进制位。
我们有一点需要注意的是,此时的al是作为一个独立的8位寄存器来使用的,和ah没有关系,cpu在执行这条指令时认为ah和al是两个不相关的寄存器。但在执行add ax,93H时候CPU会认为只有一个16位寄存器ax,进行16位运算所以我们在进行数据传输或运算时,要注意指令的两个操作对象的位数应当是一致的。例如mov ax,bl 或者 mov bh,ax , add al,100H都是错误的指令。
最多使用4条指令,编程计算2的4次方: mov ax,2|add ax,ax |add ax,ax|add ax,ax