(最详细!)汇编原理中OF(溢出)和CF(进位)的判断方法

关于这个问题百度查了半天,都没有比较全面的解释,所以我来了!

  • 首先我们需要知道,al是用两位16进制的数来保存数据的, 所以正数最多保存0~255(十进制),FFH

  • 处理器内部以补码表示有符号数,8个二进制位能够表达的整数范围是:+127 ~ -128

那么补码怎么求呢?
如下:

  • 正数的补码就是其本身

  • 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

    [+1] = [00000001]原 = [00000001]反 = [00000001]补
    
    [-1] = [10000001]原 = [11111110]反 = [11111111]补
    

一定要注意,正数的补码是他本身,我身边很多人搞不懂下面这玩意,都是因为忘了正数的补码就是本身,然后傻乎乎的用负数方法去求正数补码

例1:
3AH + 7CH=B6H
无符号数运算:58+124=182,范围内,无进位(<255)
有符号数运算: 58+124=182 ,范围外,有溢出(>127)

例2:AAH + 7CH=(1)26H
无符号数运算:170+124=294,范围外,有进位(>255)
有符号数运算:-86+124=28 ,范围内,无溢出(-128<28<127)

上面有符号运算里,58和-86不知道怎么来的同学不要急,
接着往下看:

再来说说书上的例子:
这里是王爽的《汇编语言(第三版)》P218

  • mov al,0F0H 240(十进制)
  • add al,88H 136(十进制)
  • 无符号运算:al=240+136=376>255 所以有进位,CF=1
    有符号运算:al=-16-120=-136<-128所以有溢出,OF=1
  • mov al,0F0H 240(十进制)
  • add al,78H 120(十进制)
  • 无符号运算:al=240+120=360>255 所以有进位,CF=1
    有符号运算:al=-16+120=104,-128<104<127 所以无溢出,OF=0

具体的计算过程如下:
(最详细!)汇编原理中OF(溢出)和CF(进位)的判断方法_第1张图片
看懂书上这个例子就差不多了,
然后我们再带入之前的那个例子根据步骤计算,不难得到58和-86的值

就是这么简单


你可能感兴趣的:(问题解决,补码,反汇编)