一文了解8086CPU寄存器的特点和作用

 2024-01-18 02:04:53  阅读 0

8086数据寄存器介绍

通用寄存器

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

下面介绍一下这些通用寄存器:

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

数据寄存器由四部分组成:AX、BX、CX、DX。

由于8086之前的CPU是8位CPU,为了兼容以前的8位程序,每个数据寄存器可以作为两个独立的寄存器。 因此,每个16位寄存器可以作为2个独立的8位寄存器使用。

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

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

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

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

除上述四个数据寄存器外,其他寄存器不能分为两个独立的8位寄存器;

注意上面标志中的“独立”两个字。 这两个字表示当AH和AL作为8位寄存器使用时,可以将它们视为互不相关,即可以将它们视为两个完全不相关的寄存器X和Y,例如指令MOVAH ,12H,CPU在执行的时候不会知道AL里到底是什么东西,因为它只知道AH。

下面是16位数据寄存器的结构图:

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

AH 代表高位 8 位寄存器,AL 代表低位 8 位寄存器。

AX寄存器:

如上所述,AX的另一个名称是累加寄存器或简称累加器,它可以分为两个独立的8位寄存器AH和AL;

在编写汇编程序时,AX寄存器可以说是使用频率最高的寄存器(不过总共只有14个寄存器,哪一个使用得不频繁呢?)。 既然AX是数据寄存器,那么它当然可以用来存储普通数据,因为它是16位寄存器,自然可以存储16位数据,但是因为它可以分为两个独立的8位寄存器AH和AL,AH和AL中可以独立存储。 两个8位数据可以有如下代码(即使用AX作为普通寄存器,可以用来临时存储数据):

莫瓦克斯,1234H; 传送数据1234H到寄存器AX

莫瓦赫,56H; 传送数据56H到寄存器AX的高8位寄存器AH

移动,78H; 将数据78H传送到寄存器AX的低8位寄存器AL

三个语句的执行过程如下:

而由于 AX 也被称为累加器,它自然有一些特殊之处:

使用 DIV 和 MUL 指令时,AX 寄存器还有特殊用途。 DIV 是除法指令。 使用除法时,有两种情况,即除数可以是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,另一个默认放入AL。 8 位乘法器位于其他寄存器或内存字节单元中。 如果两个相乘数都是 16 位,则默认将一个存储在 AX 中,另一个 16 位位于 16 寄存器或某个内存字单元中。

同时,执行MUL指令后,如果是8位乘法运算,则默认乘法运算结果存放在AX中,如果是16位乘法运算,则默认乘法运算结果为32位,其中 ,高位默认保存在 DX 中,低位默认保存在 AX 中。

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

MOVDX,0H; 设置32位被除数的高16位为0H

莫瓦克斯,8H; 设置32位被除数的低16位为8H

MOVBX,2H; 将16位除数设置为2H

DIVBX;执行计算

四个语句的执行过程如下:

说明标志寄存器的作用_举例说明8086标志寄存器fr的功能_举例说明8086标志寄存器fr的功能

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

莫瓦克斯,800H; 设置16位乘法器为800H

MOVBX,100H; 设置16位乘法器为100H

MOVDX,0H; 清除用于保存乘法结果的高16位

穆尔布克斯; 执行计算

BX寄存器:

首先明确BX作为数据寄存器,表明它可以暂时存储通用数据。 也就是说,在一定程度上,它具有与AX相同的功能,可以临时存储通用数据。 它也是为了适应之前的8位CPU而设计的,BX可以作为两个独立的8位寄存器,即BH和BL。 BX除了暂时存储通用数据的功能外,还是一种通用寄存器,BX主要用于其专用功能。 – 在寻址(寻址物理内存地址)时,一般将BX寄存器中存储的数据作为偏移地址。

中,CPU是根据“段地址:偏移地址”来进行寻址操作的,如果BX中存储的数据代表的是偏移地址,那么自然就可以通过“段地址:[BX]”来完成寻址操作。

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

举例说明8086标志寄存器fr的功能_举例说明8086标志寄存器fr的功能_说明标志寄存器的作用

上图所示:可以设置BX=2,然后使用DS:[BX]来访问内存中间地址DS、偏移量为2的内存单元。

上面介绍的寻址方法是BX在寻址中最简单的应用。 对于稍微复杂的寻址方法,

也可以依靠SI、DI、BP等寄存器来共同完成。

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

MOVBX,5H

莫瓦,11点

莫瓦,[BX]; 将AX的值设置为BX中的值的偏移地址表示的内存单元

三个语句的执行过程如下:

举例说明8086标志寄存器fr的功能_说明标志寄存器的作用_举例说明8086标志寄存器fr的功能

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

举例说明8086标志寄存器fr的功能_说明标志寄存器的作用_举例说明8086标志寄存器fr的功能

从这张图可以看出,确实通过[BX]找到了偏移地址5处的内存单元,并将该内存单元移入了AH。

CX寄存器:

作为数据寄存器的一类,CX寄存器也具有与AX、BX相同的特点,即可以临时存储通用数据,同时也可以作为两个独立的8位寄存器,即CH和CL使用。 两个8位寄存器。 当然,CX也有其特殊的用途。 CX中的C翻译为计数器的功能。 在汇编指令中使用循环LOOP指令时,可以使用CX来指定所需的循环次数。 ,CPU每次执行LOOP指令时都会做两件事:

一是设置CX=CX–1,即让CX计数器自动减1;

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

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

莫瓦克斯,

MOVDS、AX; 采用80x25彩色字符模式,内存地址-

MOVBX,0; 从一开始

MOVCX,5H; 循环5次

MOVDX,41H; A的十六进制值为41H

莫瓦克斯,; 在白色背景上显示蓝色字符

s:MOV[BX]、DX; 显示 ASCII 字符

添加数据库X,1

MOV [BX],AX; 设置字符显示属性

添加数据库X,1

循环

该语句的执行过程如下:

举例说明8086标志寄存器fr的功能_说明标志寄存器的作用_举例说明8086标志寄存器fr的功能

DX寄存器:

作为数据寄存器的一类,DX寄存器也具有与AX、BX、CX相同的特点,即可以临时存储通用数据,也可以作为两个独立的8位寄存器使用,如DH和DL。 同时,如果DX作为通用寄存器使用,关于DX在其他方面的使用,使用DIV指令进行除法运算时,如果除数为16位,则被除数为32位,则被除数为32位。被除数的高16位存放在DX中,执行DIV指令后,本次除法运算产生的余数将存放在DX中。 同时,在执行MUL指令时,如果两个相乘的数都是16位,那么乘法得到的结果显然需要32位来保存,32位结果的高16位存储在DX 寄存器。

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

MOVDX,0023H; 32位被除数的高16位

莫瓦克斯,0034H; 32 位被除数的低 16 位

MOVBX,100H; 16的除数

DIVBX

该语句的执行过程如下:

举例说明8086标志寄存器fr的功能_说明标志寄存器的作用_举例说明8086标志寄存器fr的功能

可以看到,语句结束后,AX=2300H 十进制为 8960,DX=34H 十进制为 52,与我们的结果一致。

各种寄存器的特点及用途

8086有14个16位寄存器。 这14个寄存器根据用途可以分为4类:通用寄存器、指令指针、标志寄存器和段寄存器。

1. 通用寄存器

共有8个通用寄存器,可分为2组。 一组是数据寄存器(4),另一组是指针寄存器和索引寄存器(4)。

数据寄存器分为:

AH&AL=AX():累加寄存器,常用于运算; 它被指定用于存储乘法和除法等指令中的操作数。 此外,所有 I/O 指令都使用该寄存器将数据传输到外部设备。

BH&BL=BX(base):基地址寄存器,常用于地址索引;

CH&CL=CX(count):计数寄存器,常用于计数; 通常用于保存计算值,例如用作移位指令、循环和字符串处理指令中的隐式计数器。

DH&DL=DX(数据):数据寄存器,常用于数据传输。 它们的特点是这四个16位寄存器可分为高八位:AH、BH、CH、DH。 低八位:AL、BL、CL、DL。 这两组8位寄存器可以单独寻址并独立使用。

另一组是指针寄存器和索引寄存器,包括:

SP():堆栈指针,与SS配合使用,可以指向当前堆栈位置;

BP():基址指针寄存器,可作为SS的相对基地址位置;

SI():源索引寄存器,可用于存储相对于DS段的源索引指针;

DI():目标索引寄存器,可用于存储相对于ES段的目标索引指针。

这四个16位寄存器只能进行基于16位的访问操作。 它们主要用来构成操作数的地址,用于在堆栈操作和索引操作中计算操作数的有效地址。

2.指令指针IP()

指令指针IP是一个16位的特殊寄存器,它指向当前需要检索的指令字节。 当BIU从内存中检索一个指令字节时,IP自动加1并指向下一个指令字节。 注意,IP指向指令地址的段内地址偏移量,也称为偏移地址()或有效地址(EA,)。

3. 标志寄存器FR()

8086有一个18位标志寄存器FR。 FR中有9位有意义的位,其中6位是状态位,3位是控制位。

OF:溢出标志位OF用于反映有符号加减运算结果是否溢出。 如果运算结果超出了当前操作数个数所能表示的范围,则称为溢出,OF的值被置1。否则,OF的值被清0。

DF:方向标志DF位用于确定执行字符串操作指令时指针寄存器调整的方向。

IF:中断允许标志 IF 位用于确定 CPU 是否响应 CPU 外部可屏蔽中断发出的中断请求。 但无论该标志的值如何,CPU都必须响应CPU外部不可屏蔽中断发出的中断请求,以及CPU内部产生的中断请求。 具体规定如下:

(1)当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;

(2) 当IF=0时,CPU不响应CPU外部可屏蔽中断发出的中断请求。

TF:跟踪标志 TF。 该标志可用于程序调试。 TF 标志没有专门的指令来设置或清除。

(1) 若TF=1,CPU 处于指令单步执行模式。 此时,每条指令执行完毕后,都会显示CPU中各寄存器的当前值以及CPU下一条要执行的指令。

(2) 若TF=0,则为连续工作模式。

SF:符号标志SF用于反映运算结果的符号位,与运算结果的最高位相同。 在微机系统中,有符号数采用补码表示,因此SF也反映了运算结果的符号。 当运算结果为正数时,SF的值为0,否则为1。

ZF:零标志ZF用于反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时可以使用该标志。

AF:辅助进位标志AF在下列情况下置1,否则置0:

(1)字操作过程中,从低字节到高字节发生进位或借位时;

(2) 字节操作期间,从低 4 位到高 4 位发生进位或借位。

PF:奇偶校验标志PF用于反映运算结果中“1”个数的奇偶校验。 如果“1”的个数为偶数,则PF的值为1,否则为0。

CF:进位标志CF主要用于反映运算产生进位还是借位。 如果运算结果的最高位产生进位或借位,则其值为 1,否则其值为 0。)

4. 段寄存器()

为了充分利用所有的内存空间,8086专门设置了四个段寄存器来保存段地址:

CS():代码段寄存器;

DS():数据段寄存器;

SS():堆栈段寄存器;

ES():附加段寄存器。

当程序要执行时,需要确定程序代码、数据和堆栈要使用哪些内存位置,并设置段寄存器CS、DS和SS指向这些起始位置。 通常DS是固定的,CS根据需要进行修改。 因此,在可寻址空间小于64K的情况下,程序可以写入任意大小。 因此,程序及其数据的总大小限制为 DS 所示的 64K。 这就是为什么 COM 文件不能大于 64K 的原因。 8086以内存为战场,注册为军事基地,加快工作速度。

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码