移位除法运算(汇编)推荐文章 2010-07-27 10:44:21 阅读 508 评论 1 字号:大中小 订阅 除法运算的特点:其特点可归纳如下:①每次上商都是由心算来比较余数(被除数)和除数的大小,确定商为 1 还是 0②每做一次减法,总是保持余数不动,低位补 0,再减去右移后的除数③商符单独处理如果将上述规则完全照搬到计算机内,实现起来有一定困难,主要问题是:a.机器不能 “心算”上商,必须通过比较被除数 (或余数)和除数绝对值的大小来确定商值,即|x|-|y| ,若差为正(够减) 上商 1,差为负(不够减) 上商 0b.按照每次减法总是保持余数不动,低位补 0,再减去右移后的除数这一规则,则要求 加法器的位数必须为除数的两倍仔细分析发现,右移除数可以用左移余数的办法代替,其运算结果是一样的,但对线路结构更有利不过此刻所得到的余数不是真正的余数,只有将它乘上 2-n 才是真正的余数c.笔算求商时是从高位向低位逐位求的,而要求机器把每位商直接写到寄存器的不同位也是不可取的计算机可将每一位商直接写到寄存器的最低位,并把原来的部分商左移一位综上所述便可得原码除法运算规则2.原码除法:原码除法和原码乘法一样, 符号位是单独处理的 。
以小数为例:式中 为 x 的绝对值,记作 x*为 y 的绝对值,记作 y*即 商的符号 由两数符号位“异或”运算求得,商值由两数绝对值相除(x*/y*)求得小数定点除法对被除数和除数有一定的约束,即必须满足下列条件:0< |被除数|≤| 除数|(这样结果才能为小数)实现除法运算时,还应避免除数为 0 或被除数为 0前者结果为无限大,不能用机器的有限位数表示;后者结果总是 0,这个除法操作等于白做,浪费了机器时间至于商的位数一般与操作数的位数相同原码除法中由于对余数的处理不同,又可分为恢复余数法和不恢复余数法(加减交替法) 两种1)恢复余数法 恢复余数 法的特点是: 当余数为负时,需加上除数,将其恢复成原来的余数 然后再执行左移一位后减去除数的运算)由上所述,商值的确定是通过比较被除数和除数的绝对值大小,即 x*-y*实现的, 而计算机内只设加法器, 故需将 x*-y*操作变为[x*]补+[-y*]补的操作例:已知:x=-0.1011,y=-0.1101,求:[x÷y] 原解:由 x*=0.1011,[x]原=1.1011y*=0.1101,[-y]补=1.0011,[y]原=1.1101商值的求解过程如下:被除数(余数) 商 说 明0.1011+ 1.00110.0000 +[-y*]补(减去除数)1.1110+ 0.11010 余数为负,上商 0恢复余数+[y*]补0.10111.0110+ 1.00110 被恢复的被除数← 1 位+[-y*]补(减去除数)0.10011.0010+ 1.00110101余数为正,上商 1← 1 位+[-y*]补(减去除数)0.01010.1010+1.0011011011余数为正,上商 1← 1 位+[-y*]补(减去除数)1.1101+ 0.11010110 余数为负,上商 0恢复余数+[y*]补0.10101.0100+ 1.00110110 被恢复的被除数← 1 位+[-y*]补(减去除数)0.0111 01101 余数为正,上商 1故商值为 0.1101商的符号位为 由此可见,共上商 5 次,第一次上的商在商的整数位上,这对小数除法而言,可用它作溢出判断。
即当该位为“1” 时,表示此除法为溢出,不能进行,应由程序进行处理;当该位为“0”时,说明除法合法,可以进行在恢复余数法中,每当余数为负时,都需恢复余数,这便延长了机器除法的时间,操作也很不规则,对线路结构不利加减交替法可克服这些缺点2)加减交替法加减交替法又称不恢复余数法,可以认为它是恢复余数法的一种改进算法问题:余数为负时,怎样实现恢复余数的操作?答案:把余数加上除数即可分析原码恢复余数法得知:(X*为被除数 X 的绝对值,Y* 为除数 Y 的绝对值 )当 余数 Ri>0 时,可上商 “1”,再对 Ri 左移一位后减除数,即 2Ri-y*当余数 Ri0 时,商上 “1”,做 2Ri-y*的运算;当余数 Ri0 时,商上 “1”,做 2Ri-y*的运算;(原码运算参考)当余数 Ri<0 时,商上 “0”,做 2Ri+y*的运算如果对商的精度没有特殊要求,一般可采用“末位恒置 1”法,这种方法操作简单,易于实现,而且最大误差仅为 2-n例:已知:x=-0.1001, y=+0.1101 求: [x÷y]补解:[x]补=1.0111,[y]补=0.1101,[-y]补=1.0011运算过程如下:被除数(余数)商上商说 明1.0111+ 0.11010.0000[x]补与[y]补异号,+[y]补0.01000.1000+ 1.001111[R]补与[y]补同号,上商 1← 1 位+[-y]补1.10111.0110+ 0.11011010[R]补与[y]补异号,上商 0← 1 位+[y]补0.00110.0110+ 1.0011101101[R]补与[y]补同号,上商 1← 1 位+[-y]补1.10011.00101010[R]补与[y]补异号,上商 010101 ← 1 位 ,末位商恒置“1”所以[x÷y]补=1.0101补充说明几点:①图中未画出补码除法溢出判断的内容;②按流程图所示,多作一次加(或减) 法,其实末位恒置“1”前,只需移位不必作加 (或减)法;⑨与原码除一样,图中均未指出对 0 进行检测,实际上在除法运算前,先检测被除数和除数是否为 0,若被除数为 0,结果即为 0;若除数为 0,结果为无穷大,这两种情况都无需继续作除法运算;④为了节省时间,上商和移位操作可以同时进行。