单片机程序状态字PSW的OV位到底是怎么判断溢出的?

如题所述

D2位OV是判断溢出的标志。

在单片机中状态寄存器PSW是一个用了比较多的寄存器,除了D1位空着外,其它的7位都要使用,其中D7位Cy,是进(借)位,当做加法或减法时,进位标志和借位标志都是由它来表示.

当位和位之间相互传送时也不能少了它,必须要经它中转.D6位Ac位是辅助进位标志,当做加法或减法时由第四位向第五位进位或借位时,它会被置1.它也用于十进制调整(DA A).

D5位是用户标志位,当程序因某种原因"跑偏"后,用户可以用它来标志程序该从哪儿开始执行.不重复已经执行过的指令.

D4、D3位合在一块儿,指明工作寄存器的组别,这主要用于比较复杂一些的程序,R0组寄存器不够用的情况下用到R1、R2、R3组的寄存器时要用到这二位。

怎么判断正负吧。就是C位。考虑溢出-128-1单片机的计算方法为先把1和128用补码表示为11111111b和10000000b。相加得,01111111b=127正数C=0溢出0V=1,-128<1;127-(-1)表示为01111111b加00000001b=10000000b负数C=1溢出0V=1,127>-1;我也是刚看到。原来OV就是为有符号设计的当数寄存器值小于-127或大于128时候置位。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-09-26

首先,要知道,什么是溢出?

一般来说,容器太小,盛不下了,就会溢出。

在计算机方面,溢出,就是数据太大,超出了预定的范围。

数字,在计算机中,都是用机器码代表的。

人们最常用的“自然数”和“整数”,其表达范围如下:

机器码,无论代表什么数字,只要运算结果超出预定范围,就是【溢出】。

但是,在计算机专业人的嘴里,就不一样了。

 【无符号数的溢出】,不叫溢出,要叫做【进位】。

 【带符号数的溢出】,才叫做【溢出】。

搞计算机的这些人,基本概念不清,却自命不凡!

冒充脑回路清奇。。。正常人对此,就只能无语了。

---------------------------

那么,就按照计算机专业的说法吧:

  溢出,是指“补码运算结果超出范围”。

  溢出的特征,是“符号错误”。

知道了这些,判断是否溢出,就很容易了。

CPU 每次做完运算,就会给出结果和“进位标志位 CY”和“溢出标志位 OV”。

如果 OV=1,就代表:刚刚做的计算,发生了溢出。

人工判断是否溢出,有如下六个方法。

一、无符号数的运算,肯定不会溢出。只有进位。

二、只有:正+正、负+负,才有可能超出范围。不是这些,就绝不会溢出。

三、人工用十进制数值计算。和,如果没有超出范围,就没有溢出。

四、人工用二进制补码计算。和的符号,如果正确,就没有溢出。

五、编个程序,让计算机计算。然后观察溢出标志位,为零,就没有溢出。

六、人工用补码计算,如“最高位的进位”和“次高位的进位”相同,就没有溢出。

第六种,本是 CPU 的硬件所用的方法。

硬件,其理论基础,是很晦涩难懂的。

异或运算,一般也不需要初学者掌握。

但是,一些爱得瑟的老师,偏爱介绍这种方法。

却又拿不出任何的理论!

其实,这是很无聊的表现,就是想着难为学生。

第2个回答  2017-12-30
CY位是累加器的进位、借位标志。下文的叙述按16位机来举例说明,如果是8位机或其它字长,则可换一个例子,但道理相似。

对于无符号数的运算,CY位就可以表示其是否溢出。但如果是有符号数,则不能按CY标志来判断了。为此,设了另一个标志OV,其含义就是“假如是有符号数运算,是否出现了溢出”。

例如对于16位运算器,65534 + 3,(即二进制的1111111111111110 + 0000000000000011),
本该得65537,(即二进制的10000000000000001),但因为寄存器只有16位,最高位的那个1丢掉了(进入了CY标志)。结果寄存器中只剩下了1,(即二进制的0000000000000001)。

此时,我们可以说,16位的无符号数加法,65534+3溢出了,溢出后的答案成了1。

但是对于有符号整数,情况就不同了。有符号整数采用补码表示法。16位有符号整数不可能表示65534,此时如果机内二进制是1111111111111110,程序中认为它是-2,故:
机内的二进制的1111111111111110 + 0000000000000011,代表的是(-2) + 3。

请注意,此时的(-2)+3和上文的无符号数65534+3,在CPU的运算器硬件上完全相同,都是得到和为1,而CY标志也为1。

但是,有符号数(-2)+3=1并无溢出。故此时的CY标志不能代表它溢出了。

另外再举一例:
无符号数32763 + 8 = 32771,没有进位,CY标志为0。此时并不溢出。
但是,如果是有符号数32763 + 8,这就是溢出了,因为32773的二进制为1000000000000011,作为有符号数会被看成负数-32765。16位有符号数不可能表示32773的。

不管是有符号数还是无符号数,CPU的二进制运算器机器加、减操作是一样的,但其“溢出”的条件不同。
现在大多数的计算机中,如果是无符号数,都可以用CY标志来判断其是否溢出;而如果是有符号数,则需要用OV标志来判断其是否溢出。

至于OV标志在逻辑上又是根据什么产生的呢?则不同的计算机上有不同的实现方法,但效果都是一样。
这里介绍一种道理比较容易懂的方法:“双符号位法”。具体是:
作加、减法前,先将两个运算数都按照有符号数的规则扩充成17位。即:符号位是0的前面添一位0,符号位是1的前面添一位1。
然后按17位的机器加、减,得出17位的结果。
如果17位结果的高两位(即双符号位)不同,就置OV标志为1,否则,OV标志为零。
然后取其低16位作为最后结果。本回答被网友采纳
相似回答