首页 > 编程知识 正文

简述段寄存器的概念,标志寄存器flags

时间:2023-05-04 20:49:26 阅读:120287 作者:2066

首先谈标志寄存器的概念。 在8086cpu中,标志寄存器都是16位,其中存储的信息称为程序状态字。 这是包含系统状态的内存或硬件区域。 既然标志是寄存器,就用于存储信息,只是信息的存储方法与其他寄存器不同。 其它寄存器在一个寄存器中可以包括一个信息,并且标志寄存器可以包括多个信息。 标志寄存器之所以能够存储多个信息,是因为其存储方式。 标志寄存器中,信息保存在位中。 标志寄存器的每一位可以表示特定的信息。

这是我在网上找的标志寄存器的图像。 在这张照片中,可以知道在标志寄存器中,使用了哪个,没有使用哪个。 我不解释。 接下来,让我们来看看这些位的具体含义。

货币标志(cf ) :进位标志位。 这个位在进行无符号数的运算时使用。 一般来说,该比特在进行无符号运算时,记录运算结果的从最高位比特到最高位比特的进位值,或者从最高位比特开始的借位值。 请注意。 这里的进位和借位是对二进制进行的。 试着再找一张图来加深理解。

奇偶校验标志(pf ) :奇偶校验标志的位。 要确定此位,必须尝试将结果转换为二进制。 如果结果的后8位中有偶数个1,则将PF的值设为1。 如果是奇数个1,则设置0。 我想注意的是,肯定是结果的后8位。

执行了PF、奇偶校验位、flag第2比特的记录相关指令的结果,所有比特中的1的个数是否为偶数,如果为偶数则PF=1; 奇数时,PF=0。

中选择所需的墙类型

mov al,00000000b

add al,00000111b

mov al,00000000b

add al,00000011b

验证:

辅助标志(af ) :进位辅助标志位。 因为这个不怎么用,所以书上也没有,所以很容易就查了资料。 该比特表示加减运算为一半时是否形成进位/借位,如果有,则AF=1。 这么说谁也听不懂,举个例子吧。 例如,MOV AL、00001110 MOV BL、00001000 ADD AL、BL最终成为AL=00010110,这是从低位4位到高位4位的进位。 相反,减法中第三位不足以减少对第四位的借。 (请注意,位数从第0位开始计数。 )被称为从后4位到前4位的借。 像前面的AL那样,前4位是前4位,后4位是后4位。 例如,如果将2个字节相加,则如果从低位4位进位到高位4位,则AF=1。

ZF(zeroflag ) :零标志位。 这很简单。 判断结果是否为0。 结果为0时,置1; 如果不是0,则设置0。

中选择所需的墙类型

mov ax,1

sub ax,1

mov ax,2

sub ax,1

可知ax的计算结果为0时,ZF为ZR=1; 如果结果为1 (不是0 ),则ZF为NZ=0。

符号标志(SF ) :符号标记位。 既然是符号标记位,就对有符号数据来说。 结果为负时,置1; 结果为正,为0。

SF、符号标志位、flag第7位,执行记录相关指令后,其结果是否为负,如果为负,则SF=1; 非负时,SF=0。

执行:

mov al,10000001b

add al,1

mov al,10000000b

add al,01111111b

验证:

SF=1时为NG,表示指令进行带符号数的运算后结果为负

在SF=0为PL情况下,表示如果指令进行带符号数的运算,则结果为非负

时间溢出标志(TF ) :计时器溢出标志。 此位主要用于在debug中执行-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时,表示溢出。

OF、溢出标志、flag的第11个,超过设备能够表示的范围的情况称为OF=1,没有的情况称为OF=0

例如,对于8位带符号数据,机器能够显示的范围为-128~127; 在16位带符号数据的情况下,范围为-32768~32767

执行:

mov al,64

add al,64

mov al,63

add al,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中,然后根据标志寄存器df位的值,将si和di递增2或递减2.

movsb和movsw进行的是串传送操作中的一个步骤,一般来说,movsb和movsw都和rep配合使用,格式如下:

rep movsb

rep功能:根据cx的值,重复执行后面的串传送指令。由于每执行一次movsb指令si和di都会递增或递减指向后一个单元或前一个单元,则rep movsb就可以循环实现(cx)个字符的传送。

8086CPU提供下面两条指令对df位进行设置。

cld指令: 将标志寄存器的df位置0

std指令: 将标志寄存器的df位置1

1)编程,用串传送指令,将data段中的第一个字符串复制到它后面的空间中。

data segment

db ‘welcome to masm!’

db 16 dup (0)

data ends

code segment

mov ax,data

mov ds,ax

mov si, 0

mov es,ax

mov di,16

mov cx,16

cld

rep movsb

code ends

end

2)编程,用串传送指令,将F000段中的最后16个字符复制到data段中。

data segment

db 16 dup (0)

data ends

code segment

mov ax,0f000h

mov ds,ax

mov si, 0ffffh

mov ax,data

mov es,ax

mov di, 15

mov cx, 16

std

rep movsb

code ends

end

打开APP阅读更多精彩内容

点击阅读全文

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。