标志寄存器就是一个寄存器,它有16位。 其他的寄存器都是整个寄存器具有一个含义,而flag(标志寄存器)是按位起作用的,也就是说它的每一位都有专门的含义。 标志寄存器的有些位不使用,也不具有任何含义。
在8086的指令集中,有的指令的执行是影响标志寄存器的,它们大多是运算指令(进行逻辑或算术运算);有的指令的执行对标志寄存器没有影响,它们大多是传送指令。
本文参考博文 汇编语言标志位介绍
对以下6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。
zero,零标志位。 记录相关指令执行后,结果是否为0。 若为0,则ZF为1,否则为0。 可用于判断运算结果是否为0。
CF用来反应是否产生进位或借位。 如果运算结果的最高位产生了一个进位或借位,那么其值为1,否则其值为0 (注意不管是进位还是借位,都是1!不存在正负的问题,就都是1)
这个进位需要理解一下,在计算机中,运算实际上都是二进制的运算。 10010010 +11100000 —————— 这就是两个8位二进制相加的样子 那么两个二进制相加,要么没有进位,要么进位只能是1!
你想想你做十进制的加法的时候,进位最大也就是9了吧,你遇到过进位是10的情况吗?没有吧。 减法也是一样。 因此加减法产生的进位或者借位在CF里都记录为1。 还有一点,你要搞明白这个进位是干什么用的。 因为8086做加法时可能是8位与8位相加,也可能是16位和16位相加。 如果是8位和8位相加,那么产生的进位要记录下来。 如果是16位和16位相加,可以类比为 12 +29 ———— 12中1相当于高8位,2相当于低8位。 27中2相当于高8位,9相当于低8位。 计算这个算式是小学数学,我们都知道要先计算2+9,再计算1+2+(2+9产生的进位) 同样的,计算机中16位和16位相加,两个后8位产生的进位要参与两个前8位相加的运算。因此后八位的进位要被记录下来,这个记录就是用CF。 所以实际上不存在你想的CF应该分正负的问题,正负是运算本来就定好的,你本来就知道的。做减法算高位的时候要减CF,做加法算高位的时候要加CF。
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0: (1)在字操作时,发生低字节向高字节进位或借位时; (2)在字节操作时,发生低4位向高4位进位或借位时。
CF是最高位向上的进位(如果是字节,最高位就是第7位,如果是字,最高位就是第15位) AF是半进位,表示低3位向第4位的进位,用AF主要处理BCD码运算时的调整。 也就是AF是中间的进位。
然后AF咱们用的很少,所以你也不要深究。
奇偶标志PF用于反应运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0.
利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。 在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。 补码有很多好处,求负数的补码是取反再加一。使用补码,计算机所有的运算都可以用加法来实现。 补码的最高位也是符号位,也是0代表正,1代表负
SF标志位在王爽老师《汇编语言》P215也有阐述。 计算机中的数据都用补码来表示,所以给你两个数,你可以当成有符号数来运算,也可以当成无符号数来运算。 如果当成无符号数来运算,运算也会影响SF标志位的值。但是SF标志位对咱们没意义,所以怎么影响的,影响的结果是什么咱们都不管。 如果当成有符号数来运算,那么
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。
也就是我们可以通过SF来得知结果的正负。 参考回答SF的0和1 参考回答溢出时的SF和OF
是这样的,溢出是溢出,正负号是正负号,溢出是我们算出来的数超出了这个数的位数能表示的范围,这就是溢出。 无符号数的溢出就是进位,所以我们一般不说无符号数溢出,但这可以帮助你理解。 即使溢出了,SF依然是表示结果的正负号,依然是和最高位相同的。 说实在的SF和OF,正负和溢出实在是搭不上什么关系。 但是你就是犯迷糊啊,所以实在不行你就都转换成十进制,看看结果到底是正还是负,这就是SF的工作,记录结果的正负。而这个结果是不是8位或16位或……表示不了的,是溢出位OF的事。
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
“溢出”和“进位”是两个不同含义的概念,不要混淆。 溢出就是超出表示范围,其实也没什么好混淆的。 比如8位2进制数 如果视为无符号数,则表示范围为0~255 如果视为有符号数,则 8位二进制原码的表示范围:-127~+127 8位二进制反码的表示范围:-127~+127 8位二进制补码的表示范围:-128~+127 所以8位二进制如果表示无符号数,是表示不了256的,如果计算结果出现了256,8位二进制表示不了了,就会溢出。
无符号数的溢出就是进位,所以我们一般不说无符号数溢出,但这可以帮助你理解。 无符号位——进位 有符号位——溢出 看一个溢出的例子:
1000 0000 0000 0000-1=0111 1111 1111 1111 正数减一变成负数了,这很明显是溢出了!
中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下: (1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
总之它只能屏蔽可屏蔽终端,不可屏蔽中断不归它管。 CPU的指令系统中也有专门的指令来改变标志位IF的值。
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向,即方向是增地址或减地址在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。 DF=0时串操作为增地址方式; DF=1时串操作为减地址方式
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。