1、不需要左移一位。 DSP 处理器带有可选的自动左移一位的功能,消除移位操作的时间开销。定点数的除法运算除法是乘法的逆运算, 包括一系列移位和条件减法运算, 需要用除法子程序实现。 大多 数 DSP 处理器不提供单周期除法指令。如果除法运算中包含负数,应将负数变换为等值的正 数,然后作除法运算,最后加上正确的符号。下面详细分析 32位整数乘法, 32位小数乘法以及有符号 /无符号整数除法的程序指令。32位定点数乘法运算示意图32位整数乘法参考程序:; This routine multiplies two 32-bit signed integers resulting; in a 64-bit
2、 product. The operands are fetched from data memory and the result is written back to data memory. Data Storage: X1,X0 32-bit operand Y1,Y0 32-bit operand W3,W2,W1,W0 64-bit product Entry Conditions: SXM = 1 , OVM = 0.mmregsSTACK: .usect “STACK”,100h ;设置堆栈段.bss X0,1.bss X1,1.bss Y0,1.bss Y1,1.bss W0
3、,1.bss W1,1.bss W2,1.bss W3,1.def start.datatable1: .word 1.word 2table2: .word 3.word 4.textstart: STM #X0,AR2 ;将 X0的首地址存入 AR2STM #Y0,AR3 ;将 Y0的首地址存入 AR3RPT #1 ;设置重复执行两次下条指令MVPD table1,*AR2+ ;将 table1开始的两个值传给 X0MVPD table2,*AR3+ ;将 table2开始的两个值传给 Y0STM #X0,AR2 ;LD *AR2,T ; T=X0MPYU *AR3+,A ; A=无符号数
4、 X0无符号数 Y0STL A,W0 ;将 A 送入 W0LD A,-16,A ; A 值左移 16位MACSU *AR2+,*AR3-,A ; A+= Y1无符号数 X0MACSU *AR3+,*AR2,A ; A+= X1无符号数 Y0STL A,W1 ;将 A 送入 W1MAC *AR2,*AR3,A ; A+=11X Y STL A,W2 ; W2=A的低 16位STH A,W3 ; W3=A的高 16位here: B here程序分析:如原理图所示, 32位整数乘法的计算过程是将两个 32位的数 X 和 Y 各自分成 X0、 X1和 Y0、 Y1的 16位数。然后进行 X0Y0, A
5、 值左移 16位, Y1X0, X1Y0, A 值再左移 16位, X1Y1的操作。 需要注意的是在 32位乘法运算中, 实际上包括了三种乘法运算:U U 、 S U 和 S S 。 U 指无符号数, S 指带符号数。在编程时,要用到以下三条乘法指令:MACSU Xmem,Ymem,src ; 无符号数与带符号数相乘并累加 ; MPYU Smem,dst ; 无符号数相乘; MAC Xmem,Ymem,src ;两个带符号数数相乘并累加。32位小数乘法参考程序: ; This routine multiplies two Q31 signed integers resulting in a Q
6、30 product. The operands are fetched from data memory and ; the result is written back to data memory data storege: X1,X0 Q31 operand Y1,Y0 Q31 operand W1,W0 Q30 product SXM = 1 , OVM = 0 ; .mmregs .usect “STACK”,100h将 Y0的首地址存入 AR2将 table1开始的两个值传给 Y0STM #Y1,AR3 ;将 Y1的首地址存入 AR3LD #0,A ;将 A 置 0 A=X0Y1
7、 A+=X1Y0将 A 左移 16位 A+=X1Y1将结果 A 的低 16位送入 W0STH A,W1 ;将结果 A 的高 16位送入 W0小数乘法与整数乘法的程序设计大致类似,不同在于小数乘法少了 X 与 Y 的低位 相乘部分,即 X0与 Y0的相乘部分。这是因为两个整数相乘时,乘积总是“向左增长”。这 意味着多次相乘后, 乘积将会很快超出定点器件的控制范围。 但是,当两个小数相乘时,乘 积总是 “向右增长”。 这就意味着超出定点器件数据范围将是我们不感兴趣的部分, 也就是 指 X0与 Y0相乘得到的结果那部分,因此可不必计算这部分乘积。有符号 /无符号整数除法参考程序 ; Descript
8、ion: 32 bit by 16 bit Unsigned Integer Divide And Modulus 32位除 16位的无符号整数除法.bss d_NumL,1 ;为分子低 16位分配 1个单元.bss d_NumH,1 ;为分子高 16位分配 1个单元.bss d_Den,1 ;为分母分配 1个单元.bss d_QuotL,1 ;为商的低 16位分配 1个单元.bss d_QuotH,1 ;为商的高 16位分配 1个单元.bss d_Rem,1 ;.def DivModUI32DivModUI32: RSBX SXM ; sign extention mode offLD d_
9、NumH,A ;将分子高位移到累加器 ARPT #(16 1 ;重复执行下一条指令 15次SUBC d_Den,A ; A 减去分母的值STL A, d_QuotH ;将 A 的值存到商的高位XOR d_QuotH,A ; 将 A 的低 16位清零OR d_NumL,A ; AL = NumLSTL A, d_QuotL ;将 A 的值存到商的低位STH A,d_Rem ;RET STM d_NumL,AR2 ;将分子低 16位所在单元的地址传给 AR2STM d_Den,AR3 ;将分母所在单元的地址传给 AR2重复执行两次下一条指令将 table1开始的两个值传给 AR2MVPD tabl
10、e2,*AR3 ;将 table2开始的值传给 AR3CALL DivModUI32 ;调用除法子程序 16 bit by 16 bit Unsigned Integer Divide And Modulus 16位除 16位的无符号整数除法.bss d_Num,1 ;为分子分配单元为分母分配单元.bss d_Quot,1 ;为商分配单元.bss d_Rem,1.def DivModUI16 ;定义 16位除法子程序 .word 1000 .word 5DivModUI16:LD d_Num,A ;将分子移到累加器 A重复执行下面指令 16次SUBC d_Den,A ; 16次的减法循环,完成
11、除法STL A,d_Quot ;将 A 的结果保存为商STH A,d_Rem将分子低 16位所在单元的首地址传给 AR2将分子低 16位所在单元的首地址传给 AR3MVPD table1,*AR2 ;将 table1开始的值传给 AR2CALL DivModUI16 ;DSP 做除法运算时,通过减法指令与重复循环指令实现无符号除法运算。需要注 意的是,当被除数的绝对值 除数的绝对 值时,商为整数。 32 bit by 16 bit signed Integer Divide And Modulus 32位除 16位有符号除法为分子低 16位分配单元为分子高 16位分配单元为商低 16位分配单元
12、为商高 16位分配单元.def DivModI32 ;定义 32位除法子程序DivModI32: SSBX SXM ; sign extention mode onLD d_Den,16,A ;将分母移到累加器MPYA d_NumH ; B has sign of quotientABS A ;分母取绝对值STH A ,d_Rem ; d_Rem = abs(Den temporarilyLD d_NumH,16,A ;将分子高 16位移到 AADDS d_NumL,A ; A 加上分子低 16位取 A 绝对值STH A,d_QuotH ; d_QuotH = abs(NumH tempora
13、rilySTL A,d_QuotL ; d_QuotL = abs(NumLtemporarilyLD d_QuotH,A ;将商的高位移到 A重复执行下条指令 16次SUBC d_Rem,A ; 16次减法循环运算,完成除法STL A,d_QuotH ; AH = abs(QuotH ; clear ALOR d_QuotL,A ; AL = abs(NumL AL = abs(QuotL AH = RemBCD DivModI32Skip,BGEQ ; if B neg, then Quot = abs(Quot LD d_QuotH,16,A ;将商的高 16位移到 AADDS d_Qu
14、otL,A ; A 加上商的低 16位NEG A ;如果 B,则 b1b2-b1b1x1+x2=m1e +m2e e (b2-b1b1=m1+m2e e ( 。 浮点数的乘法运算 , 要经过分离指数和尾数,进行算术运算,估计结果的符号位,以及 最后的归一化存储这几个过程。 做乘法运算时要遵循乘法运算的规则把指数相加, 尾数相乘。即:12x1x2=m m e b b +(12。需要注意的是,由于 C54X 的乘法器在一个指令周期内 只能完成 17bit*17bit的二进制补码运算,故相乘运算需要分步实现。浮点数的除法运算 与乘法运算浮点数的乘法运算类似, 同样要经过分离指数和尾数, 估 计结果的
15、符号位, 对指数进行相减运算, 对尾数进行相除运算, 以及最后的归一化存储这几个过程。12x1x2=m m e b b -(12不同的是,在执行除法运算的时候,需要将除 数和被除数都由 24bit 左移成 32bit 的形式,以减少误差。不管是浮点数的加减运算还是乘除运算, 完成对操作数之间的计算后就需要对结果数进 行归一化操作。 所谓归一化操作就是把数据格式转换为第一位为符号位, 紧接着的一位是非 零的数的格式。归一化完后要再把归一化后的定点数转变为浮点数。下面来以浮点数的乘法运算为例具体分析浮点数的运算过程:设是对两个数 x1和 x2进行乘法运算。将被乘数数 x1的尾数分为 Q , R 和 S 三部分, Q 表示尾数的高位的 8bit , R 和 S 表示尾数低位的两字节。同样,乘数 x2也被分为 X , Y 和 Z 三部分, X 表示尾数的高位, Y 和 Z 表示尾数低位的两字节。于是有需要注意的是,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1