8086数据寄存器介绍

通用寄存器

在 8086 CPU 中,通用寄存器有 8 个,分别是 AX,BX,CX,DX,SP,BP,SI,DI 

下面介绍这几个通用寄存器:

数据寄存器(AX,BX,CX,DX):

数据寄存器有 AX,BX,CX,DX 四个组成,

由于在 8086 之前的 CPU 为 8 位 CPU,所以为了兼容以前的 8 位程序,在 8086 CPU 中,每一个数据寄存器都可以当做两个单独的寄存器来使用,由此,每一个 16 位寄存器就可以当做 2 个独立的 8 位寄存器来使用了 。

AX 寄存器可以分为两个独立的 8 位的 AH 和 AL 寄存器;

BX 寄存器可以分为两个独立的 8 位的 BH 和 BL 寄存器;

CX 寄存器可以分为两个独立的 8 位的 CH 和 CL 寄存器;

DX 寄存器可以分为两个独立的 8 位的 DH 和 DL 寄存器;

除了上面 4 个数据寄存器以外,其他寄存器均不可以分为两个独立的 8 位寄存器 ;

注意在上面标志中的“独立”二字,这两个字表明 AH 和 AL 作为 8 位寄存器使用时,可以看做它们是互不相关的,也就是看做两个完全没有联系的寄存器 X 和 Y 即可,比如指令   MOV   AH , 12H ,CPU 在执行时根本就不会知道 AL 中是什么鬼东西,因为它只认识  AH 。

下面给出一幅 16 位数据寄存器的结构图:

表示 16 位 寄存器 AX 可以表示成两个 8 位寄存器,

其中 AH 表示高位的 8 位寄存器,AL 表示低位的 8 位寄存器 。

image

AX 寄存器:

如上所说,AX 的另外一个名字叫做累加寄存器或者简称为累加器,其可以分为 2 个独立的 8 位寄存器 AH 和 AL;

在写汇编程序时,AX 寄存器可以说是使用率最高的寄存器(不过,总共才那么 14 个寄存器,哪一个不经常使用咯?),既然 AX 是数据寄存器的话,那么理所当然,其可以用来存放普通的数据,由于其是 16 位寄存器,自然也就可以存放 16 位数据,但是因为其又可以分为 2 个独立的 8 位寄存器 AH 和 AL ,所以,在 AH 和 AL 中又可以独立的存放 2 个 8 位的数据,可以有以下代码(即将 AX 当做普通的寄存器使用,即可以用来暂存数据):

MOV AX,1234H	       ;向寄存器 AX 传入数据 1234H
MOV AH,56H	       ;向寄存器 AX 的高 8 位寄存器 AH 中传入数据 56H
MOV AL,78H		;向寄存器 AX 的低 8 位寄存器 AL 中传入数据 78H
3 条语句的执行过程如下:
 
  

而既然 AX 又被称作为累加器,自然其还有一点点特殊的地方的:

AX 寄存器还具有的特殊用途是在使用 DIV 和 MUL 指令时使用,DIV 在 8086 CPU 中是除法指令,而在使用除法的时候有两种情况,即除数可以是 8 位或者是 16 位的,而且除数可以存放在寄存器中或者是内存单元中,而至于被除数的话,自然,应该由 AX 来代替了,当除数是 8 位时,被除数一定会是 16 位的,并且默认是放在 AX 寄存器中,而当除数是 16 位时,被除数一定是 32 位的,因为 AX 是 16 位寄存器,自然,放不下 32 位的被除数,所以,在这里还需要使用另一个 16 位寄存器 DX ,其中 DX 存放 32 位的被除数的高 16 位,而 AX 则存放 32 位的被除数的低 16 位,同时,AX 的作用还不仅仅是用来保存被除数的,当除法指令执行完成以后,如果除数是 8 位的,则在 AL 中会保存此次除法操作的商,而在 AH 中则会保存此次除法操作的余数,当然,如果除数是 16 位的话,则 AX 中会保存本次除法操作的商,而 DX 则保存本次除法操作的余数。

上面介绍的是 AX 寄存器在除法操作中的应用,下面还需要介绍一下 AX 在乘法操作中的应用,

当使用 MUL 做乘法运算时,两个相乘的数要么都是 8 位,要么都是 16 位,如果两个相乘的数都是 8 位的话,则一个默认是放在 AL 中,而另一个 8 位的乘数则位于其他的寄存器或者说是内存字节单元中,而如果两个相乘的数都是 16 位的话,则一个默认存放在 AX 中,另一个 16 位的则是位于 16 的寄存器中或者是某个内存字单元中。

同时,当 MUL 指令执行完毕后,如果是 8 位的乘法运算,则默认乘法运算的结果是保存在 AX 中,而如果是 16 位的乘法运算的话,则默认乘法运算的结果有 32 位,其中,高位默认保存在 DX 中,而低位则默认保存在 AX 中。

AX 寄存器在 DIV  指令中的使用:

MOV DX,0H		;设置 32 位被除数的高 16 位为 0H
MOV AX,8H		;设置 32 位被除数的低 16 位为 8H
MOV BX,2H		;设置 16 位除数为 2H
DIV BX		       ;执行计算
4 条语句的执行过程如下:

image

AX 寄存器在 MUL  指令中的使用:

MOV AX,800H		;设置 16 位乘数为 800H
MOV BX,100H		;设置 16 位乘数为 100H
MOV DX,0H		;清空用来保存乘法结果的高 16 位    
MUL BX		       ;执行计算
4 条语句的执行过程如下:

image

       
BX 寄存器:

首先可以明确的是,BX 作为数据寄存器,表明其是可以暂存一般的数据的,即在某种程度上,它和 AX 可以暂存一般性数据的功能是一样的,其同样为了适应以前的 8 位 CPU ,而可以将 BX 当做两个独立的 8 位寄存器使用,即有 BH 和 BL,除了暂存一般性数据的功能外,BX 作为通用寄存器的一种,BX 主要还是用于其专属功能 – 寻址(寻址物理内存地址)上,BX 寄存器中存放的数据一般是用来作为偏移地址使用的。

在 8086 CPU 中,CPU 是根据 <段地址:偏移地址> 来进行寻址操作的,而 BX 中存放的数据表示的是偏移地址的话,自然,便可以通过 <段地址:[BX]> 的方式来完成寻址操作了。

为了介绍 BX 在寻址当中的作用,下面我给出一副示意图:

image

上面的示意图表示:可以令 BX = 2,然后通过 DS : [BX] 来访问到内存中段地址为 DS,且偏移量为 2 的内存单元了。

上面介绍的这种寻址方式是 BX 在寻址中最最简单的应用了,而对于稍微复杂的寻址方式,

还可以依赖于 SI,DI,BP 等寄存器来一起完成。

BX 寄存器在寻址中的使用:

MOV BX,5H
MOV AH,11H
MOV AH,[BX]		;设置 AX 的值为偏移地址为 BX 中的值时所代表的内存单元
3 条语句的执行过程如下:

image

从上图可以看出,在偏移地址为 5 时的内存单元中的数据位 BBH,

image

而从这幅图上面就可以看出,确实通过 [BX] 找到了偏移地址为 5 处的内存单元,并且将内存单元移入了 AH 中。

              

CX 寄存器:

CX 寄存器作为数据寄存器的一种呢,其同样具有和 AX,BX 一样的特点,即可以暂存一般性的数据,同时还可以将其当做两个独立的 8 位寄存器使用,即有 CH 和 CL 两个 8 位寄存器,当然,CX 也是有其专门的用途的,CX 中的 C 被翻译为 Counting 也就是计数器的功能,当在汇编指令中使用循环 LOOP 指令时,可以通过 CX 来指定需要循环的次数,而 CPU 在每一次执行 LOOP 指令的时候,都会做两件事:

一件就是令 CX = CX – 1,即令 CX 计数器自动减去 1;

还有一件就是判断 CX 中的值,如果 CX 中的值为 0 则会跳出循环,而继续执行循环下面的指令,当然如果 CX 中的值不为 0 ,则会继续执行循环中所指定的指令 。

CX 寄存器在循环中的使用(输出 5 个白底蓝字的 A):

MOV AX,0B800H
MOV DS,AX		;使用 80x25 彩色字符模式,内存地址 0xB8000 - 0xBFFFFF
MOV BX,0		;从 0xB8000 开始
MOV CX,5H		;循环 5 次
MOV DX,41H		;A 的16 进制为 41H
MOV AX,01110001B	;显示白底蓝字
s:  MOV [BX],DX	;显示 ASCII 字符
    ADD BX,1
    MOV [BX],AX	;设置字符显示属性
    ADD BX,1
LOOP s
语句的执行过程如下:

image

              

DX 寄存器:

DX 寄存器作为数据寄存器的一种,同样具有和 AX,BX,CX 一样的特点,即可以暂存一般性的数据,同时还可以将其当做两个独立的 8 位寄存器使用,极有 DH 和 DL,同时,DX 作为一个通用寄存器的话,关于 DX 在其他方面的用途,当在使用 DIV 指令进行除法运算时,如果除数为 16 位时,被除数将会是 32 位,而被除数的高 16 位就是存放在 DX 中,而且执行完 DIV 指令后,本次除法运算所产生的余数将会保存在 DX 中,同时,在执行 MUL 指令时,如果两个相乘的数都是 16 位的话,那么相乘后产生的结果显然需要 32 位来保存,而这 32 位的结果的高 16 位就是存放在 DX 寄存器中 。

DX 寄存器在 DIV  指令中的使用(即 2293812 / 256 = 8960  余数为 52):

MOV DX,0023H	;32 位被除数的高 16 位
MOV AX,0034H	;32 位被除数的低 16 位
MOV BX,100H	;16 的除数
DIV BX  
语句的执行过程如下:

image
可以看到在语句结束以后,AX = 2300H  即十进制的 8960,而 DX = 34H即十进制的 52 和我们的结果是一致的。

你可能感兴趣的:(微机原理)