标志寄存器---汇编学习(2)

参考文章

最近主要是在学习《汇编语言》,所以就给大家讲讲《汇编语言》中的标志寄存器,这个是比较基础的东西。

标志寄存器
1.概念

标志寄存器也称作:状态寄存器(PSW),在8086cpu中标志寄存器都是16位的,而其中存储的信息被称为程序状态字(一段包含系统状态的内存或者是硬件区域)。标志寄存器既然是寄存器,那么它也是用来存储信息的,只是它存储信息的方式与其他的寄存器不同而已。其他的寄存器是一个寄存器包含一个信息,而标志寄存器则可以包含多个信息。标志寄存器之所以可以存储多个信息,是因为它的存储方式。在标志寄存器中,信息是被存储在位中的。标志寄存器中的每一个位都可以代表特定的信息。

2.构造

在这里插入图片描述

3.作用:

(1)用来存储相关指令的某些执行结果
(2)用来为cpu执行相关指令提供行为依据
(3)用来控制cpu的相关工作方式

ZF(zero flag):零标志位。判断指令执行结果是不是0。如果结果为0,就置1;不为0,就置0,用逻辑语句来说明,计算机中用1表示逻辑真,0表示逻辑假,那么就是指令执行结果为0,表示肯定,为真命题,则zf=1,反之则为逻辑假,zf=0;
举例看一下:
mov ax , 1
sub ax , 1
执行之后结果为零,则zf=1;

PF(parity flag):奇偶标志位。这个位的判断需要我们将指令执行结果转为二进制来看,如果结果的低8位中有偶数个1,就将PF的值置1;如果是奇数个1,就置0。要注意的是一定是结果的低8位。

SF(sign flag):符号标志位。既然是符号标志位,就是对有符号数据来说的。如果结果为负,就置1;结果为正,就置0。计算机通常用补码来表示有符号数据,计算机中的一个数据可以看作是有符号数,也可以看作是无符号数
比如 00000001B,看作无符号数1,或有符号数+1;
10000001B,看作无符号数129,或有符号数-127;

书上这样讲的时候,我并太清楚什么是有符号数,什么又是无符号数,所以百度一下啦!

&有符号数和无符号数

在这里插入图片描述
其实我也不清楚二进制补码,上网查了一些资料,这个之后会再写一个博客总结。

补码

补码是用来解决负数在计算机中的表示问题的。正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)。现在先给个图作为了解。
在这里插入图片描述

CF(carry flag):进位标志位。这个位是在进行无符号数运算的时候用到的。一般情况下,这个位记录了进行无符号运算的时候,运算结果的最高有效位向更高位的进位值,或从更高位的借位值。注意的是,这里的进位与借位,都是相对于二进制而言的。下面我们再找一张图来加深下理解。
在这里插入图片描述

OF(overflow flag):溢出标志位。这个位是用来判断有没有溢出的,在进行有符号数运算的时候,结果超出了机器所能表示的范围称为溢出。当OF=0时,说明没有溢出;当OF=1时,说明溢出了。机器能表示的范围:8位有符号二进制数表示范围为-128~127,16位有符号二进制数表示范围为-32768~32767,指令结果超出这个范围就是溢出了。

cpu用CF位来记录是否发生了进位,对于无符号数运算有意义,cpu用OF位来记录是否发生了溢出,对有符号数运算有意义。

AF(auxiliary flag):辅助进位标志位。这个位用的不多,所以书上也没有讲,我就简单的查了一下资料。这个位表示加减法做到一半时有没有形成进位/借位,如果有则AF=1。这么说谁都听不懂,所以我们举个例子来说下。例如 MOV AL,00001110 MOV BL,00001000 ADD AL,BL 最后结果为AL=00010110这就是低四位向高四位进位。反之在减法中第三位不够减向第四位借位(注意数位是从第0位开始数的)叫低四位向高四位借位!像前面的AL中前四位为高四位,后四位为低四位。例如,当两个字节相加时,如果从低4位向高4位有进位时,则AF=1。

TF(timer overblow flag):定时器溢出标志。这个位主要是用来在debug中进行-t指令时使用的。当cpu在执行完一条指令后,如果检测到TF位的值为1,则产生单步中断,引发中断过程。通过这个位,我们就可以在debug中对程序进行单步跟踪。

IF(interrupt flag):中断允许标志位。当IF=1时,cpu在执行完当前指令后响应中断,引发中断过程;当IF=0时,则不响应可屏蔽中断。

DF(direction flag):方向标志位。在串处理指令中,控制每次操作后,si(指向原始偏移地址)、di(指向目标偏移地址)的增减。当DF=0时,每次操作后,si、di递增;DF=1时,每次操作后,si、di递减。我们可以使用cld指令将DF的值置为0,使用std指令将DF的值置为1。DF需要与rep、movsb等指令配合使用。

我们再来看一下各个位在debug中是如何表示的:
标志 	debug(1/0)CF 	CY 	NCPF 	PE 	POAF 	AC 	NAZF 	ZR 	NZSF 	NG 	PLIF 	EI 	DIDF 	DN 	UPOF 	OV 	NV

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值