问题描述
- 求解答如何判断OF标志位
-
1,两个负数相与如何判断?
2,两个同号的数相加如何判断?
3,两个异号的数相加如何判断?
解决方案
简单来说,比如8位数表示范围是-128~127
不管什么数相加还是相减,你先把二进制转换为10进制,然后人为计算,结果在这个范围之外,OF=1,否则OF=0
注意,负数转换为十进制,前面加上负号,符号位以外取反+1
解决方案二:
先要理解负数在内存中是2'补码存储的,也就是正数的二进位码取反加1得到。举个栗子:
8-bit数值+8,和 -8相加:
+8 0000 1000
- 8 1111 1000 <= +1<1111 0111<=+8取反
+---------------
= 0000 0000
参考《VirtualNES虚拟红白机》The force: Forth 语言部分 http://blog.csdn.net/winsenjiansbomber/article/details/50747947
负数和正数的运算都是加法器的运算,这种情况下,如果P>|N|就会产生溢出。
两个同号的数相加如果值超出范围OF=1。
两个负数相与就是两个的与运算,如果结果为0那么 ZF=0。
解决方案三:
先要理解负数在内存中是2'补码存储的,也就是正数的二进位码取反加1得到。举个栗子:
8-bit数值+8,和 -8相加:
+8 0000 1000
-8 1111 1000 <= +1<1111 0111<=+8取反
+---------------
= 0000 0000
参考《VirtualNES虚拟红白机》The force: Forth 语言部分 http://blog.csdn.net/winsenjiansbomber/article/details/50747947
负数和正数的运算都是加法器的运算,这种情况下,如果P>|N|就会产生溢出。
两个同号的数相加如果值超出范围OF=1。
两个负数相与就是两个的与运算,如果结果为0那么 ZF=0。
解决方案四:
“负数和正数的运算都是加法器的运算,这种情况下,如果P>|N|就会产生溢出。”这个描述有问题,进位不等于于溢出,负数与正数相加是典型的情况,经常出现高位有进位,却没有溢出。
解决方案五:
谢谢解答,我查到的答案,OR、AND指令影响标志位PF、SF、ZF,使CF=0、OF=0