实现乘法运算的方法较多,归纳起来不外乎两种方法:一是软件方法,一是硬件方法。软件方法就是利用机器的基本指令编写子程序,当需要作乘法运算时,通过调用子程序实现,这种方法一般在低档小型机和微型机中采用。硬件方法则是在功能较强的机器中使用,有的以加法为核心,实现乘法运算的硬件组织,在速度快、功能强的大中型机器中,还专门设置了多位阵列乘法器部件,也就是说乘法运算完全是由硬件实现的。这一节主要讨论硬件方法,即以加法器为核心来实现乘法运算,以及阵列乘法器件,讨论乘法运算规则、算法流程及硬件实现。
1.原码一位乘法
由于原码的数值部分与真值相同,所以考虑原码一位乘法的运算规则和运算方法时,可以从手算中得到一些启发。二进制乘法与十进制乘法十分相似,手算过程似乎比机器内部计算还要简单一些。
例如:x=+0.1101,y=-0.1011,求x×y=?
由于异号相乘,所以x×y=-0.10001111。
计算过程与十进制一样,也是从乘数的最低位开始,一位一位地向左与被乘数相乘,乘积是由两个因素决定的:乘积的数值和符号,对这两个因素要分别处理。由此可以知道,从手算到机器实现,应该有以下几个问题要解决:
(1)乘积的符号问题。对于原码乘法来说,由于符号位与尾数是分别处理的,所以乘积的符号应是同号相乘为正,异号相乘为负,这个逻辑实现很容易。
假设被乘数x=xf.x1x2x3…xn,乘数y=yf.y1y2y3…yn,xf,yf分别是两个操作数的符号,Sf是乘积结果的数符,那么Sf=xf
yf,即xf,yf相异时,Sf=1,为负;xf,yf相同时,Sf=0为正。
(2)位权对齐的问题。因为乘积的符号是单独处理的,所以乘积的数值可以由被乘数与乘数的绝对值之积求得,即|S|=|X|×|Y|。
通过手算的计算过程,乘数从右向左每进一位,得到的部分积也会向左移一位,这时就需要更多位的寄存器来存储乘法计算过程中得到的部分积。
(3)乘数的位数问题。若干个部分积一起相加,比较困难,而且会出现有的部分积是0,却仍要占一个操作数的位置,由于机器中已有两个操作数相加的加法器,故应充分利用已有的部件,将几位乘法转化为几次累加、移位来实现。即从右向左每次处理一位乘数,每求得一个部分积,就立即累加,部分积的初值为0,累加后,部分积右移一位,等待新的部分积算出后,再累加,直到乘数最高位,累加后得最后结果。这样将原来的部分积右移一位,就可以使原部分积中不需要累加的一位右移,而不参加加法运算,这样也就不需要增加加法器的位数了。