汇编学习[进位与溢出][转]

 8进制表示0 ~ 255 一共256个数 补码表示256个数 其中除正负零外可以表示255个有符号位

处理器内部以补码表示有符号数,8个二进制位能够表达的整数范围是:+127 ~ -128,16位表达的范围是:+32767 ~ -32768.如果运算结果超出了这个范围,就是产生了溢出,有溢出,说明有符号数的运算结果不正确

例如:
3AH + 7CH=B6H,就是58 + 124=182,已经超出-128 ~ 127范围,产生溢出,所以OF = 1;另一方面,补码B6H表达真值是-74,显然运算结果也不正确。

        溢出标志OF和进位标志CF是两个意义不同的标志.进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。
请看例子

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

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

        处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF。

        应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。

        判断运算结果是否溢出有一个简单的规则:只有当两个相同符号数相加,而运算结果的符号与原数据符号相反时,产生溢出;异号不会溢出。

     溢出与进位是针对加法而言,在计算机里,减法会被转化为加法来进行运算
         x-y         =>         x+(-y)         =>          x+~y+1
         5-3         =>         5+(-3)         =>         0000 0101 + 1111 1100 + 1 = 0000 0010
         0000 0101:5 的补码
         1111 1100:-3的反码,加1后变成 -3 的补码
         1111 1101:在计算机里,-3 就是这样表示的
溢出
         当要判断运算是否溢出时,cpu 总是把寄存器里面的数据当成 有 符号数来处理
         正数和负数相加不会溢出
         两个正数相加,如果结果为负数(符号位为 1),表明发生溢出
         两个负数相加,如果结果为正数(符号位为 0),表明发生溢出
   进位
         当要判断运算是否进位时,cpu 总是把寄存器里面的数据当成是无符号数来处理
         将两个寄存器的内容相加,如果两个数的最高位都为0,则不论结果的最高位是什么都不会进位
         如果两个数的最高位都为1,则不论结果的最高位是什么都一定会进位,
         如果两个数的最高位不相同,而结果的最高位却是0,那么一定是产生了进位,反之则是未进位

posted @ 2013-02-23 02:54  Bug Man  阅读(1186)  评论(0)    收藏  举报