果为20000000(十进制的
22025)。再如,temp10ccdH(十进制的01),temp20599aH(十进制的07),两数相
乘后B寄存器的内容为08f5f0a4H(十进制的007000549323857)。如果仅保存结果的高16位08f5H(十进制的006997680664063)。有时为了提高精度,可以使用RND或使用MPYR指令对低16位做四舍五入的处理。
(6)实现16定点整数除法
在C54X中没有提供专门的除法指令,一般有两种方法来完成除法。一种是用乘法来代替,除以某个数相当于乘以其倒数,所以先求出其倒数,然后相乘。这种方法对于除以常数特别适用。另一种方法是使用SUBC指令,重复16次减法完成除法运算。下面我们以temp1temp2为例,说明如何使用SUBC指令实现整数除法。其中变量temp1为被除数,temp2为除数,结果即商存放在变量temp3中。在完成整数除法时,先判断结果的符号。方法是将两数相乘,保存A或B的高16位以便判断结果的符号。然后只做两个正数的除法,最后修正结果的符号。为了实现两个数相除,先将被除数装入A或B的低16位,接着重复执行SUBC指令,用除数重复减16次后,除法运算的商在累加器的低16位,余数在高16位。详细代
f
码如下:
ldmpyldabsstlldabsrptsubcbcd
stlsthxorsubstldiv_e
d
temp1T;将被除数装入T寄存器
temp2A;除数与被除数相乘,结果放入A寄存器
temp2B;将除数temp2装入B寄存器的低16位
B
;求绝对值
Btemp2;将B寄存器的低16位存回temp2
temp1B;将被除数temp1装入B寄存器的低16位
B
;求绝对值
15
;重复SUBC指令16次
temp2b;使用SUBC指令完成除法运算
div_e
dagt;延时跳转,先执行下面两条指令,然后判断A,若A0,则
;跳转到标号div_e
d,结束除法运算
Bquot_i
;将商(B寄存器的低16位)存入变量quot_i
Bremai
_i;将余数(B寄存器的高16位)存入变量remai
_i
B
;若两数相乘的结果为负,则商也应为负。先将B寄存器清0
quot_iB
;将商反号
Bquot_i
;存回变量quot_i中
上面给出的是整数除法的通用程序,在实际应用中可以根据具体情况做简化。如正数除法可以直接将被除数temp1装入B寄存器的低16位,然后用SUBC指令循环减除数temp2,减完后B寄存器中低16位为商,高16位为余数,不用判断符号,从而节省时间。例如temp110H(十进制的16),temp25,两数相除后商为3(在B寄存器的低16位),余数为1(在B寄存器的高16位)。
(7)实现16定点小数除法
在C54X中实现16位的小数除法与前面的整数除法基本一致,也是使用循环的SUBC指令来完成。但有两点需要注意:第一,r