汇编网首页登录博客注册
release_lag的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
文章收藏
友情链接

[2009-12-30 16:34] OF值的判断方法

怎样判断OF的值是0还是1?
根据书本知识,如果有符号数在进行算数运算或者逻辑运算时,发生了溢出,则OF=1
          反之如果有符号数在进行算数运算或者逻辑运算时,没有发生溢出,则OF=0
如何直观的来判断,是否溢出?
我们可以这样理解,如果运算得不到正确结果,则溢出,如果能得到正确结果,则没有溢出
举例:
Mov al,80h
Add al,80h
首先看结果,运行后,al=0H,如果把数据当作是有符号数时,80h是-128的补码,两个-128之和就是-256,与结果0不符,我们就说有符号数在运算时发生溢出,OF=1
再来研究下,有符号数与无符号数
同一个数据,80h,当作无符号数进行运算的时候,我们当做128
                当作有符号数进行运算的时候,我们当做负128
再看一个数据
0ffh
这个数据,当作无符号数进行运算时,我们就当做255
          当作有符号数进行运算时,我们就当做-1
问题产生了?
80H是-128的补码
            0ffH是-1的补码
这到底是怎么换过来的呢?
以8位数据为例
1的二进制式是0000 0001
-1的补码就是把1的二进制按位取反后加1
0000 00001按位取反就是1111 1110
再加1就是:1111 1111
1111 1111转成十六进制就是0ffh
所以,-1的补码就是0FFh
如果我们看到一个数是0FEh,我们要知道它是什么数的补码怎么办?
把0FEh的二进制数减1,再按位取反就得到了
 0FEh的二进制数是1111 1110
 减1就得到1111 1101
 再按位取反就是0000 0010
 0000 0010就是十进制数2
那么0FEh就是-2的补码
同理FD就是-3的补码
还是以8位数据为例
-128至-1的补码就是:0ffh至80H
今后,在8位数据进行有符号运算的时候,只要看到是80h~0FFh之间的数据,我们就知道这是负数的补码
那79H呢?79H被当作有符号数进行运算的时候,代表+79
因为79的最高位是0,所以当作+79
——
<*<*><*><*><*><*>*<*>*<*>*<*>*<*>*<*>*<*>*<*><><->

接下来,我们总结一条规律
以8位数据为例
Mov al,80H
Add al,30H
这时,一眼就看出OF=0,为什么,因为我知道这个运算不会溢出
那我来解释一下
80H被当作有符号数进行运算时,是-128.也就是一个负数
30H被当作有符号数进行运算时,是+48,也就是一个正数
一个负数加一个正数,他们的值不会超过范围:-128至127(注意,我们以8位数据为例)
再看一个例子
Mov al,0f0h
Add al,88H
这时,就要用到计算器,先算出结果0f0H+88H等于178h,因为al是8位寄存器,所以al=78H
我们知道0F0H和88H在被当作有符号数进行运算时,他们的值都是负数,那么一个负数加上一个负数,正确结果应该是一个负数
但是结果78H,却是一个正数
所以,这个运算没有得到正确结果,也就是发生了溢出,OF=1
再看最后一个例子
Mov al,0f0h
Add al,78h
在进行有符号运算时,0F0是负数,78是正数
所以,OF=0,即运算不会溢出
======================================
======================================
说了这么多,我们要记住的只有两个知识点(只以8位数据为例)
第一点,        我们要记住:补码用十六进制表示的时候,范围是0ffh~80H
第二点,        在进行有符号运算时,一个正数与一个负数相加,其结果不会溢出,即OF=0
如果是同符号相加时,要看结果而定
评论次数(1)  |  浏览次数(1522)  |  类型(默认类型) |  收藏此文  | 

[  scuzg   发表于  2009-12-31 12:01  ]

补码溢出判断是汇编语言学习的一个难点,我也曾希望从原理到方法上讲清楚这样事情:
http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=19481&kindLevel=1&kindId=34937&postId=39398&readSg=1
希望有机会和博主讨论。

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码