标志寄存器和程序状态寄存器(标志寄存器)

2022-09-04 00:00:10   编辑:扶坚香
导读很多朋友对标志寄存器和程序状态寄存器,标志寄存器还不了解,今天小绿就为大家解答一下。二进制(201)寄存器(1529)首先标志寄存器的概念。...

很多朋友对标志寄存器和程序状态寄存器,标志寄存器还不了解,今天小绿就为大家解答一下。

二进制(201)寄存器(1529)首先标志寄存器的概念。在8086cpu中标志寄存器都是16位,其中存储的信息称为程序状态字(包含系统状态的一段内存或硬件区域)。标志寄存器既然是寄存器,也是用来存储信息的,但是存储信息的方式和其他寄存器不一样。其他寄存器是一个寄存器包含一个报文,而标志寄存器可以包含多个报文。并且标志寄存器由于其存储方式,可以存储多种信息。在标志寄存器中,信息以位存储。标志寄存器中的每一位可以代表特定的信息。

这是我在网上找到的标志寄存器的原理图。从这张图我们可以知道哪些是用的,哪些是不用的。我就不细说了。接下来,我们来看看这些位的具体含义。

CF(进位标志):进位标志位。该位用于无符号数运算。一般来说,当执行无符号运算时,该位记录运算结果的最高有效位到高位的进位值或从高位的借位值。注意,这里的进位和借位是相对于二进制的。我们再找一张图加深理解。

PF(奇偶校验标志):奇偶校验标志位。这个位的判断需要我们把结果变成二进制。如果结果的低8位中有偶数个1,则将PF的值设置为1;如果是奇数个1,则将其设置为0。注意,它必须是结果的低8位。

PF的第2位,奇偶标志位和flag记录相关指令执行后所有位中1的个数是否为偶数,如果是,PF=1;如果是奇数,PF=0。

执行

mov al,00000000b

添加al,00000111b

mov al,00000000b

添加al,00000011b

验证:

AF(辅助标志):辅助进位标志位。这个位用的不多,书上也没提,我就简单查了一下资料。该位表示当加法和减法进行到一半时,是否形成进位/借位。如果是,AF=1。这个没人能理解,那就举个例子吧。例如MOV AL,00001110 MOV BL,00001000 ADD AL,BL。最终结果是AL=00010110,是从低四位到高四位的进位。相反,在减法中,第三位数不足以从第四位数借位(注意位数从第0位数开始),这叫从低四位数向上四位数借位!和前面的AL一样,前四位是高四位,后四位是低四位。例如,当两个字节相加时,如果有一个从低4位到高4位的进位,则AF=1。

ZF(零标志):零标志位。这个位非常简单,可以判断结果是否为0。如果结果为0,则将其设置为1;如果不为0,则设置为0。

执行

移动轴,1

子轴,1

移动轴,2

子轴,1

可以看出,当计算出的ax结果为0时,ZF为ZR=1;当结果为1(非0)时,ZF为NZ=0。

SF(符号标志):符号标志位。因为它是一个符号位,所以它用于有符号的数据。如果结果是否定的,将其设置为1;如果结果为正,则设置为0。

SF,符号标志位,标志的第7位,记录相关指令执行后结果是否为负,如果是,SF=1;如果不是负数,SF=0。

执行:

10000001b

添加al,1

10000000美元

添加al,01111111b

验证:

当SF=1为NG时,意味着如果指令执行带符号数运算,结果将为负。

当SF=0为PL时,意味着如果指令执行有符号数运算,结果为非负。

TF(定时器溢出标志):定时器溢出标志。该位主要用于调试中的-t指令。当cpu执行完一条指令,如果检测到TF位的值为1,就会产生单步中断,触发中断进程。有了这个位,我们可以在调试中一步跟踪程序。

IF(中断标志):中断使能标志位。当IF=1时,cpu执行完当前指令后响应中断,引起中断进程;当IF=0时,不响应可屏蔽中断。

DF(方向标志):方向标志位。在字符串处理指令中,si(指向原始偏移地址)和di(指向目标偏移地址)的增加或减少在每次操作之后被控制。当DF=0时,si和di在每次运算后增加;当DF=1时,si和di在每次操作后下降。我们可以使用cld指令将DF的值设置为0,使用std指令将DF的值设置为1。DF需要和rep、movsb等指令一起使用。

OF(溢出标志):溢出标志位。该位用于确定是否存在溢出。注意溢出的概念只针对有符号数据,就像进位只针对无符号数据一样。当OF=0时,没有溢出;当OF=1时,表示溢出。

的,溢出标志位,标志的第11位,超出机器能表示的范围称为溢出。如果发生溢出,OF=1,如果没有,OF=0。

例如,对于8位有符号数据,机器表示的范围是-128 ~ 127;对于16位有符号数据,范围为-32768~32767。

执行:

mov al,64岁

加铝,64

mov al,63岁

加铝,64

验证:

下面有几个字符串转移指令。

格式:movsb

功能:执行movsb指令相当于以下步骤。

1) ((es)*16 (di))=((ds)*16 (si))

2)如果df=0,(si)=(si) 1 (di)=(di) 1

如果df=1,(si)=(si)-1 (di)=(di)-1

当然也可以发一句话。

格式:movsw

功能:将ds:si指向的存储单元中的字送入es:di,然后根据bit标志寄存器df的值将si和di递增或递减2。

Movsb和movsw是字符串传输操作中的一个步骤。一般来说,movsb和movsw都是和rep一起使用的,格式如下:

代表movsb

Rep函数:根据cx的值,重复执行以下串行传输指令。因为每次执行movsb指令si和di,都会递增或递减到下一个单元或上一个单元,所以rep movsb可以循环实现(cx)字符的传输。

8086CPU提供以下两条指令来设置df位。

Cld指令:将标志寄存器的测向位置设置为0

标准指令:将df位置1设置为标志寄存器

1)编程,用字符串传递指令,将数据段中的第一个字符串复制到后面的空格中。

数据段

欢迎来到masm!

db 16 dup (0)

数据结束

代码段

移动轴,数据

移动ds,ax

mov si,0

移动,斧

莫夫迪,16岁

mov cx,16

中央生活区

代表movsb

代码结束

目标

2)编程,用字符串传递指令,将F000段最后16个字符复制到数据段。

数据段

db 16 dup (0)

数据结束

代码段

mov ax,0f000h

移动ds,ax

mov si,0ffffh

移动轴,数据

移动,斧

莫夫迪,15岁

mov cx,16

标准

代表movsb

代码结束

目标

以上问题已解答完毕,如果想要了解更多内容,请关注本站

免责声明:本文由用户上传,如有侵权请联系删除!

猜你喜欢

最新文章